0x00 关于Apache MyFaces
MyFaces是JSF Web框架的一个具体实现框架,同样也属于MVC范畴,但是与Struts不同的是,它强调基于组件和面向事件,具体可参考官方介绍(https://cwiki.apache.org/confluence/display/MYFACES/Index)。
0x01 ViewState
熟悉.NET的对ViewState应该比较熟悉,ViewState用于保存视图的状态。在JSF中ViewState是序列化的对象。既然是序列化对象,显然进行反序列化时会存在安全隐患。
0x02 风险面
其实15年的时候Frohoff 和 Lawrence就在AppSec California提及了MyFaces ViewState潜在的风险,所以Apache官方在后面的版本中(https://wiki.apache.org/myfaces/Secure_Your_Application)增加了安全机制。
具体而言,以下配置会影响反序列化安全:
1)是否对ViewState加密
2)存储在server还是client
其中:
1)是影响是否能被利用的最核心的配置,默认加密启用,除了加密之外还会有签名,所以通常显得比较鸡肋。当然,即使启用了加密也不能保证100%安全,因为加密的算法、密钥、IV等要素都允许用户配置,所以如果能够获取到这些要素之后,仍然能够利用。
2)在2.3.0版本之前,ViewState储在server还是client其实没有差别,但是在2.3.0之后,保存在server端的就不在进行反序列化了(https://issues.apache.org/jira/browse/MYFACES-4133)。而且默认是server,因此2.3.0是一个重要的分水岭。
0x03 简单演示
1)下载或者搭建简单的demo,默认登录表单中ViewState值是一个加密串
2)修改默认配置,取消加密
很明显看到序列化的特征(rO0)。
3)为了便于演示,增加CommonsCollections3.1包,使用ysoserial生成payload
4)对于启用了加密的,如果知道了加密要素,同样可可以利用,感兴趣的可以尝试。
0x04 参考
https://wiki.apache.org/myfaces/Secure_Your_Application
http://www.slideshare.net/frohoff1/appseccali-2015-marshalling-pickles
领取专属 10元无门槛券
私享最新 技术干货