CTFHub技能树-web进阶 LD_PRELOAD

LD_PRELOAD
做这道题之前,先要稍微了解下:
LD_PRELOAD:
是Linux系统的一个环境变量,它指定的.so文件会在程序本身的.so文件之前被加载。
putenv():
PHP函数,可以设置环境变量
mail(),error_log()
PHP函数,在运行时会执行系统中的程序:sendmail
题目描述
已经拿到了shell,但是PHP配置中的disable_functions禁用了大部分常规的的可以执行系统命令的函数,所以即使拿到了shell,也只能执行对文件的读写删除操作,没法执行系统命令。这题让通过LD_PRELOAD来进行绕过。
/?ant=phpinfo();
发现这题并没有ban掉putenv()函数,mail()函数,和error_log()函数;
所以可以通过这几点来进行绕过。
题目思路
构造一个带命令执行的eval.os文件,让其被LD_PRELOAD加载;然后在PHP中调用mail函数或error_log函数,函数内部会执行系统的sendmail命令;这样我们构造的eval.os就会加载并覆盖sendmail本应调用的库函数,达到命令执行的效果。
实施思路
蚁剑连接,方便上传文件等操作。
首先写eval.c

#include 
#include 
#include 

__attribute__ ((__constructor__)) void hausa_zui_shuai(void)
{
    unsetenv("LD_PRELOAD");
    system("echo any_other_eval_code");
    system("/readflag > /tmp/hausa.txt");
}

小解释:
__attribute__ ((__constructor__))这个参数,可以读一下参考博文,它使得被自己修饰的函数在main函数前执行。
然后gcc -shared -fPIC hack.c -o eval.so将这个源文件编译成动态链接库文件,并将其上传到服务器的/tmp目录下。
然后是shell.php文件:

将此文件上传至/var/www/html目录下,通过地址栏访问http://host:port/shell.php
接下来,在访问过程中,putenv()函数将我们写好的恶意动态链接库文件赋值给LD_PRELOAD环境变量,然后在调用mail()error_log的时候,Linux会执行系统程序sendmail,但是在执行sendmailmain函数之前,会先执行我们设计好的用了__attribute__ ((__constructor__))参数修饰的恶意函数,从而导致了命令的执行。
最后在/tmp目录下,刷新蚁剑,即可看到hausa.txt文件
其中即为flag

尚存的问题
为什么eval.so必须上传到/tmp目录下?放在/var/www/html目录下为什么不能被执行?是权限问题吗?
如果有了解的师傅,请务必在下方评论,菜鸟不胜感激。