文件上传漏洞靶场的文件价值在于把“能传上去”和“能执行”这两件事拆开来看。很多人第一次接触这类靶场,上传以为只要把php文件传上去就完事了,漏洞实际上服务器返回一个“上传成功”的靶场提示,和这个文件真正被解析执行,文件中间隔着一堆条件。上传靶场就是漏洞帮你把这些条件一条条摆出来,让你逐个试。靶场
我最早用的文件一个靶场是DVWA的low级别。前端只检查了文件扩展名,上传而且检查逻辑写在JavaScript里。漏洞打开浏览器开发者工具,靶场把onsubmit事件删掉,文件或者直接改一下表单的上传action地址,传一个.php文件上去,漏洞服务器端什么验证都没有,直接落地到上传目录。访问一下路径,shell就执行了。这个过程不到两分钟,但如果你只看页面上的“只允许上传图片”那行提示,可能会觉得无从下手。靶场的好处就在这里:它把防护措施的层级暴露给你看,前端验证、MIME类型检查、黑名单、白名单、内容检测,一层一层加上去,你才知道真实环境里为什么有的能绕有的不能绕。
后来我试了upload-labs。这个靶场把绕过手法分成了二十多个关卡,每一关对应一种或几种防护逻辑。Pass-01是前端JS检查,Pass-02是服务端MIME检查,Pass-03开始上黑名单。黑名单绕过有个经典操作:如果黑名单里没有.phtml、.php5、.pht这些扩展名,而Apache的配置文件里又允许这些后缀被PHP解析,那你传一个shell.phtml就能执行。但这里有个细节,很多人不知道Apache的AddType和AddHandler配置区别,AddType application/x-httpd-php .php .phtml这样写,.phtml才会被当成PHP解析。如果配置里只写了.php,那传.phtml上去也白搭,服务器会把它当纯文本返回。靶场环境通常已经配好了这些解析规则,所以你在靶场里能打通,换到真实站点可能就不行,因为对方的中间件配置不一样。
还有一种情况是内容检测。有的关卡会读文件的前几个字节,判断是不是图片的魔术字节。你可以在PHP文件开头加上GIF89a,再跟上一句,保存成gif文件上传。如果服务器只检查文件头,这个文件就能过。但上传之后能不能解析,又回到中间件配置的问题。IIS 6.0有个著名的解析漏洞,上传一个名为shell.asp;.jpg的文件,IIS会把分号后面的内容忽略掉,当成asp执行。这个漏洞在靶场里经常被用来做演示,但现实中IIS 6.0已经很少见了。靶场里的这些关卡,有些是模拟历史漏洞,有些是模拟配置疏忽,你得分清楚哪些是通用手法,哪些是特定版本才有的问题。
我个人的习惯是,每通一关就记一下绕过的核心条件。比如Pass-11是%00截断,需要PHP版本小于5.3.4,并且magic_quotes_gpc关闭。现在PHP 5.3.4都是十几年前的东西了,这个手法在实际渗透里基本用不上。但靶场还是保留着,因为它能帮你理解“路径拼接时截断”这个思路。类似的还有竞争上传、.htaccess绕过、user.ini利用,这些手法在不同环境下成功率差别很大。
玩文件上传靶场,别只盯着“怎么传上去”。传上去只是第一步,后面还有文件路径是否可知、上传目录是否有执行权限、中间件是否解析你传的后缀、有没有open_basedir限制、disable_functions禁了哪些函数。这些条件在靶场里通常被简化了,真实环境里可能一个都不满足。我见过一个站,上传目录权限设成了755,但PHP进程用户是www-data,目录属主是root,文件传上去之后www-data没有写权限,连覆盖都不行。这种问题靶场不会教你,得自己踩坑。
说到底,靶场是给你练手感的。它把变量控制住了,让你专注于某一个绕过点。但真实环境里变量是混在一起的,你得同时考虑上传、解析、权限、路径、杀软、日志。靶场通关不代表实战能打通,但靶场都通不了,实战里连门都摸不到。