我做了一个易受攻击的网站进行研究。我尝试在URL上手动SQL注入
URL类似于:_localhost/profile.php?user=test_
。
如果我在网址中放入撇号,我会收到错误:
警告:mysqli_fetch_array()要求参数1为mysqli_result,第100行的/var/www/html/profile.php中给出布尔值。
但是当我试图找出添加 ORDER BY 1 - 的列数时,然后增加数字直到我收到错误它不起作用。
甚至 ORDER BY 1000 - 不会给我错误。
答案 0 :(得分:0)
FWIW,在ANSI SQL标准中不推荐使用ORDER BY
列位置(请参阅https://mariadb.com/kb/en/sql-99/deprecated-sql-92-syntax/)。但它仍然受到MySQL的支持(但如果某天某些未来版本被删除,请不要感到惊讶。)
当我尝试按整数值1000排序(在MySQL 8.0中测试)时,我收到错误:
mysql> select * from foo order by 1000;
ERROR 1054 (42S22): Unknown column '1000' in 'order clause'
但如果我通过字符串' 1000'
订购,我就不会收到错误mysql> select * from foo order by '1000';
所以我猜你的代码引用了输入变量,因为它形成了ORDER BY
子句。
在ORDER BY
子句中使用任何常量值或常量表达式的合法SQL。这不是错误,但由于它在结果集中的每一行上都是相同的值,因此它实际上是所有行之间的联系,并且它产生的顺序将是任意的。