12

opcache导致的RCE复现 - F12~

 1 year ago
source link: https://www.cnblogs.com/F12-blog/p/18001985
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

opcache导致的RCE复现 - F12~ - 博客园

RCE得搭配着文件上传的点来进行利用

用docker搭个php7的环境,作者用的php7.0
docker run -itd --name php7 -p 8083:80 php:7.0-apache
安装opcache拓展

  1. 进入docker容器:docker exec -it 容器id /bin/bash
  2. 安装opcache:cd /usr/local/bin && docker-php-ext-configure opcache --enable-opcache && docker-php-ext-install opcache
  3. 重启apache:cd /etc/init.d && ./apache2 restart

查看phpinfo,出现这个说明安装成功:

2746479-20240201180339382-738636213.png#height=291&id=u5iQ5&originHeight=908&originWidth=1674&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=&width=535.7142944335938


修改一下php.ini,应用opcache:
cd /usr/local/etc/php && cp php.ini-development php.ini
然后改php.ini:

2746479-20240201180806542-109848298.png#height=106&id=mijDH&originHeight=202&originWidth=841&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=&width=440.71429443359375


最后重启一下docker容器,配置生效:

2746479-20240201181051324-1028236716.png#height=139&id=iAyvn&originHeight=432&originWidth=1649&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=&width=528.7142944335938

opcache原理

Opache是php中一个生成缓存文件的拓展,当我们访问一个php文件时,他会产生一个缓存文件,下次访问该php文件时,就会直接根据缓存文件回显页面,查看tmp下,已经生成了缓存文件:

2746479-20240201182656837-1001880460.png#height=108&id=Q03jV&originHeight=199&originWidth=1040&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=&width=564.7142944335938

RCE操作

想要rce,我们就得覆盖掉生成的bin文件,首先得计算出文件夹的这个system_id,也就是8431e96e6adfc8fc75ad38a0f6a7eb4e,那么这个system_id怎么计算呢?偷别人的脚本(bushi : https://github.com/GoSecure/php7-opcache-override
非常的方便快捷

2746479-20240201182749984-1912697313.png#height=199&id=Y9cXo&originHeight=340&originWidth=965&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=&width=563.7142944335938


现在得生成我们的恶意bin文件去覆盖掉原先的bin文件,先分析一下bin文件的结构:

2746479-20240201185510547-1147857910.png#height=236&id=s2jvC&originHeight=824&originWidth=1968&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=&width=564.7142944335938


010可以看出,bin文件的文件头是OPCACHE+system_id,由于opcache有个时间戳验证,如果我们伪造的时候,时间戳对不上是不会生效的,上图中的40h处就是时间戳的值,点击40h处,然后看Signed Int64的值,到时直接替换这个值就行了
2746479-20240201185658583-1167483677.png#height=21&id=Ovt7m&originHeight=41&originWidth=1128&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=&width=565.7142944335938
我们在自己服务器上生成一个恶意的bin文件,改掉时间戳跟system_id的值,上传覆盖phpinfo.php.bin,访问覆盖成功(我这里语法写错了,难崩)

2746479-20240201191603834-1136875292.png#height=125&id=lPXm9&originHeight=339&originWidth=1623&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=&width=598.7142944335938

php8的opcahce

在php8后,system_id的生成方式发生了改变,所以7的脚本用不了了,但是8是有规律的,其实我们只要能获取到php的正确版本,就能自己搭建生成一个完全一样的system_id,其余操作都是相同的,唯一不同的就在于system_id的生成

__EOF__

本文作者: F12 本文链接: https://www.cnblogs.com/F12-blog/p/18001985 关于博主: 评论和私信会在第一时间回复。或者直接私信我。 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处! 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK