Drupal 1-click to RCE漏洞利用的三个小技巧
在Seebug上看到的《Drupal 1-click to RCE 分析》这篇关于Drupal的漏洞分析,感觉很精彩,用到了三个很有意思的技巧点。
自己总结一下:
1. preg_replace() /u 模式下的 PREG_BAD_UTF8_ERROR
PHP官网对于/u
通配符的解释是:
1 | u (PCRE_UTF8) |
就是说如果遇到非法的ut-8字符,会导致函数什么都匹配不到,最终返回null。
如果文件名中,如果出现了\x80到\xff的字符时,PHP就会抛出PREG_BAD_UTF8_ERROR。
测试代码:
1 | <?php |
传递正常字符,页面返回正常:
当传递的参数为a=%fe
,$a
返回null
。
2. HTML 当中a标签可以设置打开文件的type
这个目前还没搞明白,因为测试的时候发现:除了IE会执行,其它的(Firefox和Chrome)都是提示下载。
3. phar反序列化RCE
2018年BlackHat大会上的Sam Thomas分享的File Operation Induced Unserialization via the “phar://” Stream Wrapper议题,原文地址。
提到PHP反序列化漏洞(PHP对象注入),以前是如下思路:
- 寻找
unserialize($param)
方法,溯源$param
是否可控。 - 如果
$param
可控,再去寻找可以被注入的危险对象。 - 构造POP链,生成恶意反序列化字符串,实现代码注入,达到目的。
明显条件[1]作为前提,如果条件[1]不成立,那么后面无法进行。
phar反序列化RCE 为[1]实现了另外一个入口。
《利用 phar 拓展 php 反序列化漏洞攻击面》这篇文章分析的很好。
phar 文件允许用户自定义meta-data
文件头,而在phar文件内部,这个的存储恰好是序列化格式。
php大部分的文件系统函数在通过phar://伪协议解析phar文件时,都会将meta-data进行反序列化。
测试一下:
1 | <?php |
用以上脚本生成恶意的phar文件,注意需要先修改php.ini 设置 phar.readonly = Off
。因为安全问题,只能修改php.ini设置,在php脚本当中通过ini_set()
直接设置不成立。
存在漏洞代码如下:
1 | <?php |
访问 http://localhost/test.php?file=phar://phar.phar
触发PHPinfo()。
以上反序列化漏洞的触发点是函数is_file()
,其内部对phar文件的meta-data
进行了反序列化,触发了漏洞。
php大部分的文件系统函数在通过phar://伪协议解析phar文件时,都会将meta-data进行反序列化。
注:phar是php 5.3以后的功能。
参考
A SERIES OF UNFORTUNATE IMAGES: DRUPAL 1-CLICK TO RCE EXPLOIT CHAIN DETAILED
- 本文链接:http://l4yn3.github.io/2019/04/22/Drupal-1-click-to-RCE漏洞利用的三个小技巧/
- 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN 许可协议。转载请注明出处!