[GYCTF2020]Ez_Express

本文详细介绍了如何解决GYCTF2020中的Ez_Express挑战。通过分析JavaScript原型链与原型链污染,特别是Undefsafe模块的CVE-2019-10795,解题者发现关键在于利用merge和clone函数导致的原型链污染。通过审计代码,解题者发现需要在/login路由中利用特殊字符(如'ı', 'ſ')绕过大小写检查,然后在/info路由中利用污染的原型链获取flag。总结中强调了原型链污染的审计技巧以及在Node.js环境中寻找RCE的方法。" 8983290,1449353,C语言中的指针与数组名解析,"['C', '指针', '基本概念']
摘要由CSDN通过智能技术生成

目录

考点:

大体思路:

前言:

解题:

总结:


考点:

JavaScript 原型链与原型链污染

Undefsafe 模块原型链污染(CVE-2019-10795)

大体思路:

js审计如果看见merge,clone函数,可以往原型链污染靠,跟进找一下关键的函数,找污染点

切记一定要让其__proto__解析为一个键名

前言:

静下心来,慢慢思考。

解题:

 扫描目录可得www.zip,进行代码审计 routes 下的 index.js文件:

var express = require('express');
var router = express.Router();
const isObject = obj => obj && obj.constructor && obj.constructor === Object;
const merge = (a, b) => {                     //用了危险函数 merge
  for (var attr in b) {
    if (isObject(a[attr]) && isObject(b[attr])) {
      merge(a[attr], b[attr]);
    } else {
      a[attr] = b[attr];
    }
  }
  return a
}
const clone = (a) => {
  return merge({}, a);
}
function safeKeyword(keyword) {
  if(keyword.match(/(admin)/is)) {
      return keyword
  }

  return undefined
}
//路由

router.get('/', function (req, res) {
  if(!req.session.user){                                           //没登录 返回到login
    res.redirect('/login');
  }
  res.outputFunctionName=undefined;                                 //outputFunctionName=undefined
  res.render('index',data={'user':req.session.user.user});          //渲染
});


router.get('/login', function (req, res) {
  res.render('login');
});



router
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值