一、前言

这个问题也是最近CTF复现的过程中遇到的问题,打算单独拿出来记录一下

二、过程

后端导致SSRF的语句:

@RequestMapping({"/admin/{index}"})
···
WebClient webClient = WebClient.builder().baseUrl("http://localhost:8079/").build();
···
this.webClient.post().uri(index)

由于index是完全可控的,就算设置了baseUrl,请求的路径还是会被index覆盖,就造成了SSRF

按照我的理解访问服务器上的其他服务,传入的index应该是经过一次URL编码的:

http://localhost:8080 ==> http%3a%2f%2flocalhost%3a8080

但是后端没有收到请求,直接返回400错误

image-20221129225130438

经过测试后,发现只会对%2f报错

查资料后:

默认情况下Tomcat等服务器是拒绝url中带%2F或者%5C的URL,因为它们经浏览器解析之后就变成了/和,服务器默认是拒绝访问的,所以需要通过服务的配置来解决这个问题。

三、解决方法

1、修改启动类,添加系统参数

该参数就是用来解决URL中包含%2F的问题

System.setProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH", "true");

2、添加在%TOMCAT_HOME%/conf/catalina.properties文件中