近日,在BlackHat 2018大会上公布了一种针对PHP应用程序的全新攻击技术。来自Secarma的安全研究员Sam Thomas分享了议题“It’s a PHP unserialization vulnerability Jim, but not as we know it”,利用phar文件会以序列化的形式存储用户自定义的meta-data这一特性,拓展了php反序列化漏洞的攻击面。
该方法在文件系统函数(file_exists()、is_dir()等)参数可控的情况下,配合phar://伪协议,可以不依赖unserialize()直接进行反序列化操作。
本期安仔课堂,ISEC实验室的王老师为大家详解PHPphar协议对象注入技术。
0X00 PHP反序列化漏洞
PHP中有两个函数serialize()和unserialize()。
serialize():
当在PHP中创建了一个对象后,可以通过serialize()把这个对象转变成一个字符串,保存对象的值方便之后的传递与使用。
测试代码如下:
图1
创建了一个新的对象,并且将其序列化后的结果打印出来:
这里的O代表存储的是对象(object),假如传入的是一个数组,那就是字母a。6表示对象的名称有6个字符。“mytest“表示对象的名称。1表示有一个值。{s:4:”test”;s:3:”123”;}中,s表示字符串,4表示字符串的长度,“test”为字符串的名称,之后的类似。
unserialize():
与serialize()对应的,unserialize()可以对单一的已序列化的变量进行操作,将其转换回 PHP 的值。
图3
当使用unserialize()恢复对象时,将调用_wakeup()成员函数。
反序列化漏洞就是当传给unserialize()的参数可控时,可以通过传入一个精心构造的序列化字符串,来控制对象内部的变量甚至是函数。
0X01PHP伪协议
PHP带有很多内置URL风格的封装协议,可用于类似fopen()、copy()、file_exists()和fielsize()的文件系统函数。除了这些封装协议,还能通过stream_wrapper_register()来注册自定义的封装协议。
0X02phar文件结构和漏洞原理
phar文件有四部分构成:
1.a stub
可以理解为一个标志,格式为xxx<?php xxx;HALT_COMPILER();?>,前期内容不限,但必须以HALT_COMPILER();?>来结尾,否则phar扩展将无法识别其为phar文件。
2.a manifest describing the contents
phar文件本质上是一种压缩文件,其中每个被压缩文件的权限、属性等信息都存放在这一部分中。这部分将会以序列化的形式存储用户自定义的meta-data。
图5
3.the file contents
被压缩文件的内容。
4.[optional] a signature for verifying Phar integrity (phar file format only)
签名,放在文件末尾,目前支持的两种签名格式是MD5和SHA1。
漏洞触发点在使用phar://协议读取文件的时候,文件内容会被解析成phar对象,然后phar对象内的meta-data会被反序列化。
meta-data是用serialize()生成并保存在phar文件中,当内核调用phar_parse_metadata()解析meta-data数据时,会调用php_var_unserialize()对其进行反序列化操作,因此会造成反序列化漏洞。
0X03漏洞利用和demo测试
Sam Thomas举例的漏洞主要通过利用魔术方法destruct或wakeup构造利用链,但是在实战环境里往往较难找到可以直接通过魔术方法触发的漏洞点。
根据文件结构来构建一个phar文件,php内置了一个Phar类来处理相关操作。
注意:要将php.ini中的phar.readonly选项设置为Off,否则无法生成phar文件。
图7
可以明显的看到meta-data是以序列化的形式存储的:
有序列化数据必然会有反序列化操作,PHP一大部分的文件系统函数在通过phar://伪协议解析phar文件时,都会将meta-data进行反序列化,测试后受影响的函数如下:
图10
在文件系统函数的参数可控时,可以在不调用unserialize()的情况下进行反序列化操作。
由于通过反序列化可以产生任意一种数据类型,可联想到PHP的一个漏洞:PHP内核哈希表碰撞攻击(CVE-2011-4885)。在PHP内核中,数组是以哈希表的方式实现的,攻击者可以通过巧妙构造数组元素的key使哈希表退化成单链表(时间复杂度从O(1)=>O(n))来触发拒绝服务攻击。
图15
PHP修复此漏洞的方式是限制通过$_GET或$_POST等方式传入的参数数量,但是如果PHP脚本通过json_decode()或unserialize()等方式获取参数,则依然将受到此漏洞的威胁。
漏洞利用思路:构造一串恶意的serialize数据(能够触发哈希表拒绝服务攻击),然后将其保存到phar文件的metadata数据区,当文件操作函数通过phar://协议对其进行操作的时候就会触发拒绝服务攻击漏洞。
图17
0X04将phar伪造成其他格式的文件
PHP识别phar文件是通过文件头的stub,即__HALT_COMPILER();?>,对前面的内容或者后缀名没有要求。可以通过添加任意文件头加上修改后缀名的方式将phar文件伪装成其他格式的文件。
图18
可以利用这种方法绕过大部分上传检测。
0X05实际利用
利用条件:
1.phar文件要能够上传到服务器端。
2.要有可用的魔术方法作为“跳板”。
3.文件操作函数的参数可控,且: / phar等特殊字符没有被过滤。
利用环境:WordPress
WordPress是网络上最广泛使用的cms,这个漏洞在2017年2月份就被报告给了官方,但至今仍未被修补。之前的任意文件删除漏洞也是出现在这部分代码中,同样没有修补。根据利用条件,我们先要构造phar文件。
漏洞核心位于/wp-includes/post.php中的wp_get_attachment_thumb_file方法:
图21
可以通过XMLRPC调用wp.getMediaItem方法来实现此功能。
图22
如果$file是类似于Windows盘符的路径Z:Z,正则匹配就会失败,$file就不会拼接其他东西,此时就可以保证basename($file)与$file相同。
这个类继承了ArrayIterator,每当这个类实例化的对象进入foreach被遍历的时候,current()方法就会被调用。
由于WordPress核心代码中没有合适的类能够利用,这里利用woocommerce插件中的一个类:
图24
利用函数passthru来执行系统命令whoami。
这个漏洞利用的权限需要有作者权限或更高,这里用一个author。
通过xmlrpc接口上传刚才的文件,文件要用base64编码:
图28
最后通过XMLRPC调用wp.getMediaItem这个方法来调用wp_get_attachment_thumb_file()函数,从而触发反序列化。xml调用数据包如下:
图35
成功执行whoami。
0X06防御
1.在文件系统函数的参数可控时,对参数进行严格的过滤;
2.严格检查上传文件的内容,而不是只检查文件头;
3.在条件允许的情况下禁用可执行系统命令、代码的危险函数。
- 上一篇:Cookie篡改与命令注入
- 下一篇:信息是一道光,泄露到你发慌
猜你还喜欢
- 06-09深入理解JAVA反序列化漏洞
- 08-12cmseasy前台无需登录直接获取敏感数据的SQL注入(有POC证明)
- 11-28CVE-2017-11882漏洞复现和利用
- 11-10利用Thinkphp 5缓存漏洞实现前台Getshell
- 08-04php安全代码审计小结
- 01-02PHPCMS后台”空降”管理员CSRF漏洞分析
- 01-02某CMS注入分析及注入点总结
- 11-30PHP 函数漏洞总结
- 11-30PHP渗透中的奇淫技巧--检查相等时的漏洞
- 11-15某开源框架从注入到Getshell
- 随机文章
-
- 关于APP渗透测试的实践与思考
- 一次SQL注入到代码审计之路
- CVE-2020-8816: Pi-hole中的远程代码执行漏洞分析及复现
- 一文详解Webshell
- 技术讨论 | 某真实渗透实践案例分析
- 窥探裸聊诈骗背后黑色产业链的一角
- php代码审计学习之函数缺陷
- 记录一次赌博网站渗透测试,有钱老板背景调查
- GitLab任意文件读取漏洞CVE-2020-10977
- 挖洞经验 | 一次性验证密码(OTP)的简单绕过
- 主机安全:洋葱Webshell检测实践与思考
- 解密无文件攻击的各种姿势及最新检测方法
- thinkphp漏洞集合与复现
- Thinkphp5代码执行学习
- 闲谈Webshell实战应用
- 代码克隆检测技术初探和开源工具地址分享
- 记录几种XSS绕过方式
- 通达OA远程命令执行漏洞分析
- 一次对果聊诈骗的分析:那些你不知道的套路诈骗
- 看我如何制造漏洞绕过安全软件来加入自启动
- 热门文章
-
- 八年专业安全团队承接渗透入侵维护服务
- Emlog黑客站模板“Milw0rm”发布
- Stuxnet纪录片-零日 Zero.Days (2016)【中文字幕】
- SQLMAP的注入命令以及使用方法
- 白帽故事汇:网络安全战士从来不是「男生」的专利
- 编辑器漏洞手册
- web安全之如何全面发现系统后台
- 常见Web源码泄露总结
- 渗透测试培训(第五期)
- 深入理解JAVA反序列化漏洞
- cmseasy前台无需登录直接获取敏感数据的SQL注入(有POC证明)
- 网站后台登陆万能密码
- 黑麒麟2016渗透培训系列教程
- 破解emlog收费模板“Begin”
- 那些强悍的PHP一句话后门
- Android平台渗透测试套件zANTI v2.5发布(含详细说明)
- 渗透工具BackTrack与KaliLinux全套视频教程
- Python列为黑客应该学的四种编程语言之一 初学者该怎么学
- CVE-2017-11882漏洞复现和利用
- 恶意程序报告在线查询工具
文章存档
- 2021年3月(4)
- 2020年12月(4)
- 2020年11月(5)
- 2020年10月(8)
- 2020年9月(8)
- 2020年8月(20)
- 2020年7月(47)
- 2020年6月(70)
- 2020年5月(41)
- 2020年4月(21)
- 2020年3月(120)
- 2020年2月(26)
- 2019年12月(12)
- 2019年11月(13)
- 2019年10月(17)
- 2019年9月(15)
- 2019年8月(13)
- 2019年7月(15)
- 2019年6月(15)
- 2019年5月(19)
- 2019年4月(23)
- 2019年3月(19)
- 2019年2月(11)
- 2019年1月(29)
- 2018年12月(24)
- 2018年11月(56)
- 2018年10月(79)
- 2018年9月(20)
- 2018年8月(17)
- 2018年7月(16)
- 2018年6月(7)
- 2018年5月(10)
- 2018年3月(6)
- 2018年2月(2)
- 2018年1月(11)
- 2017年11月(18)
- 2017年10月(6)
- 2017年9月(8)
- 2017年8月(7)
- 2017年7月(7)
- 2017年6月(15)
- 2017年5月(30)
- 2017年4月(7)
- 2017年3月(1)
- 2017年2月(4)
- 2017年1月(1)
- 2016年12月(3)
- 2016年11月(7)
- 2016年10月(6)
- 2016年9月(6)
- 2016年8月(102)
- 2016年7月(24)
- 2013年7月(1)
- 文章标签
-