Menu

双查询注入

0 Comment

具体讲一下双查询注入的原理,sqli-labs上有很多例子

我举一个简单的例子讲解

sqli-labs-master—->Less-5

我们按照一般的思路来做注入,加入‘之后报错

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ”1” LIMIT 0,1′ at line 1

我们可以推断出大概的sql语句

select  username,password from users where id=’1′ limit 0,1

闭合单引号,用order by判断有多少列,后面的的语句可以用#或者– 注释掉

接着准备用union联合查询来看显示位,单没有任何的显示位

这里就可以用到双查询注入,其中最重要的原理是group by语句和聚合函数count(*)一起使用时会把子查询的结果以报错的形式显示出来。

tips:这里的话,双查询注入是因为有报错,代码中有print_r(mysql_error());这样的语句,不然的话这次的注入就只能盲注了,所以说双查询注入是先建立在有没有报错语句的基础上的

在写出payload之前我们先看看一些函数和sql语句

rand():返回一个0-1之间的随机浮点数

floor():取整,并不是四舍五入,而是小与这个浮点数的最大整数值

select floor(rand()) 返回的始终都是0,但如果是select floor(rand()*2),这样返回的值可能是1,可能是0.

select concat((select database()),floor(rand()*2))就会返回数据库0或者数据库1

如果指定一个表的话,这个表有多少条内容,就会返回多少条数据库0或者数据库1

例如:select 1 from users;

所以select concat((select database()),floor(rand()*2)) from users;

这时候再加上group by语句

最开始说过,报错的原理是group by语句和聚合函数count(*)一起使用时会把子查询的结果以报错的形式显示出来,我们加上cout(*)函数;

有正常执行的,也有报错的,所以注入的时候需要多刷新一下

按照这样的思路,把select database(),换成任意你想查询的语句就行了。

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注