title: 文件上传/文件包含漏洞学习
date: 2016-04-25 21:52:19
categories: 安全
tags: Web安全
** 文件上传漏洞 **
在Web程序中,经常需要用到文件上传的功能。如用户或者管理员上传图片,或者其它文件。如果没有限制上传类型或者限制不严格被绕过,就有可能造成文件上传漏洞。如果上传了可执行文件或者网页脚本,就会导致网站被控制甚至服务器沦陷。
常见漏洞原因主要有:
服务器皮配置不当,如开启PUT方式;文本编辑器漏洞;过滤不严上传绕过;解析漏洞等
上传方式
1、解析漏洞
IIS 6.0 解析漏洞:
目录解析:在网站中建立名称为*.asp、.asa格式的文件夹时。其目录下的任意文件都会被当做asp执行。
文件解析:当文件名为.asp;1.jpg 时,也会被当做asp执行。这时因为分号后面的不被解析。
Apache 解析漏洞:
Apache在解析文件时,是从右到左,如果遇到不认识的扩展名,就会继续向左判断。例如1.php.rar,Apache回将其当做php解析。
IIS 7.0/IIS 7.5/ Nginx <0.8.3畸形解析漏洞:当访问http://xxx.xom/1.jpg/1.php时,此时1.php不存在,会将1.jpg当做php来解析。这是因为在php配置中cgi.fi: x_pathinfo这个选项开启时,当访问http://xxx.xom/1.jpg/1.php,1.php不存在,所有php会向前递归解析,于是造成解析漏洞。
2、绕过上传检测
1.有些上传检测是在客户端使用Javascript进行验证,此时可以使用浏览器f12调试功能修改js来绕过。
2.00截断:将普通的webshell文件更改后缀名为jpg,如xxx.jpg然后进行上传。上传时使用burpsuite工具进行拦截。此时在数据中更改文件名为 xxx.php.jpg,然后点击hex编辑16进制。将.jpg中的.的16进制2e更改为00。如图
此时文件名为:
此时,点击go进行上传,最终上传文件为xxx.php
3、服务器配置不当
WebDAV是一种基于 HTTP 1.1协议的通信协议.它扩展了HTTP 1.1,在GET、POST、HEAD等几个HTTP标准方法以外添加了一些新的方法。使应用程序可直接对Web Server直接读写,并支持写文件锁定(Locking)及解锁(Unlock),还可以支持文件的版本控制。当WebDAV开启PUT,MOVE,COPY,DELETE方法时,攻击者就可以向服务器上传危险脚本文件。
此时可以使用OPTIONS探测服务器支持的http方法,如果支持PUT,就进行上传脚本文件,在通过MOVE或COPY方法改名。当开启DELETE时还可以删除文件。
参考:http://wiki.wooyun.org/server:httpput
修复上传漏洞
1、白名单验证
在服务器后端,使用白名单进行验证可以有效防御。
2、目录限制
上传后指定目录进行存储,可以防止目录解析漏洞。
3、文件重命名
上传后对文件名进行随机重命名,同时对后缀进行拼接,重新组成一个文件名。
文件包含漏洞
简介
在脚本语言中经常会用到其它的文件,所以都提供了文件包含功能,如果不对可以包含的文件进行限制,就有可能会导致文件包含漏洞。文件包含分为本地文件包含和远程文件包含。
文件包含漏洞可以读取敏感文件,配合文件上传功能可以得到webshell,远程文件包含可以直接远程包含shell。
本地文件包含利用
以PHP为例。PHP中提供了四个文件包含的函数,分别是 include(),include_once(),require(),require_once()
以DVWA为例:
页面中存在3个链接,分别为file1.php,file2.php,file2.php,当打开file1.php时,url链接为http://127.0.0.1/DVWA/vulnerabilities/fi/?page=file1.php
源代码如下
$file = $_GET[ 'page' ];
if( isset( $file ) )
include( $file );
else {
header( 'Location:?page=include.php' );
exit;
}
首先接受f i l e , 当 存 在 时 就 会 包 含 该 页 面 , 否 则 就 跳 转 到 i n c l u d e . p h p , 然 而 我 们 可 以 对 输 入 的 file,当存在时就会包含该页面,否则就跳转到include.php,然而我们可以对输入的file,当存在时就会包含该页面,否则就跳转到include.php,然而我们可以对输入的file进行控制。当输入
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=../../../phpinfo.php时就可以打开phpinfo.php,由此可以读取敏感文件。
如图
并且当包含的文件中有符合php语法规范的语句时,也会将其当做php执行
例如创建一个phpinfo.txt文本,内容为:
<?php
phpinfo()
?>
当包含此文件时也会将其当做php文件执行。当包含非php语法规范的文件时,会打印其源代码。
如果存在文件上传功能,但是没有漏洞时,可以上传一个图片木马,由于没有限制导致无法被解析成为php时,就可以使用文件包含漏洞进行利用。
本地文件包含也可以用来读取敏感文件。
如windows下:
c:\boot.ini
c:\windows\system32\inetsrv\MetaBase.xml
c:\windows\php.ini
c:\windows\my.ini
linux下:
/etc/passwd
/etc/shadow
/var/www/conf/httpd.conf
/var/httpd/conf/php.ini
/var/httpd/conf/httpd.conf
本地文件包含也可以用来包含session文件,日志文件、上传的临时文件,缓存文件等等
远程文件包含利用
当php配置中allow_url_fopen和allow_url_include是打开时,就可以尝试包含远程文件,此时可以直接用来包含webshell等脚本文件。
同理也可以使用https或者ftp或者http
使用PHP封装协议:
如php流filter http://127.0.0.1/DVWA/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=index.php
此时访问次链接就会得到网页源码的base64代码。
php://input可以执行文件
当访问http://127.0.0.1/DVWA/vulnerabilities/fi/?page=php://input时,使用burpsuite进行截取
在post中提交数据即可,如<?php system('uname -a') ?>,如图
当后缀名被固定时,可以使用截断包含。
如:
$file = $_GET[ 'page' ];
if( isset( $file ) )
include( $file ).".php";
else {
header( 'Location:?page=include.php' );
exit;
}
当包含时只输入文件名,不输入后缀。但此时
可以输入?page=../../../../../../../../../etc/passwd%00
%00会截断。这种方法需要 magic_quotes_gpc=off,PHP小于5.3有效。否则%00会被转义
php小于5.3时,也可以利用最大目录长度的限制可以到达截断,如
../../../../../../(此处省略)/../etc/passd
在linux为4096字节,windows下256字节。
另外可以使用?来实现伪截断
漏洞修复
1、设置allow_url_include和allow_url_fopen为关闭
2、对可以包含的文件进行限制,可以使用白名单的方式,或者设置可以包含的目录,如open_basedir
3、尽量不使用动态包含