突破本地验证继续上传
一、前言
Web应用程序的编写,在满足其功能的同时却鲜有人关注其安全性,从市场上推出的各类Web应用防火墙不难理解,Web应用程序主要面临哪些安全威胁呢?如Sql注入、网页木马、表单绕过、跨站脚本、Xpath注入、口令爆力破解、客户端伪造请求
…等,而其漏洞根源在于开发者完全没有安全意识到而导致的。而本文将和大家讨论本地验证的缺陷,本地验证的最大的优点应该是减轻服务器端的计算负荷,而其带来的安全胁威却足以令服务器沦陷为肉机。
二、突破本地验证
本地验证的方法,一般是使用javaScript脚本简单验证,比如上传格式的验证,输入内容长度的验证,如果服务器端也不进行二次验证的话,易导致恶意攻击者只需在本地稍作修改就可以实现完全意义上的绕过。比如前些年比较流行的上传漏洞,其成因一般是因为对上传的文件类型或者扩展名过滤不严格造成的,导致可以直接或间接上传脚本木马,在检测一网站时,从扫描结果得到一上传网页,如图:
查看页面源代码时,发现判断上传后缀是使用运行在本地的JS代码。代码如下:
<script type="text/javascript" language="Javascript1.1">
function validateDictCodeLibForm() //(validateForm )
{
var physical = document.getElementById("upF").value;
if(physical.length>0){
var length = physical.length;
var charindex = physical.lastIndexOf(".");
var ExtentName = physical.substr(charindex,4)
if(!(ExtentName == ".gif" || ExtentName == ".png"
|| ExtentName == ".jpg" || ExtentName == ".bmp" || ExtentName == ".jpeg"))
{
alert("商家图片只支持.gif/png/jpg/bmp/jpeg四种格式");
return false;
}
}
else
{
alert("请选择您要上传的商家图片");
return false;
}
return true;
}
function GetPicPath(obj)
{
var physical = document.getElementById(obj).value;
if(physical.length>0){
var length = physical.length;
var charindex = physical.lastIndexOf(".");
var ExtentName = physical.substr(charindex,4)
if(!(ExtentName == ".gif" || ExtentName == ".png" || ExtentName == ".jpg" || ExtentName == ".bmp" || ExtentName == ".jpeg"))
{
alert("商家图片只支持.gif/png/jpg/bmp/jpeg四种格式");
}
}
}
</SCRIPT>
提交表单的代码如下:
<form name="photoimgForm" method="post" action=
"/photoimgAction.do?method=savePhotoimg"
enctype="multipart/form-data" onsubmit="return validateDictCodeLibForm()">
代码里“action”指的就是提交地址。针对上面简单的利用方法是:
只需要把上传页面保存到本地,扩展名必须是html或者是htm。再为提交地址补全路径,如上面的地址修改成
http://www.xxx.com/photoimgAction.do?method=savePhotoimg
即代码:
<form name="photoForm" method="post"
action="http://www.xxx.com/photoimgAction.do?method=savePhotoimg"
enctype="multipart/form-data" onsubmit="return validateDictCodeLibForm()">
点击“保存”按钮就可以在没有文件名后缀限制能直接上传脚本了。
当然这种方法仅仅是对上传页面后缀为htm或者html的利用。
当遇上到动态页面或者有更多限制时,还可以用Firefox的Firebug的插件进行动态调试,如图:
可以动态调试JavaScript,添加监控点、断点,进行实时修改过程参数。但这种方法在利用时,可能会有些麻烦多处添加断点。
一种更简单的方法是使用Opera浏览器,先启动Opera浏览器访问上传页面,点击查看源代码,如图:
修改”.gif”为”.jsp”,再点击左上角的应用,修改过的源代码就已经应用到当前浏览的页面,通过修改javascript的本地验证流程,实行绕过上传。
返回页面直接上传,如图:
三、结束
许多Web程序编写者,都喜欢把一些验证放在客户端,比如上传的后缀格式验证,用户和密码的验证等直接往服务端传送,而在服务端完全没有验证而直接利用。从而导致恶意攻击者只要在本地稍作修改就可以直接绕过本地验证,而本质上这种验证形同虚设,毫无意义。