本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。
前言
这篇文章记述了又一次的CTF拉练,Node.js的白盒审计题…
源码
1 | // 捕捉全局异常 |
思路解析
首先分析代码, 先是引入一些模块,定义网站根路径加载源码,中间用isProtectUrl进行判断url中是否有/login及session[‘username’]是否定义来处理请求,不包含/login或者未定义seesion[‘username’]则跳转到网站根路径;定义了一个login页面,可以post验证用户名及密码,如果用户密码对了则session赋值;定义了一个getflag页面,该页面加载flag显示。
题目主要请求访问/getflag来查看flag文件。
初步想法
看是否有什么Cookie伪造之类的达到session赋值从而绕过typeof req.session[‘username’] == ‘undefined’)或者能否绕过isProtectUrl(req.originalUrl, req.query) 使两者中其中一个不成立后访问/getflag。
本题考点
绕过isProtectUrl(url, query_url);
req.query 一个对象,为每一个路由中的query string参数都分配一个属性。
1、不能获取原型链的属性
2、如果没有query string,它就是一个空对象,属性的值为{}。
3、不能获取数组[]后面=前面的值(如:[]123
不能获取到123)
…
解题步骤
根据上述特性我们可以构造成getflag?__proto__=/login
,getflag?=/login
等等。
本地环境调试
1、getflag?=/login
2、getflag?__proto__=/login
CTF环境
请求/getflag 获取flag
1 | https://xxx.xxx.com/getflag?__proto__=/login |
最后
仅供参考~