# 一、漏洞环境信息

http://127.0.0.1:8080/ssrf/okhttp?url=http://www.baidu.com/img/baidu.svg

# payload http://127.0.0.1:8080/ssrf/okhttp?url=http://www.taobao.com

# 二、修复说明

# service层 public String getUrl(String url) 添加修复代码分析

SSRF核心代码


@Service
public class okHttpServiceImpl implements okHttpService {

    private final OkHttpClient client = new OkHttpClient();

    @Override
    public String getUrl(String url) throws IOException {
        //输入过滤
        Boolean urlIsValid = urlCheck.isValid(url);

        if (!urlIsValid){
            return "非法URL";
        }

        //发起http请求获取数据
        Request request = new Request.Builder().url(url).build();

        Response response = client.newCall(request).execute();
        if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

        return response.body().string();
    }
}

SSRF-URL校验函数

/*
* url 检测
* */
public class urlCheck {
    public static Boolean isValid(String url){
        //URL白名单列表
        ArrayList<String> whiteHost = new ArrayList<>();
        whiteHost.add("www.baidu.com");
        whiteHost.add("www.qq.com");

        //白名单端口号
        int whitePort = 80;
        URL checkUrl = null;
        try {
            checkUrl = new URL(url);
            String host = checkUrl.getHost();  //域名
            int port = checkUrl.getPort(); //端口

            if (whiteHost.indexOf(host.toLowerCase()) == -1){
                return false;
            }

            if (port==-1){  //表示没有端口号,需要通过http和https进行判断
                if (url.toLowerCase().startsWith("https")){
                    return false;
                }
            }else if (whitePort != port ){
                return false;
            }else{
                return true;
            }

        } catch (MalformedURLException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
}

# 三、小结

  • 成因:输入未校验
  • 位置:Service层
  • 修复:参数输入过滤
    • 1.限制域名白名单
    • 2.限制端口白名单
    • .....