Opcache-PHP
OPcache基础
OPcache(Opcode Cache)是 PHP 的一个内置的加速模块,通过解析的 PHP 脚本预编译存放在共享内存中的字节码来避免每次加载和解析 PHP 脚本的开销,解析器可以直接从共享内存读取已经缓存过的字节码,从而大大提高了 PHP 的执行效率。
PHP的正常执行流程:
-
request请求(nginx,apache,cli等)
-
Zend引擎读取.php文件
-
扫描其字典和表达式
-
解析文件
-
创建要执行的计算机代码(成为Opcode)
-
最后执行Opcode
-
response返回
每一次执行 PHP 都要执行一遍上面的步骤,如果 PHP 源码没有变化,那么 OPcode 也不会变化,显然没有必要,下面是使用 OPcache 之后
避免重组编译 减少CPU和内存开销
配置解读
环境搭建
看到这一行就说明配置成功了
再看一下 docker 中的文件
当Opcache第一次缓存文件时, /tmp/system_id/var/www/html/phpinfo.php.bin
OPcache-PHP7
Opcache rce的原理
所以,我们需要做的就是伪造文件替换即可
缓存文件夹为1116d566fdc53f79abce6c01e3a0308d
计算`system_id
是今天的重点
可以根据phpinfo的信息计算出来system_id
的
在 PHP 环境下已经有前人给出我们计算脚本,https://github.com/GoSecure/php7-opcache-override
接下来,当我们存在任意文件写入或者覆盖时,我们可以通过覆盖.php.bin
文件达到RCE的目的
把文件搞下来,分析一下
可以看到最开头是OPACHE+systemid,因此假如我们获取到了SYSTEMID,我们就可以伪造一份缓存文件了,但是还需要注意一点
我们这里的opache拓展开启了timestamp,也就是时间戳验证,那么假如我们创建的文件时间戳不对的话,我们也无法覆盖成功的,那么就需要题目有一个获取时间的地方,假如可以下载任意文件或者直接获取时间戳,那么我们可以用010editor直接修改。
图中蓝色代表的就是时间戳了。我们记住这个时间戳,然后我们同样去自己的服务器生成一个一句话木马的缓存bin文件:
然后替换掉这个文件。然后访问 phpinfo.php 看看效果:
这样就成功getshell了,需要注意一下生成恶意bin文件的php版本需要大致吻合,不能差太多。
Opcache-PHP8
在PHP8之后,opcache生成system_id的方法有些许改变,所以之前的脚本是跑不出来了
可以看出来这里的 system_id 不同
这里的规律佬说动调可以看出来是php 版本号 + API
最后算出来的一样
接下来的跟 PHP7 没区别了就
DASCTF X 0psu3 十一月挑战赛 single_php
通过 highlight_file 高亮代码获得如下
-
siranai.php
-
存在反序列化,但是只能执行一个无参的函数,例如phpinfo()
反序列化调用查看 phpinfo 相关信息
-
首先 OPcache 开启并且缓存文件在 /tmp 目录下
-
然后需要注意的是时间戳是开启的,所以要办法读时间戳
获取时间戳(官方wp是脚本读的)
-
接着分析一下 siranai.php 的代码
发现上传的文件会在/tmp
目录下解压,但是限制了访问ip为127.0.0.1,需要SSRF
那么思路就很清晰了,通过反序列化的可变函数调用到__call()
方法,触发SoapClient类的SSRF上传压缩包,解压到/tmp/[system_id]/var/www/html/index.php.bin
实现RCE
1. 构造恶意的index.phpbin
文件
修改system_id + 时间戳
2. 创建tar压缩包 + 反序列化实现POST请求
这里通过python请求获取到压缩包上传的报文
直接贴上官方WP里的python脚本
将生成的请求体数据封装在 SoapClient 内置类里,序列化
最后suki反序列化即可,注意这里同时需要GET传参,满足var_dump($kanozyo);
不报错
这里调用 SoapClient 对象的不存在的nnnnn方法,会触发call方法。burp发包
成功 getshell
参考:
CTF:
__EOF__

本文链接:https://www.cnblogs.com/solitude0-c/p/18141810.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析