2023ASISCTF
2023ASISCTF
web
hello
1 |
|
第一步
1 | http://45.147.231.180:8000/?x=fi%fale:///ne%faxt.txt |
1 | const fs = require('node:fs'); |
第二步
1 | http://45.147.231.180:8001/39c8e9953fe8ea40ff1c59876e0e2f28/read/?file=/next.txt%00/. |
ps:(bun 和 node 不同)
hello-again
还是源码题目。
首先根据源码
https://github.com/oven-sh/bun/blob/df9461ecc58e2882afa34cdf59d9887d9242b5f9/src/url.zig#L854
url解码将会在%PUBLIC_URL%
的地方停止,形成截断
然后同时需要match得到private-symlink控制参数,然后使用index绕过(这步没完全看懂)
似乎还是源码match解析的过程会将index解释成本目录下的东西,然而basename只会截取最后,两者解析的问题成功绕过
最后通过软连接获取到bun的调试程序文件,然后tmp下面直接可以加载调用
最后bash反带RCE
还是需要找到源码,比较逆天的一题
1 | #!/usr/bin/env python3 |
yet another calc
一种新的污染方式,实际上通过__defineGetter__
以及__lookupGetter__
这样的原生函数,将Math进行污染
实际上简单来说
1 | a = 1 |
Math.qwewe本身不存在必然是定义为undefined
,但是String.fromCharCode跟其关联
a存在,__lookupGetter__
本身会寻找全部的原型链,然后查看是否存在某些属性,但是a同样不存在于Math,同时指向的是undefined
(搜索上的先后),所以调用的过程大概是这样的
Math[a](70)
,调用Math.__lookupGetter__
,然后搜索到undefined
(除了null都存在),然后找到Math.qwewe
,从而污染了Math
并且寻找的undefined
是最近的属性
1 | a = "sss" |
所以这题思路非常奇妙啊
1 | c=Math.constructor |