php bypass disable_functions(一)

上次参加国赛线下赛碰到了这个知识点,当时题目给了个文件包含,并且给了个phpinfo页面,当时就立马想到了session包含,以为包含成功后可以执行系统命令了,但是却发现disable_functions下有一大堆函数!当时心态就炸了…由于当时没有截取phpinfo的页面,也不知道那道题考察的是什么知识点,,还是看大佬文章系统学习学习绕过disable_function的方式吧

ini_get()

可以用此函数获得php的配置,如disable_functions:

1
2
<?php
echo ini_get('disable_functions');

一些高危函数及其用法如下

shell_exec()

反引号与shell_exec是等价的:通过shell环境执行命令,并将完整的输出以字符串的形式返回

1
2
3
4
<?php

echo `ls`;
echo shell_exec('ls');

exec()

exec:执行一个外部程序;默认返回命令执行的最后一行内容

语法:

exec ( string $command [, array &$output [, int &$return_var ]] ) : string

参数:

  • command:要执行的命令。
  • output:如果提供了 output 参数, 那么会用命令执行的输出填充此数组, 每行输出填充数组中的一个元素。 数组中的数据不包含行尾的空白字符,例如 \n 字符。 请注意,如果数组中已经包含了部分元素,exec() 函数会在数组末尾追加内容。如果你不想在数组末尾进行追加, 请在传入 exec() 函数之前 对数组使用 unset() 函数进行重置。
  • return_var:如果同时提供 output 和 return_var 参数, 命令执行后的返回状态会被写入到此变量。
1
2
3
4
<?php

exec('ls', $a);
var_dump($a);

passthru()

passthru:执行外部程序并显示原始输出

1
2
3
<?php

passthru('ls');

system()

system:执行外部程序,并显示输出

1
2
3
<?php

system('ls');

popen()

popen:打开进程文件指针

语法:

popen ( string $command , string $mode ) : resource

打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。

参数 :

  • command:命令。
  • mode:模式。
  • 返回值:返回一个和 fopen() 所返回的相同的文件指针,只不过它是单向的(只能用于读或写)并且必须用 pclose() 来关闭。此指针可以用于 fgets(),fgetss() 和 fwrite()。 当模式为 ‘r’,返回的文件指针等于命令的 STDOUT,当模式为 ‘w’,返回的文件指针等于命令的 STDIN。如果出错返回 FALSE。
1
2
3
4
<?php

$a = popen('/bin/ls', 'r');
echo fread($a, 2096);

proc_open()

proc_open:执行一个命令,并且打开用来输入/输出的文件指针

1
2
3
4
5
6
7
8
9
10
<?php
$proc=proc_open("ls",
array(
array("pipe","r"),
array("pipe","w"),
array("pipe","w")
),
$pipes);
print stream_get_contents($pipes[1]);
?>

pcntl_exec()

pcntl_exec:在当前进程空间执行指定程序

编译php的选项中默认是不开启pcntl的,详见这篇文章

mail()

mail:发送邮件

详见:
https://www.anquanke.com/post/id/86028
https://skysec.top/2019/02/25/%E4%BB%8E%E4%B8%80%E9%81%93%E9%A2%98%E7%9C%8Bimap_open()%20RCE/

putenv()

putenv :设置环境变量的值

语法:

putenv ( string $setting ) : bool

添加 setting 到服务器环境变量。 环境变量仅存活于当前请求期间。 在请求结束时环境会恢复到初始状态。

在低于 5.2.6 版本的 PHP 中,可利用该函数修改系统字符集环境后,利用 sendmail 指令发送特殊参数执行系统 SHELL 命令

dl()

dl:运行时载入一个 PHP 扩展;php7中移除了此函数

windows下扩展文件后缀为.dll,linux下为.so

获取所有扩展:

1
2
3
4
5
<?php

print_r(get_loaded_extensions());

?>

检查一个扩展是否已经加载:

1
2
3
4
5
6
7
8
<?php

if (!extension_loaded('gd')) {
if (!dl('gd.so')) {
exit;
}
}
?>

error_log()

error_log:发送错误信息到某个地方