上传图片被防火墙拦截_Web安全:文件上传漏洞

f1e1f71fa4670853b3d86b8e7da0b0a5.png

文章来源:计算机与网络安全

一般将文件上传归类为直接文件上传与间接文件上传。直接文件上传就是服务器根本没有做任何安全过滤,导致攻击者可以直接上传小马文件及大马文件(如ASP、ASPX、PHP、JSP及war文件等类型的小马文件及大马文件),从而得到目标站点的shell。间接文件上传就是服务器对用户上传的文件使用了安全策略:第一种安全策略是在程序代码中设置黑名单或者白名单;第二种安全策略是在Web应用层加一个WAF。对于第一种安全策略,当程序代码中设置的是黑名单的时候,攻击者可能会想办法绕过黑名单的限制,实现文件上传,进而得到shell。绕过白名单的限制亦同理,只是白名单策略的限制一般而言更难绕过。对于第二种安全策略,大家都知道WAF吧?WAF其实也是基于mod_security模块进行开发的,一个WAF功能及性能的好坏直接决定了网站的安全系数。所以,如果研究透WAF里的拦截规则,或许就有办法绕开WAF的拦截,从而实现SQL注入及文件上传等。一般情况下,攻击者会通过查找文件上传功能程序中的文件上传安全检测代码的漏洞,然后利用该漏洞绕过文件上传安全检测代码的限制,实现上传文件。接下来,我们来全面、细致地学习文件上传漏洞相关的知识,其具体类型包括JavaScript验证绕过、MIME类型验证、文件头内容验证、黑名单内容验证及白名单内容验证等。

1、JavaScript验证绕过

事实上,基于客户端的验证都是不安全的。接下来,我们来介绍客户端JavaScript验证绕过的情况,浏览器请求测试代码与服务器响应测试代码分别如下。

浏览器请求测试代码:js_bypass.html代码。

客户端JS验证绕过测试代码

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;

}

}

客户端JS验证绕过测试代码

请选择要上传的文件:

服务器响应测试代码:upload.php代码。

//客户端JavaScript验证绕过测试代码

$uploaddir = 'uploads/';

if (isset($_POST['submit']))

{

if (file_exists($uploaddir))

{

if (move_uploaded_file($_FILES['upfile']['tmp_name'], $uploaddir . '/' . )84Web安全漏洞原理及实战

}

else

{

exit($uploaddir . '文件夹不存在,请手工创建!');

}

}

?>

攻击者将上述测试代码分别放在客户端与服务器,开启浏览器,输入http://localhost:81/js_bypass.html,Web服务器返回信息如图1所示。

65af052b51afe3e5f15e080b26548b55.png

图1  返回信息

我们可以看到,不允许上传PHP文件,是谁不允许?查看代码,原来是JavaScript不允许上传PHP文件,代码如图2所示。

99eef35360bcd0dde3a1dc218c966782.png

图2  网页代码

文件上传安全检测代码如下。

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;

}

}

攻击者将js_bypass.html这个网页保存到本地,修改代码,将代码“var allow_ext = ".jpg|.jpeg|.png|.gif|.bmp|";”修改为“var allow_ext = ".jpg|.jpeg|.png|.gif|.bmp|.php";”,再将以下这段代码中action的内容修改为“action=" http://localhost:81/upload.php"”。全部修改完毕以后,保存js_bypass.html文件到C盘根目录。

请选择要上传的文件:

开启浏览器并输入file:///C:/js_bypass.html。尝试上传PHP文件并发送请求后,地址将跳转到localhost:81/upload.php,Web服务器返回信息如图3所示。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值