渗透测试----SQL注入~web日志分析thinkphp漏洞及duplicate报错注入

查看web时可以直接检索关键字,如cmd,就是直接执行系统命令这种的。

select count(*),floor(rand(0)*2) x from information_schema.character_sets group by x;

rand(0)

随机输出0~1间的浮点数

select rand(0) from information_schema.schemata;

渗透测试----SQL注入~web日志分析thinkphp漏洞及duplicate报错注入

 

rand(0)*2

随机输出0~2间的浮点数

select rand(0)*2 from information_schema.schemata;

渗透测试----SQL注入~web日志分析thinkphp漏洞及duplicate报错注入

 

floor(rand(0)*2)

将随机输出的浮点数取整

select floor(rand(0)*2) from information_schema.schemata;

渗透测试----SQL注入~web日志分析thinkphp漏洞及duplicate报错注入

 

count(*)

统计输出数目

select count(*),floor(rand(0)*2) from information_schema.schemata;

渗透测试----SQL注入~web日志分析thinkphp漏洞及duplicate报错注入

 

select floor(rand(0)*2)a from information_schema.schemata;

字段名

渗透测试----SQL注入~web日志分析thinkphp漏洞及duplicate报错注入

group by a

对a列分类汇总

select floor(rand(0)*2)a from information_schema.schemata group by a;

渗透测试----SQL注入~web日志分析thinkphp漏洞及duplicate报错注入

 

报错原因分析:

本质:

group by语句的报错。

group by语句报错的原因:

floor(rand(0)*2)的不确定性,即可能为0也可能为1。

group by key 执行时循环读取数据的每一行,将结果保存于临时表中。

读取每一个行key时:

如果key存在于临时表中,则更新临时表中的数据(不再计算rand值)。

如果key不存在于临时表中,则在临时表中插入key所在行的数据(再次计算rand值)。

假设此时临时表只有key为1的行,不存在key为0的行,那么数据库要将该条记录插入临时表,由于是随机数,插入时要再次计算rand值,此时floor(rand(0)*2)结果可能为1,就会导致插入时冲突而报错。即检测时和插入时都计算了rand值。

实际测试中发现,出现报错至少要求数据记录为3行,记录数超过3行一定会报错,2行时是不报错的。

利用concat将报错的key和我们想要注入的语句一并执行输出,达到报错回显的效果。

渗透测试----SQL注入~web日志分析thinkphp漏洞及duplicate报错注入

 

利用floor函数进行报错时只能爆一行结果,group_concat函数不适用于此报错函数。

可以利用limit 0,1逐行遍历。

 

上一篇:python基础知识


下一篇:discuz 7.2 floor()函数 报错回显