Windows帮助骇客绕过针对文件上传的限制

一套需要文件上传功能的、PHP编写的程序运行于Windows Server+Apache平台,屡次被上传"小马"。

这套系统采用.*\.(php|phar|phtml|jsp)$来匹配任何不应被上传的文件。

注:这套系统曾使用JSP编写,经历代码重构后,(出于SEO的需求)为保证固定链接不改变,部分PHP文件被命名为.jsp服务器也会将.jsp交给php-fpm处理,故须禁止上传.jsp文件。

注2:我个人认为,应该使用Apache的rewrite功能来实现'URL不更改'(将访问example.jsp的请求内部重定向至example.php),而不是将php文件命名为jsp——前者是业内通用做法,而后者则造成管理混乱。

注3:防止骇客上传并执行木马,不应仅通过文件名检测,更应该检测文件的内容。如:WordPress禁止内容包含<?php的内容被上传,无论文件名与MIME/type为何。

注4:防止骇客上传并执行木马,只要在上传目录的.htaccess添加一个SetHandler !即可。(此目录下任何文件不被php-fpm处理)


我通过抓包才发现,骇客通过上传命名类似exploit.php.的木马,绕过了检测。这是因为Windows的NTFS文件系统不允许以.结尾的文件名,如果这样的文件通过某种方式被复制到Windows系统中,Windows会删去结尾的.。骇客正是利用了这一点。

注:可以在Linux系统上建立一个这样的文件,然后通过支持Zmodem的SSH客户端将其复制到Windows机,便可复现。


如果骇客以上传"小马"为起点侵入并控制系统,大致分为如下三步:

  1. 上传"小马"(释放"大马"的工具,常利用php的语言生成器eval())
  2. 通过"小马"上传"大马"(多为WebShell等)
  3. 提权

对Linux机的提权多是利用内核漏洞,我不是很了解Windows上是否需要提权/如何提权/提权的难度。但是,在不能只限制骇客提权的情况下(骇客即便不提权也可以对网页挂马——网站文件对HTTP服务器用户通常是可读/写的),也许从木马的执行这一层面来加以防范(对上传目录停用解析器)更有效。

骇客很容易判断服务器运行Windows还是*nix——NTFS不区分文件名的大小写,骇客只需观察url中的路径是否大小写敏感即可。当然,事后服务器被切换至CentOS了。