在本节中,将用PHP、Ruby和Java反序列化的例子指导如何利用一些常见的情况,从而证明利用不安全的反序列化实际上比许多人认为的要容易很多。
如果能使用预先建立的小工具链,在黑盒测试中甚至可以做到这一点。
虽然许多试验和例子都是基于PHP的,但大多数利用技术对其他语言也同样有效。
"ysoserial"小工具
一个用于Java反序列化的工具是"ysoserial",它可以让你从所提供的小工具链中选择一个你认为目标应用程序正在使用的库,然后传入一个你想要执行的命令。随后,根据所选的链创建一个适当的序列化对象。
这仍然涉及到一定量的试验和错误,但它比手动构建小工具链要省力得多。
场景试验-利用Apache Commons对Java进行反序列化操作:
https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-exploiting-java-deserialization-with-apache-commons
场景说明:
这个试验场景使用了基于序列化的会话机制,并加载了Apache Commons集合库,虽然没有源代码权限,但仍然可以使用预先建立的小工具链来利用这个试验。
试验目的:
要完成这个试验,需要使用第三方工具生成包含远程代码执行的Payload的恶意序列化对象,然后将该恶意对象传递到网站以删除carlos主目录中的moral.txt文件。
试验提供了一个可登录的账号wiener:peter
攻击过程:
①登录试验场景提供的账号,观察会话cookie是否包含一个序列化的对象,把这个请求发送给Repeater
②下载个"ysoserial"的jar包工具,链接如下:
https://github.com/frohoff/ysoserial/releases/latest/download/ysoserial-all.jar
下载后允许下看是否可以正常使用
Java –jar ysoserial.jar
③执行下面的语句,这会生成一个包含Payload的Base64的序列化对象
④在Burp的Repeater中,用刚刚创建的恶意cookie替换会话cookie,选择整个cookie然后对其进行URL编码,发送该请求完成试验
其他小工具链
不过要注意的是,不是所有ysoserial中的小工具链都可以运行任意代码,相反,它们可能用于其他目的。
但是,我们可以使用以下方法来快速检测服务器上是否存才不安全反序列化:
●URLDNS链为提供的URL触发DNS查找,重要的是,它不依赖于使用特定脆弱库的目标应用程序,并且可以在任何已知的Java版本中工作。这使它成为检测目的中最通用的小工具链。如果在流量中发现一个序列化对象,可以尝试使用这个小工具链生成一个对象,该对象触发与Burp Collaborator服务器的DNS交互。如果存在交互,可以确定在目标上发生了反序列化。
●JRMPClient是可用于初始检测的另一个通用链。它使服务器尝试建立一个TCP连接到提供的IP地址。但需要注意的是,需要提供一个原始的IP地址,而不是一个主机名。在所有出站通信都有防火墙(包括DNS查找)的环境中,这个链可能就会很有用。可以尝试使用两个不同的IP地址生成Payload:一个本地IP、另一个防火墙的外部IP。如果应用程序立即响应一个具有本地地址的Payload,但是挂起一个具有外部地址的Payload,导致响应延迟,这表明小工具链在工作,因为服务器试图连接到防火墙地址。在这种情况下,响应的细微时间差可以帮助检测服务器上是否发生了反序列化,即使在盲注的环境中也可以适用。
PHP通用小工具链
大多数经常遭受不安全反序列化漏洞困扰的语言都有相应的概念验证工具。
例如,对于基于PHP的网站,可以使用“PHP通用小工具链”(PHPGGC)。
场景试验-用预先建立的小工具链来利用PHP反序列化漏洞:
https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-exploiting-php-deserialization-with-a-pre-built-gadget-chain
场景说明:
这个试验场景使用了基于序列化的会话机制,使用了一个签名的cookie。它还使用了一个普通的PHP框架。虽然没有源代码权限,但仍然可以通过预先建立的小工具链利用这个试验环境进行不安全的反序列化。
试验目的:
要完成这个试验,需要先确定目标框架,然后使用第三方工具生成一个包含远程代码执行的Payload的恶意序列化对象。随后研究如何生成一个包含恶意对象的有效签名cookie。最后再传入网站,从carlos的主目录中删除morale.txt文件。
试验提供了一个可登录的账号wiener:peter
攻击过程:
①使用场景提供的账号进行登录,登录后在Burp Suite的Inspector中可以看到,cookie信息是由token和经过sha1加密的密钥组成的,将这个包发送到Repeater
②将token后面的内容复制到Decoder,用base64解密后可以看到是序列化的内容
③把用户名改一下,然后再用base64编码后替换到原来的请求中重新发送请求,返回500错误,将报错页面通过浏览器打开,可以看到这个网站所使用的框架是Symfony 4.3.6
④接下来利用phpggc工具来构建反序列化的恶意代码,通过这个工具可以根据框架版本直接生成恶意payload,先用下面指令看下这个工具支持哪些Symfony的版本
phpggc –l | grep symfony
⑤再执行下面语句,生成反序列化的payload,将生成的payload复制出来后面需要使用
phpggc Symfony/RCE4 exec 'rm /home/carlos/morale.txt' | base64
⑥原来的cookie中还有密钥,需要想办法找到安全密钥,我们直接来找一下代码的批注,可以发现debug都会重定向到/cgi-bin/phpinfo.php这个页面
⑦访问下这个页面找到"SECRET_KEY",记录下密钥
⑧接下来创建一个php文档,在$object处使用PHPGGC生成的恶意payload,在$secretKey处使用前面得到的密钥
$object = "OBJECT-GENERATED-BY-PHPGGC";
$secretKey = "LEAKED-SECRET-KEY-FROM-PHPINFO.PHP";
$cookie = urlencode('{"token":"' . $object . '","sig_hmac_sha1":"' . hash_hmac('sha1', $object, $secretKey) . '"}');
echo $cookie;
⑨用php程序执行下,将返回的信息替换到原来的cookie中重新发送即可完成试验
试验小结:
需要注意的是,该漏洞是对用户可控数据的反序列化,而不是仅仅在网站的代码或其他任何库中存在的小工具链。小工具链只是一种操纵有害数据流的手段,这也适用于各种依赖于反序列化的不可信任数据的内存破坏漏洞。换句话说,即使一个网站以某种方式设法堵住了所有可能的小工具链,它仍然可能是脆弱的。
SQL注入攻击-检索隐藏的数据
HTTP Host头漏洞攻击-概念梳理
原文始发于微信公众号(H君网安白话):不安全的反序列化-攻击示例(四)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论