一文了解文件上传漏洞
前言
刷完了upload-labs 对文件上传漏洞有了些许认识 在此做个小结与记录
1、文件上传漏洞概述
文件上传漏洞是指由于程序员未对上传的文件进行严格的验证和过滤,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。 这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。 这种攻击方式是最为直接和有效的,“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。 如果服务器的处理逻辑做的不够安全,则会导致严重的后果
2、一些基本概念
web容器
web容器是一种服务程序,在服务器一个端口就有一个提供相应服务的程序,而这个程序就是处理从客户端发出的请求,如tomcat、apache、nginx等等。(可以理解为给编程语言提供环境)
中间件:提供系统软件和应用软件之间连接的软件,以便于软件各部件之间的沟通。中间件处在操作系统和更高一级应用程序之间。
容器:给处于其中的应用程序组件(ASP,JSP,PHP)提供一个环境。使处于其中的应用程序组件之间跟容器中的环境变量接口交互,不必关注其他系统问题。
服务器:www服务器或http服务器。提供web信息游览服务。它只需支持http协议、html文档格式以及url,向游览器提供服务的程序。
IIS
IIS全称是互联网信息服务,包括FTP/FTPS、NNTP、HTTP/HTTPS、SMTP等服务。
.net Framework是基础类库,是程序运行的底层框架。
IIS是架设Web服务器用来提供网页游览服务的,属于系统环境。
一般用ASP.NET开发软件,然后靠IIS对公网提供服务。
文件解析
当服务器接收到一个HTTP请求的时候,IIS首先需要决定如何去处理这个请求(服务器处理.aspx和.html肯定是不一样的),根据的是文件的后缀名
服务器获取所请求的页面(也可以是文件)的后缀名后接下来会在服务器端寻找可以处理这类后缀名的应用程序,如果IIS找不到可以处理此类文件的应用程序,那么IIS将直接把这个文件返还给客户端
一句话木马
Asp一句话:<%eval request("xxx")%>
Php 一句话:<%php @eval($_POST[xxx]);?>
Aspx一句话:<%@ Page Languag="xxx"%><%eval(Request.Item["xxx"])%>
配合菜刀或蚁剑使用,若是图片配合Edjpgcom
3、web容器解析漏洞
文件解析漏洞,是指Web容器(Apache、nginx、iis等)在解析文件时出现了漏洞,以其他格式执行出脚本格式的效果
Apache解析漏洞
1、多后缀
- 在Apache1.x,2.x中,Apache 解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断
- 因此可以上传一个
test.php.qwea
文件绕过验证且服务器依然会将其解析为php
注:Apache能够认识的文件在mime.types
文件里
应对:后缀验证尽量使用白名单的方式,这样即使使用不存在的后缀名,也无法绕过
2、配置问题导致漏洞
- 如果在 Apache 的 conf 里有这样一行配置
AddHandler php5-script .php
这时只要文件名里包含.php
即使文件名是test2.php.jpg
也会以 php 来执行。 - 如果在 Apache 的 conf 里有这样一行配置
AddType application/x-httpd-php .jpg
即使扩展名是 jpg,一样能以 php 方式执行
应对:apache配置文件,禁止.php.
这样的文件执行
<Files ~ ".(php.|php3.)">
Order Allow,Deny
Deny from all
</Files>
3、罕见后缀
Apache配置文件中会有. .ph(p[345]?|t|tml)
此类的正则表达式
也就是说php3
,php4
,php5
,pht
,phtml
这样的后缀也是可以被解析的
4、.htaccess
文件
生效条件
- Apache的配置文件中写上
AllowOverride All
- Apache要加载mod_Rewrite模块:
LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so
.htaccess
文件可以配置很多事情
如是否开启站点的图片缓存、自定义错误页面、自定义默认文档、设置WWW域名重定向、设置网页重定向、设置图片防盗链和访问权限控制
例1
代码语言:javascript复制AddType application/x-httpd-php xxx
就成功地使该.htaccess
文件所在目录及其子目录中的后缀为.xxx
的文件被Apache当做php文件
例2
代码语言:javascript复制<FilesMatch "shell.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
Apache把shell.jpg文件解析为php文件
Nginx解析漏洞
1、PHP CGI解析漏洞 Fastcgi协议分析 && PHP-FPM未授权访问漏洞 && Exp编写
- Nginx默认是以CGI的方式支持PHP解析的,普遍的做法是在Nginx配置文件中通过正则匹配设置
SCRIPT_FILENAME
- 当访问
xx.com/phpinfo.jpg/1.php
这个URL时,$fastcgi_script_name
会被设置为phpinfo.jpg/1.php
,然后构造成SCRIPT_FILENAME
传递给PHP CGI - 如果开启
fix_pathinfo
这个选项,就会触发在PHP中的如下逻辑: - PHP会认为
SCRIPT_FILENAME
是phpinfo.jpg
,而1.php
是PATH_INFO
,所以就会将phpinfo.jpg
作为PHP文件来解析
另一种
- 若PHP配置文件中
cgi.fix_pathinfo
默认是开启 - 上传
test.jpg
,内容如下
<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>
- 然后访问
test.jpg/.php
,在这个目录下就会生成一句话木马shell.php
2、空字节代码执行漏洞
- 旧版本(0.5.,**0.6.,0.7,0.8<=0.7.65<=0.8.37)
- 发出请求
http://example.com/file.ext%00.php
就会将file.ext
作为PHP文件解析
Ngnix在遇到