CTFHub技能树 Web-文件上传绕过实战全解

张开发
2026/4/19 16:54:15 15 分钟阅读

分享文章

CTFHub技能树 Web-文件上传绕过实战全解
1. 无验证场景下的文件上传漏洞文件上传功能是Web应用中最常见的功能之一但也是最容易被攻击者利用的漏洞点。在没有任何验证机制的情况下攻击者可以直接上传恶意脚本文件比如PHP webshell。这种场景虽然简单但在实际渗透测试中仍然会遇到。我曾在一次实战测试中发现一个电商网站的后台上传接口完全没有做任何过滤。直接上传一个包含?php eval($_POST[cmd]);?的PHP文件就能获取服务器权限。这种漏洞的危害性极大因为攻击者可以完全控制服务器。具体操作步骤很简单准备一个webshell文件比如命名为shell.php通过文件上传接口提交这个文件访问上传成功的文件路径使用中国菜刀等工具连接webshell防御这种攻击的方法也很直接 - 在后端严格限制上传文件的类型至少应该禁止.php等脚本文件的上传。同时建议将上传目录设置为不可执行这样即使攻击者上传了恶意脚本也无法执行。2. 绕过前端验证的技巧很多开发者只在前端使用JavaScript验证文件类型这完全起不到安全防护作用。攻击者可以轻易绕过这种验证我分享几个实用技巧第一种方法是直接修改网页代码。在Chrome开发者工具中找到文件上传的input元素删除或修改accept属性。比如原本限制只能上传图片修改后就可以上传任意文件类型。第二种方法是拦截修改HTTP请求。使用Burp Suite等工具拦截文件上传请求将filename参数从test.jpg改为test.php。这种方法我在CTF比赛中屡试不爽。第三种方法是直接构造请求。完全不用浏览器界面直接用curl等工具发送文件上传请求完全绕过前端验证。curl -X POST -F fileshell.php http://target.com/upload开发者应该在前后端都做文件类型验证前端验证提升用户体验后端验证确保安全性。只依赖前端验证等于没有验证。3. 利用.htaccess文件解析漏洞Apache服务器的.htaccess文件是个很有意思的突破点。通过上传自定义的.htaccess文件可以改变服务器的解析规则。我在一次渗透测试中就用这个方法成功拿下了目标服务器。具体有两种利用方式第一种是修改文件解析类型。上传包含以下内容的.htaccess文件AddType application/x-httpd-php .jpg这样服务器就会把.jpg文件当作PHP来解析。然后上传一个包含恶意代码的jpg文件即可。第二种是利用FilesMatch指令FilesMatch shell SetHandler application/x-httpd-php /FilesMatch这样任何包含shell字符串的文件名都会被当作PHP解析。比如上传shell.jpg文件实际上会被当作PHP执行。防御这种攻击的方法包括禁止上传.htaccess文件设置AllowOverride None禁用.htaccess功能定期检查服务器上的.htaccess文件4. MIME类型绕过实战MIME类型检查是常见的文件上传防御手段但也很容易被绕过。MIME类型实际上只是HTTP请求头中的一个字段完全可以伪造。在Burp Suite中拦截上传请求将Content-Type从application/octet-stream修改为image/jpeg就能轻松绕过检查。我测试过很多网站发现很多开发者只检查这个头部字段就认为文件是安全的。实际案例某社交网站允许上传图片实际上只检查了Content-Type。我上传了一个PHP文件将Content-Type改为image/png就成功绕过了。更可怕的是这个网站还将上传文件保存在可访问目录导致可以直接执行webshell。正确的防御方法应该包括检查文件真实类型而不仅是MIME类型使用getimagesize()等函数验证确实是图片重命名上传文件避免直接执行将上传文件存储在非Web可访问目录5. 00截断漏洞深度解析00截断是文件上传绕过的经典技术利用的是字符串处理中的空字节问题。当系统遇到%00(URL编码的空字节)时会认为字符串到此结束。假设上传接口接收两个参数name: 文件名path: 存储路径如果构造这样的请求path/uploads/shell.php%00 nametest.jpg有些服务器处理时会因为%00截断最终文件保存为/uploads/shell.php而文件内容却是test.jpg的内容。这样就能绕过扩展名检查。我在某次CTF比赛中遇到一个有趣的变种系统先检查扩展名是否在白名单中通过后才拼接文件路径。利用%00截断可以构造这样的payloadfilenameshell.php%00.jpg检查时看到的是.jpg但保存时被截断为.php。防御00截断的方法过滤所有请求参数中的%00使用最新版本的编程语言和框架很多新版本已经修复这个问题对上传文件名进行规范化处理6. 双写后缀绕过技巧双写后缀是应对简单字符串替换的有效绕过方法。当系统使用str_replace等函数删除特定字符串时可以通过双写来绕过。比如系统会删除.php字符串那么我们可以上传名为shell.pphphp的文件。删除操作后剩下shell.php。我在实际渗透中发现很多开发者会这样写过滤代码$filename str_replace(php, , $filename);这种简单的替换完全起不到防护作用。更可怕的是有些系统会多次替换但攻击者可以通过构造更复杂的字符串来绕过。正确的过滤方法应该是使用白名单而不是黑名单检查最后一个扩展名而不是简单字符串匹配结合文件内容检查而不仅是文件名7. 文件头检查与绕过很多系统会检查文件头来判断文件类型比如图片文件通常有特定的魔术数字。常见的文件头包括JPEG: FF D8 FF E0PNG: 89 50 4E 47GIF: 47 49 46 38绕过方法是在恶意脚本前添加这些文件头。例如GIF89a ?php eval($_POST[cmd]);?这样文件既符合GIF的文件头要求又包含PHP代码。我在测试某网站时发现他们使用了更严格的图片验证不仅检查文件头还会尝试读取图片尺寸。这时可以在真实图片末尾追加PHP代码因为图片处理器会忽略文件末尾的多余数据。防御建议重新生成图片文件而不仅是检查严格限制上传图片的尺寸使用专业图片处理库验证8. 其他常见绕过技术除了上述方法文件上传还有很多有趣的绕过技巧黑名单绕过尝试使用不常见的PHP变种扩展名如.phtml.php3.php4.phps大小写绕过有些系统区分大小写可以尝试.Php.pHP.PHp特殊字符绕过利用系统处理文件名的特性shell.php.shell.php%20shell.php:jpgshell.php::$DATA结合解析漏洞比如IIS的解析漏洞上传shell.php.jpg可能被当作PHP执行。防御这些攻击最有效的方法是使用白名单而不是黑名单重命名上传文件为随机名称限制上传目录的执行权限定期检查服务器上的可疑文件

更多文章