ログインの例でPHP/Mysqlインジェクションを使用したいのですが、私のコードは以下のとおりです。
ユーザー名anything' --
と空のパスワードを試してみましたが、機能せず、ログインできませんでした。
誰も私を助けることができますか?
<?php
mysql_connect('localhost','root','root');
mysql_select_db('hp');
?>
<form action="" method="post">
<table width="50%">
<tr>
<td>User</td>
<td><input type="text" name="user"></td>
</tr>
<tr>
<td></td>
<td><input type="text" name="password"></td>
</tr>
</table>
<input type="submit" value="OK" name="s">
</form>
<?php
if($_POST['s']){
$user = $_POST['user'];
$pass = $_POST['password'];
$re = mysql_query("select * from zend_adminlist where user_name = '$user' and password = '$pass'");
if(mysql_num_rows($re) == 0){
echo '0';
}else{
echo '1';
}
}
?>
最も一般的な例の1つは次のクエリです。
' or '1'='1
これをユーザー名とパスワードとしてサニタイズされていないログイン入力に入力すると、クエリは次のように変更されます。
Original: SELECT * FROM USERS WHERE USER='' AND PASS='';
Modified: SELECT * FROM USERS WHERE USER='' or '1'='1' AND PASS='' or '1'='1';
これにより、1が常に1になるため、それぞれの検索結果が真になります。この方法の問題は、特定のユーザーの選択が許可されないことです。これを行うには、他の例で見られるように、コメント化してANDステートメントを無視する必要があります。
ユーザー名の値が次の場合:
$_POST['user'] = "1' OR 1 LIMIT 1; --";
次に、mysqlクエリは次のようになります。
select *
from zend_adminlist
where user_name = '1' OR 1 LIMIT 1; --' and password = '$pass'