文/

1. 前言
Web应用程序的编写,在满足其功能的同时却鲜有人关注其安全性,从市场上推出的各类Web应用防火墙不难理解,Web应用程序主要面临哪些安全威胁呢? 如Sql注入、网页木马、表单绕过、跨站脚本、Xpath注入、口令爆力破解、客户端伪造请求 …等,而其漏洞根源在于开发者完全没有安全意识到而导致的。而本文将和大家讨论本地验证的缺陷,本地验证的最大的优点应该是减轻服务器端的计算负荷,而其 带来的安全胁威却足以令服务器沦陷为肉机。
2. 突破本地验证
本地验证的方法,一般是使用javaScript脚本简单验证,比如上传格式的验证,输入内容长度的验证,如果服务器端也不进行二次验证的话,易导致恶意 攻击者只需在本地稍作修改就可以实现完全意义上的绕过。比如前些年比较流行的上传漏洞,其成因一般是因为对上传的文件类型或者扩展名过滤不严格造成的,导 致可以直接或间接上传脚本木马,在检测一网站时,从扫描结果得到一上传网页,如图:

查看页面源代码时,发现判断上传后缀是使用运行在本地的JS代码。代码如下:

<script type="text/javascript" language="Javascript1.1">
function validateDictCodeLibForm() //(validateForm )
{
	var phal = document.getElementById("upF").value;
	if(phal.length>0){
		var length = phal.length;
		var charindex = phal.lastIndexOf(".");
		var ExtentName = phal.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 phal = document.getElementById(obj).value;
		if(phal.length>0){
			var length = phal.length;
			var charindex = phal.lastIndexOf(".");
			var ExtentName = phal.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()">
</form>

代码里“action”指的就是提交地址。针对上面简单的利用方法是:
只需要把上传页面保存到本地,扩展名必须是html或者是htm。再为提交地址补全路径,如上面的地址修改成

http://www.nuanyue.com/photoimgAction.do?method=savePhotoimg

即代码:

点击“保存”按钮就可以在没有文件名后缀限制能直接上传脚本了。
当然这种方法仅仅是对上传页面后缀为htm或者html的利用。当遇上到动态页面或者有更多限制时,还可以用Firefox的Firebug的插件进行动 态调试,如图:

可以动态调试JavaScript,添加监控点、断点,进行实时修改过程参数。但这种方法在利用时,可能会有些麻烦多处添加断点。一种更简单的方法是使用 Opera浏览器,先启动Opera浏览器访问上传页面,点击查看源代码,如图:

修改”.gif”为”.jsp”,再点击左上角的应用,修改过的源代码就已经应用到当前浏览的页面,通过修改javascript的本地验证流程,实行绕 过上传。如图:

返回页面直接上传,如图:

3. 结束
许多Web程序编写者,都喜欢把一些验证放在客户端,比如上传的后缀格式验证,用户和密码的验证等直接往服务端传送,而在服务端完全没有验证而直接利用。 从而导致恶意攻击者只要在本地稍作修改就可以直接绕过本地验证,而本质上这种验证形同虚设,毫无意义。

相关文章

本文还暂无回复

添加回复

支持 Ctrl+Enter 快速提交