Disable_function是渗透测试中的一个大问题。很多时候,当我们拿到外壳的时候,因为disable_function的限制,没有办法进行下一步。因此,揭示了各种利用技术。今天这篇文章解释两种绕过方法。
Php超全局变量

首先说一下超全局变量。在php中,函数变量是与全局隔离的,不可访问的。
演示1:
现在在函数中添加一个globle,这样函数中的测试函数就变成了一个超全局变量。
在函数中定义全局变量:
通过globle函数,我们可以从外部访问函数内部定义的变量的值。
演示2:
3.php码如图所示:
2.php码如图所示:
下面是作用域的描述:可以看到我们在3.php导入了测试函数,但是注意3.php的变量A仅限于Test_Global函数,这个输出是0。
禁用功能
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
参数$command指示要执行的命令;
$output:该命令执行输出以填充该数组。
如图:这是直接回声。看到没有输出,我们用print_r打印出来:
至于system、passthru之类的功能就不详细解释了,大家可以自己测试。
1)使用pcntl_exec
演示:
< PHP pcntl _ exec);>
然后切换到/tmp/1.sh,编写ls -l来执行。

反弹壳:
该函数在执行过程中出现错误时返回false,但在执行成功时不会返回false。所以我们通常使用python来弹壳这个函数。
适用版本:php 4 > = 4.2.0,PHP 5
分析:
记住这些轮子。通常,pcntl_exec函数使用这两种方式。
2)使用LD_PRELOAD环境变量
原理:先说这个环境变量。它的功能是允许定义程序运行前加载的动态链接库。该函数用于有选择地在不同的链接库中加载相同的函数。通过这个环境变量,我们可以在主程序和它的动态链接库之间加载其他的动态链接库。我们可以利用这个特性劫持函数,从而使用我们自己构造的函数。
c文件被转换成。所以linux下的文件:
gcc-c-fPIC-o a o a c
gcc -shared -o mylib.so mylib.o
-c表示编译-fPIC表示共享库的动态连接。
-o表示输出的文件名,而-shared表示生成共享库。
演示1:
交流电
首先,gcc将a.c编译成linux下的可执行文件A
不难看出,strcmp函数对两个值进行比较,如果等于password,就会输出正确!
根据上面的原理,我们想知道无论输入什么字符,是否都能输出正确。
让我们在下面构造一个b.c文件:
把d.c编译成动态链接库,利用LD_PRELOAD全局变量先加载d.so这个动态链接库,这样就可以达到我们之前想要达到的目的。
演示2:
这只是一点二进制的东西。

这个C语言已经写死了,但是能不能用一些结构让它输出ok?
首先,我们用gdb调试一下:
我们的想法是劫持printf函数,将其堆栈中的地址增加59,这样就可以输出ok了。
结局
还有很多方法可以绕过disable_function,这是进阶的第一步。很多东西还是要被劫持的。所以文件,还有很多技巧值得分析。


