- 文件上传漏洞原理
文件上传漏洞是指由于程序员未对上传的文件进行严格的验证和过滤,导致用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。这种攻击方式是最为直接和有效的,“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。
即文件上传漏洞的原理是web应用程序没有将用户提交的数据文件和Web应用程序代码进行有效的隔离,混淆了两者的边界,进而把恶意用户提交的含有恶意代码的文件被中间件解析执行。
- 什么是Web容器?
web容器是一种服务程序,在服务器一个端口就有一个提供相应服务的程序,而这个程序就是处理从客户端发出的请求,如tomcat、apache、nginx等等。(可以理解为给编程语言提供环境)
- 什么是中间件?
提供系统软件和应用软件之间连接的软件,以便于软件各部件之间的沟通。中间件处在操作系统和更高一级应用程序之间。
- 什么是容器?
给处于其中的应用程序组件(ASP,JSP,PHP)提供一个环境。使处于其中的应用程序组件之间跟容器中的环境变量接口交互,不必关注其他系统问题。
- 什么是服务器?
www服务器或http服务器。提供web信息游览服务。它只需支持http协议、html文档格式以及url,向游览器提供服务的程序。
- Webshell简介:
WebShell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称之为一种网页后门。攻击者在入侵了一个网站后,通常会将这些asp或php后门文件与网站服务器web目录下正常的网页文件混在一起,然后使用浏览器来访问这些后门,得到一个命令执行环境,以达到控制网站服务器的目的(可以上传下载或者修改文件,操作数据库,执行任意命令等)。
WebShell后门隐蔽较性高,可以轻松穿越防火墙,访问WebShell时不会留下系统日志,只会在网站的web日志中留下一些数据提交记录,没有经验的管理员不容易发现入侵痕迹。攻击者可以将WebShell隐藏在正常文件中并修改文件时间增强隐蔽性,也可以采用一些函数对WebShell进行编码或者拼接以规避检测。除此之外,通过一句话木马的小马来提交功能更强大的大马可以更容易通过应用本身的检测。<?php eval($_POST[a]); ?>就是一个最常见最原始的小马。
- 什么是IIS?
IIS全称是互联网信息服务,包括FTP/FTPS、NNTP、HTTP/HTTPS、SMTP等服务。
- 什么是文件解析?
当服务器接收到一个HTTP请求的时候,IIS首先需要决定如何去处理这个请求(服务器处理.aspx和.html肯定是不一样的),根据的是文件的后缀名。
服务器获取所请求的页面(也可以是文件)的后缀名后接下来会在服务器端寻找可以处理这类后缀名的应用程序,如果IIS找不到可以处理此类文件的应用程序,那么IIS将直接把这个文件返还给客户端。
造成文件上传漏洞的原因以及原理:
常见文件上传漏洞位置:
- 上传用户头像
- 上传文章的附件
- 上传个人身份认证信息
- 上传提交相关的资料
常见文件上传漏洞分析
文件上传漏洞的攻击与防御
1. 任意文件上传(不做任何限制)
任意文件上传漏洞是指web应用系统没有对用户上传的文件做任何校验就直接上传到服务器,恶意用户可以直接上传一句话木马到web服务器,从而控制web服务器。
2.客户端检测(前台限制文件拓展名)
校验方法:通过JavaScript来校验上传文件的后缀是否合法,可以采用白名单,也可以采用黑名单的方式
<html>
<head>
<title>图片上传</title>
<script type="text/javascript">
function checkFile() {
var flag=false; //是否可以上传的标志位
var str=document.getElementById("file").value; //获取文件名
str=str.substring(str.lastIndexOf('.')+1); //得到扩展名
var arr=new Array('png','bmp','gif','jpg'); //允许上传的扩展名
for(var i=0;i<arr.length;i++) {
if(str==arr[i]) {
flag=true; //判断文件名是否合法
}
}
if(!flag) {
alert('文件不合法');
}
return flag;
}
</script>
</head>
<body>
<from action="upload.php" method="post" onsubmit="checkFile" enctype="multipart/form-data">
<input type="file" name="file" id="file" /><br/>
<input type="submit" value="提交" name="submit" />
</form>
</body>
</html>
upload.php用来接收文件,在接受文件后,将文件重命名放到本目录下。
<?php
if(isset($_POST["submit"])) {
$name= $_FILES['file']['name']; //接收文件名
$name=md5(data('Y-m-d h:m:s')).strrchr($name,"."); //文件名重命名操作,保留原有扩展名
$size=$_FILES['files']['size']; //接收文件大小
$tmp=$_FILES['file']['tmp_name']; //临时路径
move_upload_file($tmp,$name); //移动临时文件到当前文件目录
echo "文件上传成功 path:".$name;
}
?>
原文链接:https://blog.csdn.net/weixin_39190897/article/details/85334893
判断方式:在浏览器加载文件,但还未点击上传按钮时便弹出对话框,内容如:只允许上传.jpg/.jpeg/.png后缀名的文件,而此时并没有发送数据包。
绕过方法:
(1)禁用JS:在本地浏览器客户端禁用JS即可。可使用火狐浏览器的NoScript插件、IE中禁用掉JS等方式实现。
禁用JS操作手册:禁用JS操作手册
(2)修改JS:
a:修改JS,将自定义的文件类型后缀添加进去
b:删除对js验证脚本的调用,使其不能对上传文件类型做检测,从而达到绕过的目的。同样的通过审查元素,查看到form表单的内容,form的开始标签为<form enctype="multipart/form-data" method="post" onsubmit="return checkFile()">
,其中的οnsubmit="return checkFile()"的作用就是当点击上传按钮的时候,就会触发js验证脚本,所以将这一部分删除,就可以成功绕过检测:
原文链接:https://blog.csdn.net/weixin_39190897/article/details/85334893
(3)用Burp抓包改包:过前台脚本检测扩展名,就是将所要上传文件的扩展名更改为符合脚本检测规则的扩展名,通过BurpSuite工具,截取数据包,并将数据包中文件扩展名更改回原来的,达到绕过的目的。
例如:文件名本来为【evil.jpg】,上传时,用BurpSuite截包后,将数据包中的名字改为【evil.php】(或其它脚本类型)即可
3.服务端校验
(1)拓展名校验
情况一:黑白名单验证
(1)黑名单过滤方式
黑名单过滤是一种不安全的方式,黑名单定义了一系列不安全的扩展名,服务器端在接收文件后,与黑名单扩展名对比,如果发现文件扩展名与黑名单里的扩展名匹配,则认为文件不合法。
$postfix = end(explode('.','$_POST['filename']);
if($postfix=='php'||$postfix=='asp'||$postfix=='sh'){
echo "invalid file type";
return;
}
(2)白名单过滤方式
白名单的过滤方式与黑名单恰恰相反,黑名单是定义不允许上传的文件扩展名,而白名单则是定义允许上传的扩展名,白名单拥有比黑名单更好的防御机制。如:
$WhiteList=
array(rar’,jpg’,png,bmpy,gif,jpg;doc);
在获取到文件扩展名后对 WhiteList数组里的扩展名迭代判断,如果文件扩展名被命中,程序将认为文件是合法的,否则不允许上传。
$postfix = end(explode('.','$_POST['filename']);
if($postfix=='jpg'||$postfix=='png'||$postfix=='gif'){
//save the file and do something next
} else {
echo "invalid file type";
return;
}
白名单策略是更加安全的,通过限制上传类型为只有我们接受的类型,可以较好的保证安全,因为黑名单我们可以使用各种方法来进行注入和突破。
**原理:**当浏览器将文件提交到服务器端的时候,服务器端会根据设定的黑白名单对浏览器提交上来的文件拓展名进行检测,如果上传的文件拓展名不符合黑白名单的限制,则不予上传,否则上传成功。
绕过方法::在一些Web server中,存在解析漏洞
1.老版本的IIS6中的目录解析漏洞,如果网站目录中有一个 /.asp/目录,那么此目录下面的一切内容都会被当作asp脚本来解析
2.老板本的IIS6中的分号漏洞:IIS在解析文件名的时候可能将分号后面的内容丢弃,那么我们可以在上传的时候给后面加入分号内容来避免黑名单过滤,如 a.asp;jpg
3.旧版Windows Server中存在空格和dot漏洞类似于 a.php. 和 a.php[空格] 这样的文件名存储后会被windows去掉点和空格,从而使得加上这两个东西可以突破过滤,成功上传,并且被当作php代码来执行
4.nginx(0.5.x, 0.6.x, 0.7 <= 0.7.65, 0.8 <= 0.8.37)空字节漏洞 xxx.jpg%00.php 这样的文件名会被解析为php代码运行(fastcgi会把这个文件当php看,不受空字节影响,但是检查文件后缀的那个功能会把空字节后面的东西抛弃,所以识别为jpg)
5.apache1.x,2.x的解析漏洞,上传如a.php.rar a.php.gif 类型的文件名,可以避免对于php文件的过滤机制,但是由于apache在解析文件名的时候是从右向左读,如果遇到不能识别的扩展名则跳过,rar等扩展名是apache不能识别的,因此就会直接将类型识别为php,从而达到了注入php代码的目的
情况二:header MIME验证
原理:HTTP协议规定了上传资源的时候在Header中加上一项文件的MIMETYPE来识别文件类型,这个动作是由浏览器完成得,服务端可以检查此类型,不过这仍然是不安全的,因为HTTP header可以被发出者或者中间人任意的修改。
MIME参考手册
绕过方法:使用各种各样的工具(如burpsuite)强行篡改Header就可以,将Content-Type: application/php改为其他web程序允许的类型
Content-Type: image/jpg
Content-Type: image/png
Content-Type: text/plain。
情况三:目录验证
在文件上传时,程序通常允许用户将文件放到指定的目录中,然而有些Web开发人员为了让代码更健壮,通常会做一个操作,如果指定的目录存在,就将文件写入目录中,不存在则先建立目录,然后写入。
https://www.cnblogs.com/bmjoker/p/8970006.html
情况四:截断上传攻击
文件名后缀有一个%00字节,可以截断某些函数对文件名的判断。在许多语言函 数中,处理字符串的函数中0x00被认为是终止符
例如: 网站上传函数处理xxx.asp%00.jpg时,首先后缀名是合法的jpg格式,可以 上传,在保存文件时,遇到%00字符丢弃后面的 .jpg,文件后缀最终保存的后缀 名为xxx.asp