按SQL语句排序无法正常工作

时间:2013-12-12 19:18:46

标签: php mysql sql sql-server

要清楚,我正在努力尝试注入我自己的网站。

我试图通过使用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'

3 个答案:

答案 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'";