web安全/渗透测试--56--URL重定向

1、漏洞描述:

服务端未对传入的跳转url变量进行检查和控制,可能导致可恶意构造任意一个恶意地址,诱导用户跳转到恶意网站。由于是从可信的站点跳转出去的,用户会比较信任,所以跳转漏洞一般用于钓鱼攻击,通过转到恶意网站欺骗用户输入用户名和密码盗取用户信息,或欺骗用户进行金钱交易;也可能引发的XSS漏洞(主要是跳转常常使用302跳转,即设置HTTP响应头,Locatioin: url,如果url包含了CRLF,则可能隔断了http响应头,使得后面部分落到了http body,从而导致xss漏洞)。另外在struts2中存在重定向的漏洞,是因为struts2由于缩写的导航和重定向前缀“action:”、“redirect:”、“redirectAction:”等参数前缀的内容没有被正确过滤导致的开放式重定向漏洞。

2、检测方法

1、首先找到网站相关url中存在跳转链接的参数(常见的有登陆页面)。

2、在检测的同时,可以修改参数中的合法URL为非法URL,然后查看是否能正常跳转或者通过抓包工具获取其HTTP响应头中host:的值是否包含了任意的构造URL。

3、如果是struts2重定向漏洞,则可通过web扫描工具扫描发现,或者手工验证,直接在URL后添加?redirect:+指定钓鱼链接。
例如:10.1.82.53:9098/admin/login.action?redirect:http://diaoyu.com进行验证,或者:http://host/struts2-blank/example/X.action?action:%25{3*4},则证明存在URL重定向漏洞是存在的。

3、修复方案

以下为针对URL重定向漏洞的修复建议:

1、若跳转的URL事先是可以确定的,包括url和参数的值,则可以在后台先配置好,url参数只需传对应url的索引即可,通过索引找到对应具体url再进行跳转;

2、若跳转的URL事先不确定,但其输入是由后台生成的(不是用户通过参数传人),则可以先生成好跳转链接然后进行签名,而跳转cg首先需要进行验证签名通过才能进行跳转;

3、若1和2都不满足,url事先无法确定,只能通过前端参数传入,则必须在跳转的时候对url进行按规则校验:即控制url是否是公司授权的白名单或者是符合公司规则的url。

参考代码:

function checkURL (sURL)
{
	return (/^(https?:\/\/)?[\w\-.]+\.(yourDomainA|yourDomainB|yourDomainC)\.com($|\/|\\)/i).test(sUrl)||(/^[\w][\w\/\.\-_%]+$/i).test(sUrl)||(/^[\/\\][^\/\\]/i).test(sUrl) ? true : false;   
}

4、通过对referer的限制:如果确定传递URL参数进入的来源,我们可以通过该方式实现安全限制,保证该URL的有效性,避免恶意用户自己生成跳转链接;

5、加入有效性验证Token:我们保证所有生成的链接都是来自于我们可信域的,通过在生成的链接里加入用户不可控的Token对生成的链接进行校验,可以避免用户生成自己的恶意链接从而被利用,在跳转时做判断,指定跳转的值。当用户访问需要跳转URL的页面时,生成随机token,并保存到Cookie中,后台应用程序在跳转前,判断token是否和cookie中的token一致。

6、理论上讲,url跳转属于CSRF的一种,跳转url检测中也加入了CRLF头部注入漏洞的检测逻辑,具体就是在请求参数中加入了%0d%0a这种测试代码,需要对这些参数进行删除处理(事实上:在判断到一个参数中包含%00 -> %1f的控制字符时都是不合法的,需对其进行删除)。

7、如果为struts2重定向漏洞,则需要更新相关的struts2的版本到最新。

你可能感兴趣的:(web安全/渗透测试)