报错注入
为什么我们要通过报错注入?
页面是否会把详细的报错信息告诉我们然而mysql数据库中显示错误描述是因为开发程序中采用了print_r
, mysql_error()
函数,将mysql错误信息输出。
关于报错注入有十种方式,详情见链接十种MySQL报错注入虽然报错注入方式比较多,但是抓住原理就非常好理解
这里讲解俩种floor形式
1.select * from test where id=1 Union select count(*),concat((查询语句),0x26,floor(rand(0)*2))x from information_schema.columns group by x
2.select * from test where id=1 and (select 1 from (select count(*),concat(查询语句,floor(rand(0)*2))x from information_schema.tables group by x)a);
详细讲解floor
先看Union select count(*),concat((查询语句),0x26,floor(rand(0)*2))x from information_schema.columns group by x;
把union忽略掉这个只是将结果进行一个整合而已
必备知识
- count():函数返回匹配指定条件的行数。count(*)函数返回表中的记录数
- 0x26:16进制数值,ASCII为“&”,在回显中起到分隔作用
- concat:用于连接俩个字符串
- floor():floor:函数是用来向下取整呢个的,相当于去掉小数部分
- rand():rand()是随机取(0,1)中的一个数,但是给它一个参数后0,即rand(0),并且传如floor()后,即:floor(rand(0)*2)它就不再是随机了,序列0110110。因此rand(0)也被叫做伪随机。
- information_schema.columns:这个表是随便的,但是确保不是一个空表就可以
- group by:是根据一个或多个列对结果集进行分组的sql语句,group by语句使用是先会建立一个虚拟表。group by 主键,主键是唯一的。
- ()x:其实就像当于一个别名,这个别名作用即是为了方便也是为了虚拟表而设立的。
报错注入就是我们通过制造错误的语句来让数据库意识到语句出现了错误,然后将错误信息返回,我们从返回的错误信息中获得敏感信息。
concat+rand()+group_by()导致主键重复
这种报错方法的本质是因为floor(rand(0)*2)的重复性,floor(rand(0)*2)的输出结果是011011011。group by key的原理是循环读取数据的每一行,将结果保存于临时表中。读取每一行的key时,如果key存在于临时表中,则不在临时表中更新临时表的数据;如果key不在临时表中,则在临时表中插入key所在行的数据。每一次查询和插入都会调用floor(rand(0)*2)函数。直到主键开始重复,导致group by语句出错。
group by 先建立虚拟表,执行一次floor(rand(0)*2)结果为0,发现表中没有0,于是又执行一次floor(rand(0)*2)结果为1,进行插入操作
再次执行floor(rand(0)*2)结果为1,发现表中有1,直接count+1
再次执行floor(rand(0)*2)结果为0发现表中没有0于是floor(rand(0)*2)结果为1执行插入操作。这是数据库发现了主键重复报错。
最后我们修改查询语句就可以知道我们想知道的敏感信息了。
详细讲解updatexml
payload = admin' or updataxml(1,concat(0x7e,(查询语句),0x7e),1)
搭配一个or
- concat用于连接字符串
- 0x7e是字符中的 ~
- updatexml()函数是一个使用不同的xml标记匹配和替换xml块的函数。
- 作用:改变文档中符合条件的节点的值
- 语法: updatexml(XML_document,XPath_string,new_value) 第一个参数:是string格式,为XML文档对象的名称,文中为Doc 第二个参数:代表路径,Xpath格式的字符串例如//title【@lang】 第三个参数:string格式,替换查找到的符合条件的数据
- updatexml使用时,当xpath_string格式出现错误,mysql则会爆出xpath语法错误(xpath syntax)
- 例如: select * from test where ide = 1 and (updatexml(1,0x7e,3)); 由于0x7e是~,不属于xpath语法格式,因此报出xpath语法错误。
例如:
admin'or(updatexml(1,concat(0x7e,(select left(password,25) from H4rDsq1),0x7e),1))#