上QQ阅读APP看书,第一时间看更新
2.2 可以联合查询的SQL注入
在可以联合查询的题目中,一般会将数据库查询的数据回显到页面中,比如下面这个例子(测试样例代码时需要关闭GPC):
<?php ... $id = $_GET['id']; $getid = "SELECT Id FROM users WHERE user_id = '$id'"; $result = mysql_query($getid) or die('<pre>'.mysql_error().'</pre>'); $num = mysql_numrows($result); ...
我们注意看上方SQL语句中的$id变量,该变量会将GET获取到的参数直接拼接到SQL语句中,假如此时传入如下参数:
?id=-1'union+select+1+--+
拼接后SQL语句就变成了:
SELECT Id FROM users WHERE user_id='-1'union select 1 -- '
闭合前面的单引号,注释掉后面的单引号,中间写上需要的Payload就可以了。或许你会注意到,传递参数的时候用到了“+”号,而查询语句中并没有出现这个加号,这是因为服务器在处理用户输入的时候已经自动将加号转义为空格符了。
联合查询是最简单易学,也是最容易理解和上手的注入方法,所以在题目中出现可以使用联合查询进行回显的注入时,一般需要绕过某些特定字符或者是特定单词(比如,空格或者select、and、or等字符串)。