פורסם 2010 בפברואר 715 שנים שלום לכולם, אני מתכנת דיי הרבה עם PHP ו-SQL ויצא לי לאחרונהלהתעמק על SQL Injection חוץ מהעובדה שזה מעניין זה גם חיונילאתר שאני בונה. הכנתי דף כניסה לעמוד ניהול אשר מבקש מהמשתמששם משתמש וסיסמא, על האתר לא שמתי שום הגנה (שתבדוק אם המשתמש הכניס תווים חוקים בלבד)בכדי לבדוק אם אני מצליח בעצמי להישתמש בידע שרכשתי - הינה שורות הקוד שבה השאילתה רצה: $query = "SELECT user FROM user_pass WHERE(user='".$user."' AND pass='".$enc_pass."' AND user_group='".$user_group."')"; $result = mysql_query($query) or die(mysql_error()); //Select our database (used to compare the user name and password database). המשתנה $user הוא בעצם המחרוזת שהוכנסה לתיבת הטקסט הראשונה והמשתנה enc_pass הוא הסיסמא לאחר שעברה דרך הפונקצייה md5.בפני המשתמש העמוד שמוצב הוא פשוט טופס עם שתי תיבות טקסט, הראשונה היא שם משתמש והשנייה היא הסיסמא.ניסתי לבצע את הדבר הבא בכדי לבדוק אם אני יכול לקבל גישה ולהיכנס לעמוד:בתיבת הטקסט של שם המשתמש הכנסתי את הדבר הבא:' OR 'a'='a' --לאחר שלחצתי על כפתור הכניסה הופיעה לי הודעת השגיאה הרגילה שכתבתי (שם המשתמש והסיסמא אינם קיימים).בעיקרון אם הבנתי נכון השאילתה שתרוץ אחרי הכנסת המידע לתיבה תיהיה הבאה:SELECT user FROM user_pass WHERE(user='' OR 'a'='a' --' AND pass='".$enc_pass."' AND user_group='".$user_group."')אציין כי לא שמתי אף הגנה על הדף, והשאילתה אם אני לא טועה אמורה לרוץ.ניסתי לשים גרש אחד בלבד (לפי מה שהבנתי אמורה להיתרחש שגיאה) אך עדיין לא קרה כלום, האם עשיתי משהו לא נכון?
פורסם 2010 בפברואר 715 שנים הסוגריים שאחרי ה-where לא נחוצים. יכול להיות שזה גורם לשגיאת SQL? (כי ה"--" גורם לכך שמתעלמים משאר השאילתה, ולכן אין סגירה לסוגריים האלה).
פורסם 2010 בפברואר 715 שנים מחבר הסוגריים שאחרי ה-where לא נחוצים. יכול להיות שזה גורם לשגיאת SQL? (כי ה"--" גורם לכך שמתעלמים משאר השאילתה, ולכן אין סגירה לסוגריים האלה).שלום מצטער אם הסברתי את עצמי לא נכון, אבל התכוונתי שלא מתרחשת שגיאה (ולפי מדריכים שונים שקראתי דפים שלא מוגנים אמורים ליצור שגיאה כאשר מקלידים " ' " (גרש יחיד) אך פשוט בדף מופיע הודעה כי השם משתמש והסיסמא לא קיימים.שוב אציין זאת ואני מצטער אם לא הייתי מדוייק - הדף שכתבתי לא מוגן ולכן לפי המחרוזת שהכנסתי אני אמור לקבל גישה (מפני ששינתי את השאילתה בכדי לבדוק אם אני מצליח להיכנס בעזרת SQL Injection) - אך ה"פריצה" לא עבדה ופשוט הופיעה ההודעה הרגילה שמכניסים משתמש וסיסמא לא נכונים. ולכן אני מעוניין לדעת למה, ומה לא עשיתי נכון.
פורסם 2010 בפברואר 715 שנים הבנתי שלא מתרחשת שגיאה, אבל יכול להיות שמסיבה אחרת כלשהי השאילתא לא מחזירה תוצאות.תנסה להדפיס את השאילתא במקום לבצע אותה, ולראות מה אמור להיות מבוצע, ולנסות להבין למה זה לא קורה.אם הכנסת גרש יחיד בשם המשתמש, מה קרה?
פורסם 2010 בפברואר 715 שנים מחבר הבנתי שלא מתרחשת שגיאה, אבל יכול להיות שמסיבה אחרת כלשהי השאילתא לא מחזירה תוצאות.תנסה להדפיס את השאילתא במקום לבצע אותה, ולראות מה אמור להיות מבוצע, ולנסות להבין למה זה לא קורה.אם הכנסת גרש יחיד בשם המשתמש, מה קרה?כאשר הכנסתי גרש יחיד פשוט מאוד נאמר לי כי השם משתמש והסיסמא אינם קיימים (ההודעה הרגילה כאשר המשתמש מכניס שם משתמש או סיסמא לא נכונים) במקום הודעת שגיאה מה-SQL כמו שמצופה.ומה ז"א להדפיס את השאילתה במקום לבצע אותה?עריכה: הינה ההדפס של השאילתה:SELECT user FROM user_pass WHERE(user='\' OR \'a\'=\'a\' --' AND pass='d41d8cd98f00b204e9800998ecf8427e' AND user_group='1')SELECT user FROM user_pass WHERE(user='\' OR \'a\'=\'a\' --' AND pass='d41d8cd98f00b204e9800998ecf8427e' AND user_group='2') ניראה כי נוספים סלאשים, אבל מהי הסיבה אם לא אני הקשתי אותם?
פורסם 2010 בפברואר 715 שנים זה אומר שנעשה escaping, שזה בדיוק אומר שהאתר מוגן. סיכוי שיש איפשהו בקוד שלך קריאה לפונקציה addslashes?(מומלץ שאפילו תעלה את הקוד המלא)
פורסם 2010 בפברואר 715 שנים מחבר בעיקרון לא הוספתי את הפונקצייה הזו ולא חשבתי על אף הגנה מהסוג הזה כי רק אתמול התחלתי להיתעמק בזהולהבין כמה חורים יש לי בקוד אך עדיין לא הצלחתי בעצמי להיכנס כמנהל בלי משתמש וסיסמא נכונים (ייתכן כי השרת עצמו מזהה את זה וחוסם את זה?).הינה הקוד המלא:<?phpsession_cache_limiter("nocache");session_start();include('config.php');if (!isset($user_group)) $user_group = 0;function CheckUserPass($user,$pass,&$user_group){ $enc_pass = md5($pass); //Encrypt our password to match the encrypted password in the database] do { $query = "SELECT user FROM user_pass WHERE(user='".$user."' AND pass='".$enc_pass."' AND user_group='".$user_group."')"; echo $query; $result = mysql_query($query) or die(mysql_error()); //Select our database (used to compare the user name and password database). if (mysql_num_rows($result)==1) return true; } while(++$user_group <= 2); return false;}function CheckSession(){ if (isset($_SESSION['auth_user']) && isset($_SESSION['auth_pass']) && isset($_SESSION['auth_group'])) return true; return false;}if (CheckSession() == false) //If there is no session, show the user and password screen{ $verify = CheckUserPass($_POST['user'],$_POST['pass'],$user_group); if ($verify == true) //If the logon was correct, put the session and reload the page { $_SESSION['auth_user'] = $_POST['user']; $_SESSION['auth_pass'] = $_POST['pass']; $_SESSION['auth_group'] = $user_group; header("Location: ".$_SERVER['PHP_SELF']); } else //If incorrect login or not set, show the login form { ?> <html> <body> <center> <table> <form method="POST"> <tr align="center"><td colspan="2"><h1>User Login</h1></td></tr> <tr><td colspan="2">User logon is required:</td></tr> <tr><td>Username:</td><td><input type="TEXT" name="user" size="32" maxlength="50"></td></tr> <tr><td>Password:</td><td><input type="PASSWORD" name="pass" size="32" maxlength="32"></td></tr> <tr align="center"><td colspan="2"><input type="submit" name="login" value="Submit"></td></tr> </form> </table> </center> </body> </html> <? } if (isset($_POST['login'])) //If the user tried to login and we got so far, the username or password are incorrect echo "<center>Incorrect username or password or user does not have permission to view this page!</center>"; exit(); //Don't let the user to see the continue of the page, block the users from accessing it}elseif (CheckUserPass($_SESSION['auth_user'],$_SESSION['auth_pass'],$user_group) == false){ echo "<center>You don't have the permission to view this page!</center>"; exit();}if (isset($_GET['logout'])) //If the user wants to log out{session_unregister('auth_user');session_unregister('auth_pass');session_unregister('auth_group');header("Location: ".$_SERVER['PHP_SELF']);}mysql_close();?>
פורסם 2010 בפברואר 1615 שנים PHP עושה את ה escape לבד, הברירת מחדל היא לעשות escape עבור כל מידע שמגיע מ cookies, GET, POST.http://www.php.net/manual/en/info.configuration.php#ini.magic-quotes-gpc
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.