Bugku WEB sodirty

其实还是源码分析
dirsearch扫路径,发现有www备份,下载下来肯定是源码分析
文件有点多 more ./*|grep flag一个一个文件夹找,在router目录下找到index.js找到flag相关代码,后来查阅资料发现node.js里面router是根据路由去分模块
就相当java里的spring mvc直接跟用户交互用来寻找功能函数的框架
查看源码:

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('BUGKU-登录

前端被炒了


注册'); }); 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("传参有误");...skipping 1 linelet key = req.body.attrkey.toString();let value = req.body.attrval.toString();setFn(req.session.challenger, key, value);res.send("修改成功");}} });module.exports = router;

——————————————————————————————
flag在getflag模块里,那么就要绕过了
分析源码,首先要有一个req.session.challenger对象,因为后面会更改他的age属性,创建功能在reg里直接reg(url)
require函数其实就是包含模块,set-value模块源码在modules里,其实见名知意,赋值模块
然后就是修改上面创建的challenger对象的age属性,用update函数可以实现修改challenger对象的属性,attrkey:age,attrval:20过第一个if
往下走其实就是Admin[key] === password
那么查考Admin对象
const Admin = {
“password”:process.env.password?process.env.password:“password”
}
只有一个属性 password,只要key带过来的不是password,那么就可以是我们指定的属性,而这个属性我们可以根据两者共同的父亲object来设置
关于原型链泄露,其实可以想成java里的父子类,就是子类调用时找不到的属性,会默认去找他的父类可以继承的属性,如果找不到,那就一直找,万物对象的根就是object
Node.js也一样,通过__proto__.pwd更改challenger和Admin共同的父亲object,让他加一个属性pwd,指定值,
然后我们把key设置成pwd,password设置成我们给object赋的pwd值,就可以过这个if,得到flag


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部