- 文件上传漏洞原理
文件上传漏洞是指网络攻击者上传了一个可执行的文件到服务器并执行。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。这种攻击方式是最为直接和有效的,部分文件上传漏洞的利用技术门槛非常的低,对于攻击者来说很容易实施。 - 什么是webshell
WebShell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称之为一种网页后门。攻击者在入侵了一个网站后,通常会将这些asp或php后门文件与网站服务器web目录下正常的网页文件混在一起,然后使用浏览器来访问这些后门,得到一个命令执行环境,以达到控制网站服务器的目的(可以上传下载或者修改文件,操作数据库,执行任意命令等)。- WebShell后门隐蔽较性高,可以轻松穿越防火墙,访问WebShell时不会留下系统日志,只会在网站的web日志中留下一些数据提交记录,没有经验的管理员不容易发现入侵痕迹。攻击者可以将WebShell隐藏在正常文件中并修改文件时间增强隐蔽性,也可以采用一些函数对WebShell进行编码或者拼接以规避检测。除此之外,通过一句话木马的小马来提交功能更强大的大马可以更容易通过应用本身的检测。<?php eval($_POST[a]); ?>就是一个最常见最原始的小马,以此为基础也涌现了很多变种,如<script language="php">eval($_POST[a]);</script>等
- 文件上传漏洞分类
- 客户端javascript检测
- 服务器端MIME类型检测
- 服务器端目录路径检测
- 服务器端文件扩展名检测
- 服务器端文件内容检测
下面推荐一个上传漏洞的靶场upload-labs
(要自己搭建)
这里演示下怎么绕过客户端javascript检测
-
首先打开自己搭建的靶场上传一个文件(我就上传了一个php文件)
点击上传(发现提示只能上传jpg、png、gif这几种格式的文件)发现上传失败
这是我们可以先上传一个1.jpg文件,然后用burp suite抓包进行修改
这里我修改了文件后缀改成1.php 、文件内容也可以修改。
接下来就可以把包放出去了(我们把地址复制出来在别的页面打开)
最后发现自己写的php页面测试指针可以运行
- 下面我们来看下关于文件上传前段过滤的核心代码
function checkFile() {
var file = document.getElementsByName('upload_file')[0].value;
if (file == null || file == "") {
alert("请选择要上传的文件!");
return false;
}
//定义允许上传的文件类型
var allow_ext = ".jpg|.png|.gif";
//提取上传文件的类型
var ext_name = file.substring(file.lastIndexOf("."));
//判断上传文件类型是否允许上传
if (allow_ext.indexOf(ext_name + "|") == -1) {
var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
alert(errMsg);
return false;
}
}
-
这里在演示下怎么绕过“服务器端MIME类型检测”
还是老步骤先上传一个文件(我还是上传的php文件)
这里讲的是“服务器端MIME类型检测”我就直接应用绕过方法了(不测试这是什么类型的“因为知道 ” 懒^_^) 先看下类型
下面看看能不能上传(上面这种类型上传)
我们改成"image/jpeg" 类型的试试 这里也要改下文件上传内容(改成php一句话木马)
发现上传成功
打开你的上传文件看看有没有错(我这里没有报错)
最后就是打开菜刀(添加完地址和参数 点击添加)
这是成果(可以找到上传的文件,这就是webshell)