以 bWAPP 环境下的 Unrestricted File Upload 为例,来看文件上传是如何导致安全问题的。
bWAPP, buggy web application, 该程序中集成了各种常见漏洞,目的是作为漏洞测试的演练场,为 web 安全爱好者和开发人员提供一个测试平台。
其安装和登入不再赘述。
在 php 中,提供了诸如 evel
的函数,其作用就是将参数作为 php 代码解析并执行。
新建脚本文件 file.php:
<?php @eval($_POST['hacker']); ?>
之后,将该文件上传到 bWAPP 内,流程为:
页面上方出现 test 字段,表明上传成功
此时,需要注意,我们选定的安全等级为 low:
随后,访问本地内 bWAPP 下的 images/file.php 路径:
可见,文件已经上传成功。
现在,漏洞就已经出现了,bWAPP 上有了一段能执行任何 php 代码的函数,因此,可以对其发送请求,进而获取服务器上的内容:
curl -d "hacker=echo getcwd();" http://127.0.0.1/images/file.php
# -d 表示为 post data
# hacker= 是因为 file.php 读取的是 hacker 下的字段
# getcwd 为获取当前工作目录的函数
可见,上述代码执行完成,成功获取了服务器当前的工作目录。
如果将安全等级提高到 middle, 则会拦截所有的 php 文件上传:
此时,看似没有办法上传 php 文件了,其实并非如此。
思考下列问题:
- 问题 1: 服务器是如何判断当前文件类型的?
答:依据文件后缀。
- 问题 2: 服务器是如何解析文件的?
答:依照服务器配置文件。(所谓解析文件,例如 .css 文件,服务器会将其认为是需要处理的文件交给浏览器解析,而不是一串字符串)
bWAPP 的 web server 为 apache, 它对文件解析的配置文件位于以下目录:
红框部分标注出 php 文件的解析规则,查看可知,只要满足 .+\.ph(p[345]?|t|tml)$
后缀的都会按照 php 文件来处理。
那么,后缀名绕过的实现原理便可以归结为:将 file.php 后缀更改为 phtml(它依旧满足正则要求,因此可以被服务器认定为 php 文件),但它绕过 .php 后缀限制。
就此,我们将 file.phtml 上传,随后执行 curl 请求,结果为:
可见,成功绕过了后缀名限制。
将安全等级调成最高,之后上传 file.phtml, 其结果为:
可见,此时文件上传功能以白名单的形式,限制只能上传 png 和 jpg 格式的文件。
此时,文件格式的限制,因此无法同时满足内容为 php 代码和服务器解析执行 php 代码两个部分,因此无法实现漏洞攻击。