URL重定向问题

服务端未对传入的跳转url变量进行检查控制,可能导致可恶意构造任意一个地址,诱导用户跳转,由于是从可行网站跳转出去,用户会比较信任,所以跳转漏洞一般用于钓鱼,进行欺骗用户。

检测时,需要找到网站中存在跳转链接的参数,常见登录界面一类。
尝试修改参数中的url,然后查看是否正常跳转或者查看其http响应头,host值是否包含了恶意构造的url。

在struts2中存在重定向漏洞,是由于缩写的导航重定向前缀 action:、redirect:等参数前缀的内容没被严格过滤导致重定向漏洞。
一般检测相关漏洞直接url后添加?redirect:+url成功执行则说明存在重定向漏洞。

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

修复:
若跳转的URL事先是可以确定的,包括url和参数的值,则可以在后台先配置好,url参数只需传对应url的索引即可,通过索引找到对应具体url再进行跳转;
若跳转的URL事先不确定,但其输入是由后台生成的(不是用户通过参数传人),则可以先生成好跳转链接然后进行签名,而跳转cg首先需要进行验证签名通过才能进行跳转;
若都不满足,url事先无法确定,只能通过前端参数传入,则必须在跳转的时候对url进行按规则校验:即控制url是否是公司授权的白名单或者是符合公司规则的url
参考代码:

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

通过对referer的限制:如果确定传递URL参数进入的来源,我们可以通过该方式实现安全限制,保证该URL的有效性,避免恶意用户自己生成跳转链接;
加入有效性验证Token:我们保证所有生成的链接都是来自于我们可信域的,通过在生成的链接里加入用户不可控的Token对生成的链接进行校验,可以避免用户生成自己的恶意链接从而被利用,在跳转时做判断,指定跳转的值。当用户访问需要跳转URL的页面时,生成随机token,并保存到Cookie中,后台应用程序在跳转前,判断token是否和cookie中的token一致。
理论上讲,url跳转属于CSRF的一种,跳转url检测中也加入了CRLF头部注入漏洞的检测逻辑, 具体就是在请求参数中加入了%0d%0a这种测试代码,需要对这些参数进行删除处理(事实上:在判断到一个参数中包含 %00 -> %1f 的控制字符时都是不合法的,需对其进行删除)。
如果为struts2重定向漏洞 直接升级。

发布了16 篇原创文章 · 获赞 1 · 访问量 5946

猜你喜欢

转载自blog.csdn.net/weixin_44398914/article/details/104080303