首页 > 编程语言 >java.net.URL getHost因#@同时存在时优先级问题导致的SSRF

java.net.URL getHost因#@同时存在时优先级问题导致的SSRF

时间:2023-02-27 20:35:59浏览次数:37  
标签:baidu java String SSRF URL import com

#作为锚点,后面的会忽略;@ 作为登录信息,前面的会忽略
对于java.net.URL取主机 getHost()函数,当#@同时存在时,高版本#优先,取#前的;低版本@优先,取@后的。

从而导致低版本(具体各小版本号没测试)用getHost时, my_host#@baidu.com 取@后baidu.com绕过白名单,而请求函数等取#前my_host,造成漏洞。

源自真实漏洞

pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>demo_collection</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>7</maven.compiler.source>
        <maven.compiler.target>7</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.5</version>
        </dependency>
    </dependencies>

</project>

漏洞代码

import org.apache.commons.lang3.StringUtils;
import java.net.URL;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;


public class ssrf_bypass_case {
    public static void main(String[] args){
        // 正常情况,#作为锚点,后面的会忽略;@ 作为登录信息,前面的会忽略
        // 同时遇到 # 和 @ 时,不同处理函数优先级不同
        // JAVA 7版本中,java.net.URL gethost   @比#优先,取后面a.baidu.com
        // (JAVA 8中,取#前面)
        boolean check_result = isValidPictureUrl("https://aa.dnslog.cn#@a.baidu.com/");
        if(check_result)
            System.out.println("pass");
            // 接下来HTTP请求,#比@优先,取#前面aa.dnslog.cn
        else
            System.out.println("not pass");
    }

    // 图片的协议
    private static final String[] PICTURE_PROTOCOL_ARR = new String[]{
            "https",
            "http"
    };

    // wos域名的后缀
    private static final Set<String> WOS_DOMAIN_SUFFIX_SET = new HashSet<>(
            Arrays.asList("a.baidu.com", "b.baidu.com"));

    public static boolean isValidPictureUrl(String urlStr) {
        // 判断是否为空
        if (StringUtils.isBlank(urlStr)) {
            return false;
        }

        // 判断是否以http、https开头
        boolean protocolFlag = false;
        for (String pictureProtocol : PICTURE_PROTOCOL_ARR) {
            if (urlStr.startsWith(pictureProtocol)) {
                protocolFlag = true;
                break;
            }
        }
        if (!protocolFlag) {
            return false;
        }

        URL url;
        try {
            url = new URL(urlStr);
        } catch (Exception e) {
            return false;
        }
        String host = url.getHost();
        return WOS_DOMAIN_SUFFIX_SET.contains(host);
    }
}

标签:baidu,java,String,SSRF,URL,import,com
From: https://www.cnblogs.com/huim/p/17161760.html

相关文章

  • javascript的void运算符
    1<!DOCTYPEhtml>2<htmllang="en">34<head>5<metacharset="UTF-8">6<metahttp-equiv="X-UA-Compatible"content="IE=edge">7......
  • Javasricpt总结(三)
    typeof运算符返回一个字符串,表示操作数的类型console.log(typeof42);//Expectedoutput:"number"instanceof运算符用于检测构造函数的prototype属性是否出现在某......
  • JAVA加载PMML算法模型
    注:加载失败时尝试修改pmml文件版本为4.3依赖<dependency><groupId>org.jpmml</groupId><artifactId>pmml-evaluator</artifactId><version>1.4.1</versi......
  • java用JwtUtils生成token
    importio.jsonwebtoken.*;importjavax.crypto.spec.SecretKeySpec;importjava.security.Key;importjava.util.Date;importjava.util.Map;importjava.util.UUID......
  • java新增注解映射字段
    1.注解样例:新建注解@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.FIELD)public@interfaceMyName{publicStringvalue()default"";}Retenti......
  • java netty socket实例:报文长度+报文内容,springboot
    前言说实话,javanetty方面的资料不算多,尤其是自定义报文格式的,少之又少自己写了个简单的收发:报文长度+报文内容发送的话,没有写自动组装格式,自己看需求吧,需要的话,自己完......
  • CouldNotLoadArgumentException[ 无法加载指定的文件/URL: C:\Users\獆礬AppData\L
    异常错误CouldNotLoadArgumentException[无法加载指定的文件/URL:C:\Users\6鳿AppData\Local\Temp\javaws20]atcom.sun.javaws.Main.launchApp(UnknownSource)atcom.s......
  • Java方法:方法的重载、命令行传参、递归
    Java方法:方法的重载、命令行传参、递归方法的重载重载就是在一个类中,有相同的函数名称,但是形参不同的函数。方法重载的规则:方法名称必须相同;参数列表必须不同(个......
  • java第二天关键字
        第一个关键字class ......
  • javascript尾递归优化
    JS中的递归我们来看一个阶乘的代码functionfoo(n){if(n<=1){return1;}returnn*foo(n-1);}foo(5);//120下面分析一下,代码运行过程中,......