CVE-2024-2961
本文最后更新于 2024年11月19日 下午
参考链接:
【翻译】从设置字符集到RCE:利用 GLIBC 攻击 PHP 引擎(篇一) - 先知社区
Nepnep Web 组第一周队内分享哔哩哔哩_bilibili
该漏洞已在国内大型的ctf赛事活跃,博主本人却是一直不会,在此好好学习一番内容。
复现环境:
vulhub/php/CVE-2024-2961 at master · vulhub/vulhub
环境搭建
直接环境git下来然后docker起一下就行了,我使用的默认源码(用的小水滴起的内容)
1 |
|
访问index.php
传入file参数就能读取文件
原理
闲言碎语
如上文的file_get_contents($_POST['file']);
我们可以利用file
传值进行读取,比如就像上方的读取/etc/passwd
,但是php还支持其他协议比如http://google.com
,这样就可以获取google
的首页了,也可以使用ftp来获取内容,当然最主要的内容是php协议还自定义了phar://
协议。
phar://
可以读取PHAR存档的全部内容,PHAR 代表 PHP 存档,是一组文件,比如:
- 源代码
- 资源
- 序列化的元数据
该协议是常见php泄漏点,当使用它访问一个PHAR文件时,其元数据会被反序列化。
随着版本的推移,利用点变少,但是phar://
并非攻击者唯一有用的协议;另一个名为php://filter
的协议同样取得了显著成效。那么就先把视角专业到php过滤器上面。
php://filter
这一PHP特有的协议,它提供了一种在返回流之前对其应用转换的方法。其语法如下:
1 |
|
比如我们可以通过convert.base64-encode
这个很常见的过滤器来读取/etc/passwd
来进行
理所当然也可以进行两次convert.base64-encode
除此之外还有很多过滤器,比如:
- string.upper ,将字符串转换为大写
- string.lower ,将字符串转换为小写
- string.rot13 ,执行一些 BC 加密
- convert.iconv.X.Y ,将字符集从 X 转换为
最后一个过滤器: convert.iconv.X.Y 。假设需要将文件从 UTF8 转换为 UTF16,可以用
1 |
|
当然过滤器也出现了filterchain的考察点,这里不多述了。
cve知识点
这边不多叙述,pwn知识我了解较少,原文博主的pwn水平非常之高。主要的内容是
glibc中iconv()
函数将一些数据转换成ISO-2022-CN-EXT
格式时,会有1-3字节的溢出。
iconv() API
一般情况下,每个 char 类型的字符占一个字节,但在iconv
编码转义的时候则可能转义为多个字节,不过这依旧是在缓冲区预期之内的
当PHP从一个字符集转换到另一个字符集时,它使用 iconv
,这是一个用于“使用转换描述符将输入缓冲区中的字符转换为输出缓冲区”的API。在Linux系统上,这个API由 glibc
实现API非常简单。首先,打开一个转换描述符,该描述符指定了输入和输出字符集.
1 |
|
然后,使用iconv()
将输入缓冲区inbuf
转换为输出缓冲区outbuf
中的新字符集
1 |
|
如果输出缓冲区不够大,iconv()
将返回一个错误指示此情况,可以通过重新分配 outbuf
并再次调用 iconv()
来继续转换。
ISO-2022-CN-EXT
在将数据转换为 ISO-2022-CN-EXT 字符集时,iconv
可能在写入输出缓冲区之前未能检查是否有足够的空间剩余
1 |
|
每个块向outbuf
(由outptr
指向)写入不同的转义序列。
在第一个if[1]
里,前面有一个额外的if()
块来检查输出缓冲区是否足够大以容纳四个字符。
而其他两个if[2][3]
则没有对 outptr 进行检查。因此,转义序列可能会越界写入。,一般的常规汉字没有溢出的效果,但是利用如: 劄
、 䂚
或 峛
、湿
这种字符,在iconv()
转义时会导致1到3字节的溢出。具体不演示
既然能实现缓冲区溢出,那就能实现rce
Poc分析
核心代码在
1 |
|
check_vulnerable
方法仅用于检测相关的 wrapper 是否可用,需要获取完整的回显,如果回显经过了 aes 或者 md5 之类的加密则这个检测方法不可用
get_symbols_and_addresses
是用来获取 /proc/self/maps
和libc.so.6
的
exploit
方法就是pwn。
复现
需要python310环境和linux环境
访问shell.php即可
这类题最关键的还是如何修改脚本,需要好好学习学习。
相关例题可以参考2024年羊城杯,2024年鹏程杯等等。稍微学习一下怎么修改,这个知识点大概就没什么问题了。