欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > BugKu-WEB-sodirty

BugKu-WEB-sodirty

2024/10/26 14:27:24 来源:https://blog.csdn.net/m0_52061428/article/details/140125401  浏览:    关键词:BugKu-WEB-sodirty

目录

前言

正文

信息收集

代码审计

 验证

结尾


前言

七月始,暑假副本也正式开启


正文

信息收集

看着貌似没啥意义

看样子是有备份文件

下载下来

快速审计一下


代码审计

来吧

app.js没啥东西,主要是功能是实现error

我们找一找有没有index.js

找到了

\www\routes\index.js

var express = require('express');
const setFn = require('set-value');
var router = express.Router();const Admin = {"password":process.env.password?process.env.password:"password"
}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();if(Admin[key] === password){res.send(process.env.flag ? process.env.flag : "flag{test}");}else {res.send("密码错误,请使用管理员用户名登录.");}}});
router.get('/reg', function (req, res, next) {req.session.challenger = {"username": "user","password": "pass","age": 80}res.send("用户创建成功!");
});router.get('/', function (req, res, next) {res.redirect('index');
});
router.get('/index', function (req, res, next) {res.send('<title>BUGKU-登录</title><h1>前端被炒了<br><br><br><a href="./reg">注册</a>');
});
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("修改成功");}}
});module.exports = router;

看到了没扫到的接口

同时也发现setFn极有可能存在原型链污染

const setFn = require('set-value');
setFn(req.session.challenger, key, value);

由于名字叫做sodirty,所以更加坚定了这个想法

我们来讲一讲什么原型链污染

原型链污染是一种在JavaScript中可能存在的安全漏洞,它允许攻击者修改对象的原型属性,从而影响到其他依赖这些属性的对象。这种攻击通常发生在Web应用程序中,当开发者没有正确地验证或清理用户提交的数据,并且这些数据被用作构造函数或对象方法的参数时,就可能发生原型链污染

这里setFn作为指针动态调用set-value,且key 的值完全由用户控制(通过 req.body.attrkey)

如果我们尝试构造"__proto__[password]""constructor.prototype.password",那么他们可以尝试修改对象原型,从而改变其继承的属性

具体来说,当 key 是一个指向原型属性的路径时,set-value 库可能会尝试在原型链上设置这个属性,这就会导致原型链污染

这边Admin 对象的 password 字段被用于比较,如果攻击者能够通过原型链污染将原型中的 password 属性设置为与 Admin 相同的值,那么他们就可以绕过身份验证,从而获取到 flag

当然这目前只是猜想

除此之外

        if(req.session.challenger.age > 79){res.send("糟老头子坏滴很");}
router.get('/reg', function (req, res, next) {req.session.challenger = {"username": "user","password": "pass","age": 80}res.send("用户创建成功!");
});

/reg默认创建age:80

所以我们需要通过

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("修改成功");}}

 进行修改


 验证

首先注册

然后就是

我也不知道为什么使用bp进行传参时会失败.......所以使用hackbar进行测试

接下来就是修改admin的password

然后就可以直接获取flag

还有就是为什么ip不一样了,因为前面的环境崩了

 

成功


结尾

学习学习学习!!!!

求赞求关注

感谢


作者的其他文章

攻防世界-WEB-WEIPHP(记一次有趣的代码审计)-CSDN博客

攻防世界-WEB-catcat-new-CSDN博客

攻防世界-WEB-filemanager-CSDN博客

BugKu-new_php_bugku newphp-CSDN博客

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com