复现平台: buuoj
分析
- 抓包看源码,发现www.zip,阅读发现关键文件index.js
- 用户数据存储在req.session.user中
- 流程
- 导航到/未登录重定向到/login页面,通过res来进行渲染
- 结合1要登录admin用户会检查req.session.user的信息是否匹配,又无法获取admin的密码 -> 但是有一个可能,覆盖?通过注册实现,但是有安全检查,等下再绕过,看看搞不搞得通
- 思路1
- 登录admin后传body污染原型链,原型链只能在登录后进行污染
- 获取信息,带外(需要命令执行)/回显(难,没法读文件),这里肯定要读文件,可不可以进行命令执行 -> 通过原型链污染后新建的对象都会有某个属性,将某个属性设置为一个函数,执行命令,理论可行,可以执行命令直接看反弹shell,不出网就用回显处理(类似wangding24 web02)
- 思路1待解决
- 覆盖需要绕过,match()绕过,处理match还对username**进行了什么处理(从处理想对策)**,可能有用?toUpperCase()?
- toUpperCase,可以进行绕过,这里node漏洞的
- 命令执行部分使用shell.js可以一试,需要找到一个对象访问它的属性但是被覆盖 -> 先访问/action在访问/info有res.outputFunctionName(在/目录中的和/action中的不一样),通过
{"__proto__": {"outputFunctionName": function() {命令执行实现}}
- 覆盖需要绕过,match()绕过,处理match还对username**进行了什么处理(从处理想对策)**,可能有用?toUpperCase()?
- 思路1
index.js
1 | var express = require('express'); |
*修正
- 思路没有错就胜利很多了
- fix1: 这里的访问属性调用函数有问题
- payload
{"lua":"123","__proto__":{"outputFunctionName":"t=1;return global.process.mainModule.constructor._load('child_process').execSync('cat /flag').toString()//"},"Submit":""}
这样来调用,插入模板进行调用,反而如果直接定义函数的的话无法被调用
- payload
- fix2: 注意传输json对象时要修改content-type: application/json
解题步骤
- 注册
admın
成功进行覆盖 - 访问
/action
并进行覆盖,payload{"lua":"123","__proto__":{"outputFunctionName":"t=1;return global.process.mainModule.constructor._load('child_process').execSync('cat /flag').toString()//"},"Submit":""}
- 访问
/info
总结
- 几个核心思想
- 读文件一般需要命令或者包含
- 进行了什么处理(从处理想对策)如uppercase
- 这种源码路由题还是先从路由再到细节想思路,不会太跳跃
- ref