欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

ColdFusion FlashGateway 反序列化漏洞分析

来源:本站整理 作者:佚名 时间:2019-03-28 TAG: 我要投稿

2019年2月12日,Adobe官方发布了针对Adobe ColdFusion的安全更新补丁,编号为APSB19-10。但是针对该漏洞的分析,目前网上我只见到一篇文章,https://paper.seebug.org/811/, 虽然文章没有给出太多的细节(对于我们小白而言)但根据该文章的提示,我们还是可以定位分析该漏洞,成功写出漏洞利用代码的。下面我就介绍下,我整个的分析过程。
 
环境搭建
讲真,这个环境搭建真心不太容易,想从网上下一款老版的ColdFusion安装包真的很难,还好我很久之前下过,所以这里省了我很多工夫。
安装包:ColdFusion_2016_WWEJ_win64.exe update3 版本存在漏洞。
安装完之后,默认后台地址为http://127.0.0.1:8500/CFIDE/administrator/index.cfm
 
漏洞定位
根据seebug文章中的介绍,漏洞出现在FlashGateway中。在web.xml中搜索flashgateway,其中一条信息如下
 
servlet-mapping id="coldfusion_mapping_1">
servlet-name>FlashGatewayservlet-name>
url-pattern>/flashservices/gateway/*url-pattern>
servlet-mapping>
访问http://127.0.0.1:8500/flashservices/gateway/,发现该网址可以访问,猜测出现漏洞的就是该网站。
根据seebug文章的规避方案可知,漏洞和gateway-config.xml也有关,于是为了方便后面漏洞调试,我们把中的配置全部打开(后面测试可知,其实只需要打开flashgateway.adapter.java.JavaAdapter配置即可)重启服务coldfusion.exe -restart -console
知道网站漏洞路径,下面我们就要定位漏洞代码,在cfusion的lib目录下有个文件flashgateway.jar,是不是像极了爱情,我们jd-gui打开该jar,可以看到,漏洞所涉及的类都在这个jar包中,真好。
 
漏洞分析
(1)简要分析
我们先到web.xml中,看下FlashGateway这个servlet的流程,从如下配置文件中可知,在访问http://127.0.0.1:8500/flashservices/gateway/后,会先到coldfusion.bootstrap.BootstrapServlet中,通过参数配置,大概可以猜测(事实也是如此),该类会加载flashgateway.controller.GatewayServlet。

GatewayServlet类中service(HttpServletRequest req, HttpServletResponse res),接收来之http的请求,然后调用context = this.gateway.invoke(context)进入GateWay类中的invoke()

This. serialFilter由CreateFilters赋值

程序进入SerializationFilter的invoke()函数,该函数中对传入的数据进行了反序列化处理。
 
context.setResponseMessage(new ActionMessage());
MessageDeserializer deserializer = new MessageDeserializer(super.gateway);
deserializer.setDebugBuffer(debugBuffer);
deserializer.setInputStream(context.getHttpRequest().getInputStream());
try {
ActionMessage m = new ActionMessage();
context.setRequestMessage(m);
deserializer.readMessage(m);
success = true;
}
函数中创建MessageDeserializer对象,然后调用readMessage(m),将传入的ActionMessage数据反序列化,并复制给context中的相关变量。
这里我们先简单看下ActionMessage的成员变量
 
public class ActionMessage implements Serializable {
private static final int CURRENT_VERSION = 0;
private int version;
private ArrayList headers = null;
private ArrayList bodies = null;
其有两个数组列表headers和bodies。类型分别为MessageHeader、MessageBody。其中MessageBody和漏洞利用息息相关,所以这里我们重点关注其成员变量
 
public class MessageBody implements Serializable, GatewayConstants {
private String targetURI;
private String responseURI;
protected Object data;
public String adapterName;
public String serviceName;
public String functionName;
public List parameters;
public List roles;
public boolean useBasicAuthentication;
public boolean useCustomAuthentication;
public String serviceType;
重要的变量有targetURL、data、serviceName、functionName、paramters。
我们再回到反序列化函数readMessage(m)中
 
public void readMessage(ActionMessage m) throws IOException {
int version = this.in.readUnsignedShort();
m.setVersion(version);
int headerCount = this.in.readUnsignedShort();
for(int i = 0; i new MessageHeader();
m.addHeader(header);
this.readHeader(header, i);
}
int bodyCount = this.in.readUnsignedShort();
for(int i = 0; i new MessageBody();
m.addBody(body);
this.readBody(body, i);
}
}
函数功能就是根据格式(header、body)对数据进行反序列化。
下面引用seebug上的一段话:
完成序列化过程后,此时ActionContext context中的内容即为输入流中精心构造的ActionMessage信息。在flashgateway.filter.AdapterFilter的invoke方法中,读取ActionContext中的MessageBody信息赋值给serviceName、functionName、parameters等,通过adapter=locateAdapter(context, serviceName, functionName, parameters, serviceType)方法得到flashgateway.adapter.java.JavaBeanAdapter类型的adapter,然后执行JavaBeanAdapter的invokeFunction方法。关键代码如下:

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载