java中url任意跳转漏洞的解决-kb88凯时官网登录

来自:网络
时间:2024-09-10
阅读:
免费资源网,https://freexyz.cn/

1 漏洞介绍

urlredirect url重定向漏洞也称url任意跳转漏洞,网站信任了用户的输入导致恶意攻击,url重定向主要用来钓鱼,比如url跳转中最常见的跳转在登陆口,支付口,也就是一旦登陆将会跳转任意自己构造的网站,如果设置成自己的url则会造成钓鱼。url跳转常见的地方包括:

  • 登陆跳转我认为是最常见的跳转类型,认证完后会跳转,所以在登陆的时候建议多观察url参数
  • 用户分享、收藏内容过后,会跳转
  • 跨站点认证、授权后,会跳转
  • 站内点击其它网址链接时,会跳转
  • 在一些用户交互页面也会出现跳转,如请填写对客服评价,评价成功跳转d88尊龙官网手机app主页,填写问卷,等等业务,注意观察url。
  • 业务完成后跳转这可以归结为一类跳转,比如修改密码,修改完成后跳转登陆页面,绑定银行卡,绑定成功后返回银行卡充值等页面,或者说给定一个链接办理vip,但是你需要认证身份才能访问这个业务,这个时候通常会给定一个链接,认证之后跳转到刚刚要办理vip的页面。

2 审计方法

结合业务场景,通过关键字在web层(controller、servlet类文件)中搜索一下关键字,确定漏洞的依据就是看是否直接转发、直接跳转、直接重定向的目的url是源于前端且没有处理。常见关键字如下:

3 审计案例

3.1 案例1-302 redirect

    
    title
    
@controller
@requestmapping("/urlredirection")
public class urlredirectioncontroller {
​
    //去重定向前端页面
    @getmapping("/toredirectpage")
    public string toredirectpage(){
        system.out.println("重定向漏洞页面");
        return "demo13";
    }
//302跳转
@getmapping("/urlredirection")
    public void urlredirection(httpservletrequest request, httpservletresponse response) throws ioexception {
    string url = request.getparameter("url");
    response.sendredirect(url);
    }
}

通过上述代码,能够得出,urlredirection方法接收了源于form表单的参数后直接通过

response.sendredirect(url)重定向,也就是说直接访问了来自前端url参数的url。

java中url任意跳转漏洞的解决

当提交之后会直接跳转到百度页面,因此具有一定的风险性

java中url任意跳转漏洞的解决

需要注意的是外部网址必须加http.www,只写域名仍然在改服务器上

java中url任意跳转漏洞的解决

3.2 案例2-301 redirect

    
    title
    
//去重定向前端页面
    @getmapping("/toredirectpage")
    public string toredirectpage(){
        system.out.println("重定向漏洞页面");
        return "demo13";
    }
    @requestmapping("/setheader")
    @responsebody
    public static void setheader(httpservletrequest request, httpservletresponse response) {
        string url = request.getparameter("url");
        response.setstatus(httpservletresponse.sc_moved_permanently); // 301 redirect
        response.setheader("location", url);
    }

同案例1的失效效果一样,只不过是后端发生跳转的类型不一致而已。

3.3 案例3-urlredirection重定向

    
    title
    
@getmapping("/redirect")
public string redirect(@requestparam("url") string url) {
return "redirect:"   url;
}

同案例1、2的效果一样,只不过是后端发生跳转的类型不一致而已。初次外获取参数的形式不一样,通过注解获取的。

四、修复意见(二选一)

1、将重定向改成转发

转发(前往),服务器内部的重定向,在servlet中通过requestdispatcher转发给另一个程序处理请

求,请求的数据依然在。所以forward相当于客户端向服务器发送一次请求,服务器处理两次,请求数

据不会消失且url地址只变化一次。因为转发只能在服务器内部进行(内部跳转),不会跳转到外

部。参考代码如下:

<%@ page contenttype="text/html; charset=utf-8" %>
    
    title
@requestmapping("/forward")
    @responsebody
    public static void forward(httpservletrequest request, httpservletresponse response) {
        string url = request.getparameter("url");
        requestdispatcher rd = request.getrequestdispatcher(url);
        try {
            rd.forward(request, response);
        } catch (exception e) {
            e.printstacktrace();
        }
    }

此时在提交百度一下,你就知道,发现无法跳转成功

2、白名单与黑名单相结合的限制

就是将需要重定向的目的url整理成白名单,在进行重定向前匹配,如果不在白名单中禁止重定向。

相关白名单校验参考代码如下:

/**
     * 同时支持一级域名和多级域名,相关配置在resources目录下url_safe_domain.xml文件。
     * 优先判断黑名单,如果满足黑名单return null。
     *
     * @param url the url need to check
     * @return safe url returns original url; illegal url returns null;
     */
    public string check throws ioexception {
        if (null == url){
            return null;
        }
        try {
            url url1 = new ;
            string host = url1.gethost();
            // 必须http/https
            if (!url1.getprotocol().equals("https") && !url1.getprotocol().equals("http")) {
                return null;
            }
​
            // 如果满足黑名单返回null
            if (blackdomains.contains(host)){
                return null;
            }
            for(string blockdomain: blackdomains) {
                if(host.endswith("."   blockdomain)) {
                    return null;
                }
            }
​
            // 支持多级域名
            if (safedomains.contains(host)){
                return url;
            }
​
            // 支持一级域名
            for(string safedomain: safedomains) {
                if(host.endswith("."   safedomain)) {
                    return url;
                }
            }
            return null;
        } catch (nullpointerexception | malformedurlexception e) {
            e.printstacktrace();
            return null;
        }
    }
}
​

例如黑名单和白名单的配置如下

safedomains=127.0.0.1,127.0.0.2
blackdomains=baidu.com,qq.com

当输入baidu.com时,将无法跳转。

java中url任意跳转漏洞的解决

当将baidu.com添加到白名单,同时从黑名单中剔除出去,将成功跳转

java中url任意跳转漏洞的解决

java中url任意跳转漏洞的解决

免费资源网,https://freexyz.cn/
返回顶部
顶部
网站地图