עבור לתוכן

התחלתי להיתעמק ב-SQL Injection, כמה שאלות

Featured Replies

פורסם

שלום לכולם, אני מתכנת דיי הרבה עם 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."')

אציין כי לא שמתי אף הגנה על הדף, והשאילתה אם אני לא טועה אמורה לרוץ.

ניסתי לשים גרש אחד בלבד (לפי מה שהבנתי אמורה להיתרחש שגיאה) אך עדיין לא קרה כלום, האם עשיתי משהו לא נכון?

פורסם

הסוגריים שאחרי ה-where לא נחוצים. יכול להיות שזה גורם לשגיאת SQL? (כי ה"--" גורם לכך שמתעלמים משאר השאילתה, ולכן אין סגירה לסוגריים האלה).

פורסם
  • מחבר

הסוגריים שאחרי ה-where לא נחוצים. יכול להיות שזה גורם לשגיאת SQL? (כי ה"--" גורם לכך שמתעלמים משאר השאילתה, ולכן אין סגירה לסוגריים האלה).

שלום מצטער אם הסברתי את עצמי לא נכון, אבל התכוונתי שלא מתרחשת שגיאה (ולפי מדריכים שונים שקראתי דפים שלא מוגנים אמורים ליצור שגיאה כאשר מקלידים " ' " (גרש יחיד) אך פשוט בדף מופיע הודעה כי השם משתמש והסיסמא לא קיימים.

שוב אציין זאת ואני מצטער אם לא הייתי מדוייק - הדף שכתבתי לא מוגן ולכן לפי המחרוזת שהכנסתי אני אמור לקבל גישה (מפני ששינתי את השאילתה בכדי לבדוק אם אני מצליח להיכנס בעזרת SQL Injection) - אך ה"פריצה" לא עבדה ופשוט הופיעה ההודעה הרגילה שמכניסים משתמש וסיסמא לא נכונים. ולכן אני מעוניין לדעת למה, ומה לא עשיתי נכון.

פורסם

הבנתי שלא מתרחשת שגיאה, אבל יכול להיות שמסיבה אחרת כלשהי השאילתא לא מחזירה תוצאות.

תנסה להדפיס את השאילתא במקום לבצע אותה, ולראות מה אמור להיות מבוצע, ולנסות להבין למה זה לא קורה.

אם הכנסת גרש יחיד בשם המשתמש, מה קרה?

פורסם
  • מחבר

הבנתי שלא מתרחשת שגיאה, אבל יכול להיות שמסיבה אחרת כלשהי השאילתא לא מחזירה תוצאות.

תנסה להדפיס את השאילתא במקום לבצע אותה, ולראות מה אמור להיות מבוצע, ולנסות להבין למה זה לא קורה.

אם הכנסת גרש יחיד בשם המשתמש, מה קרה?

כאשר הכנסתי גרש יחיד פשוט מאוד נאמר לי כי השם משתמש והסיסמא אינם קיימים (ההודעה הרגילה כאשר המשתמש מכניס שם משתמש או סיסמא לא נכונים) במקום הודעת שגיאה מה-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') 

ניראה כי נוספים סלאשים, אבל מהי הסיבה אם לא אני הקשתי אותם?

פורסם

זה אומר שנעשה escaping, שזה בדיוק אומר שהאתר מוגן. סיכוי שיש איפשהו בקוד שלך קריאה לפונקציה addslashes?

(מומלץ שאפילו תעלה את הקוד המלא)

פורסם
  • מחבר

בעיקרון לא הוספתי את הפונקצייה הזו ולא חשבתי על אף הגנה מהסוג הזה כי רק אתמול התחלתי להיתעמק בזה

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

הינה הקוד המלא:

<?php
session_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();
?>

  • 2 שבועות מאוחר יותר...

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים