要清楚,我正在努力尝试注入我自己的网站。
我试图通过使用order by语句注入我的一个站点来尝试计算出我的表中有多少列,但是当我的列数大于我的列数时,我没有收到任何错误。
我的代码是一个非常简单的表单,它调用php文件然后运行SQL查询。
继承人的PHP代码:
<?php
$host="localhost"; // Host name
$username="root"; // Mysql username
$password="root"; // Mysql password
$db_name="Hack"; // Database name
mysql_connect("$host", "$username", "$password");//or die("cannot connect");
mysql_select_db("$db_name");//or die("cannot select DB");
$id = $_GET['id'];
echo $id . "<br />";
$qstr = "SELECT * from users WHERE username = '$id'";
echo "<br />$qstr<br />";
$query = mysql_query($qstr);
$num = mysql_numrows($query);
$count = 0;
while ($count<$num){
$id = mysql_result($query,$count,"id");
$username = mysql_result($query,$count,"username");
echo 'ID: ' . $id . '<br> Username: ' . $username . "<br/>";
$count++;
}
if($num==0){
echo "<br /><br /><br />";
echo mysql_error();
}
?>
下面是表格:
<html>
<h1>
Search
</h1>
<form method="get" action="search.php">
<input type="text" name="id">
<input type="submit" value="Search user">
</form>
</html>
最后是我在网址中尝试的“order by”语句:
http://localhost:8888/search.php?id=admin%20order%20by%204
请忽略“%20”,这些只是空格,但chromes将它们放入
所以我的问题是为什么“order by”不起作用?
编辑:这是回声的SQL语句:
SELECT * from users WHERE username = 'admin order by 4'
答案 0 :(得分:2)
您需要更改
SELECT * from users WHERE username = 'admin order by 4'
到
SELECT * from users WHERE username = 'admin' order by 4
答案 1 :(得分:1)
当您尝试注入查询时,您必须思考:如何完成查询以更改它?所以你有这个:
$qstr = "SELECT * from users WHERE username = '$id'"
这是文字字符串,因此您在ID输入字段中输入值admin order by 4
,然后您的查询将被评估为
SELECT * from users WHERE username = 'admin order by 4'
哪个没有效,但没有名称为admin order by 4
所以其他人说要再次使用您的字段admin' order by 4;
这是错误的,因为您的查询将被评估为
SELECT * from users WHERE username = 'admin'' order by 4;'
哪个也错了,看两个单引号?
因此,您必须使用某个命令完成查询,然后尝试将其放在输入上:admin' order by 4,'
然后您的查询将被评估为
SELECT * from users WHERE username = 'admin' order by 4,''
这意味着您的第四个字段的订单加上空白值。
答案 2 :(得分:0)
基于您的示例查询:
SELECT * from users WHERE username = 'admin order by 4'
处理表单输入的代码通过将输入封装到单引号中来形成查询。这会导致查询搜索“用户名”列设置为指定表单值的记录。
根据代码的清洁程度,您可能无法执行此操作,但您可以尝试使用以下方式提交表单:
admin' order by 4;
...作为用户名。如果单引号未被删除或转义,则查询将变为:
SELECT * from users WHERE username = 'admin' order by 4;'
更新:
我看到你现在已经发布了代码。要允许注入,只需删除此行上'$ id'周围的引号:
$qstr = "SELECT * from users WHERE username = '$id'";