[NJCTF 2017] Chall1(web), Chall2(web) writeups
[CTF]
Chall1
登录黑盒测试,无果。Github上搜索以下代码
$http.post('/login', {password: $scope.password}).then(function(response) {
找到源码 https://github.com/0lddriver/app/
index.js
控制路由,关键代码:
var reg = /^[0-9]*$/;
router.post('/login', function(req, res, next) {
if(req.body.password !== undefined) {
var endata = crypto.createHash('md5').update(req.body.password).digest("hex");
if (reg.test(endata)) {
var pwd = parseInt(endata.slice(0,3),10);
password = new Buffer(pwd);
if(password.toString('base64') == config.secret_password) {
req.session.admin = 'yes';
res.json({'status': 'ok' });
}else{
res.json({'status': 'error', 'error': 'password wrong: '+password.toString()});
}
}else{
res.json({'status': 'error', 'error': 'password wrong: '+endata.toString()});
}
} else {
res.json({'status': 'error', 'error': 'password missing' });
}
});
用户输入被md5加密,只要加密后的结果中全部为数字即可绕过,随后parseInt
产生的数字传入Buffer
触发漏洞。
脚本跑出可用输入
26.7373765022
填入password字段,抓包重放反复尝试后拿到flag
Chall2
接着上题思路,为了构造合适的Cookie,需要找到session_keys变量值。
起初不断重放上题拦截的数据包,想在响应中匹配到一些session
,key
特征向量,无果。
后来考虑到config.session_keys
该变量值由出题者决定,随机性强,很可能无法用关键字匹配到。
第二题的题目描述为你得得到第一个flag
,再加上积分榜上之前两个队伍拿下第一题之后十分钟内便解出了第二题。开脑洞猜测第一题的flag就是第二题的session_key。
本地搭建环境,在源码中修改config.js
填入key值
var config = {};
config.secret_password = ""
config.session_keys = [ "NJCTF{P1e45e_s3arch_th1s_s0urce_cod3_0lddriver}"]
module.exports = config;
修改app.js
将session.admin改为yes生成新的Cookie
app.use(function(req, res, next) {
if(req.session.admin === undefined) {
req.session.admin = 'yes';
}
next();
}
本地搭环境获得新的Cookie,复制到WEB服务器上,base64解码后得到flag NJCTF{N0d5JS是世界上最好的语言,对吗?}