本地包含

本地包含

 

 

本地包含

本地包含

 

 

本地包含

进去之后看到如下代码:

 

<?php 

    include "flag.php"; 

    $a = @$_REQUEST['hello']; 

    eval( "var_dump($a);"); 

    show_source(__FILE__); 

?>

 

  • $_REQUEST[ ]

    默认情况下包含了$_GET、$_POST、$_COOKIE的数组;

  • 1、$_REQUEST可以接收_GET、POST、POST、_COOKIE发送的数据; 

  • 2、由于$_REQUEST 中的变量通过 GET、POST、和 COOKIE 输入机制传递给脚本文件,因此可以被远程用户篡改而并不可信,这个数组的项目及其顺序依赖于PHP的 variables_order 指令的配置。 

  • 这里的意思是可采用post和get两种方式将表域名为hello的数据赋值给变量$a,为了简便,后面的payload采用的是get方式。

eval() 函数计算 JavaScript 字符串,并把它作为脚本代码来执行。

如果参数是一个表达式,eval() 函数将执行表达式。如果参数是Javascript语句,eval()将执行 Javascript 语句。

var_dump()
void var_dump ( mixed expression [, mixed expression [, ...]] )
var_dump()方法是判断一个变量的类型与长度,并输出变量的数值,如果变量有值输的是变量的值并回返数据类型.
此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。
这里是将变量a的值打印到界面中。

这题有两种思路:
直接将flag.php文件读入变量hello中,然后让var_dump打印到界面中。

所以payload可为:?hello=get_file_contents('flag.php')或者?hello=file('flag.php)



根据最基本注入''引号闭合的思路,很容易就想到了利用括号,毕竟,eval中是执行的代码段

最基本的,再利用eval()会将括号内的字符串当作php内部的代码来执行这一漏洞,构造payload ?hello=);print_r(file(%22./flag.php%22));//  

eval函数中,""内部为代码,//只在代码中起作用,相当于只注释了;(在URL中%22指的是一个")

由于eval()会将括号内的字符串当成php代码,所以会形成var_dump();print_r(file(%22./flag.php%22));//)这个程序,执行后得到flag的值。



file_get_contents()

file_get_contents() 函数把整个文件读入一个字符串中。

和 file() 一样,不同的是 file_get_contents() 把文件读入一个字符串。

file_get_contents() 函数是用于将文件的内容读入到一个字符串中的首选方法。如果操作系统支持,还会使用内存映射技术来增强性能。

语法

file_get_contents(path,include_path,context,start,max_length)

参数

描述

path

必需。规定要读取的文件。

include_path

可选。如果也想在 include_path 中搜寻文件的话,可以将该参数设为 "1"。

context

可选。规定文件句柄的环境。

context 是一套可以修改流的行为的选项。若使用 null,则忽略。

start

可选。规定在文件中开始读取的位置。该参数是 PHP 5.1 新加的。

max_length

可选。规定读取的字节数。该参数是 PHP 5.1 新加的。

说明

 context 参数的支持是 PHP 5.0.0 添加的。

 

file() 函数把整个文件读入一个数组中。

 file_get_contents() 类似,不同的是 file() 将文件作为一个数组返回。数组中的每个单元都是文件中相应的一行,包括换行符在内。

如果失败,则返回 false。

语法

file(path,include_path,context)

参数

描述

path

必需。规定要读取的文件。

include_path

可选。如果也想在 include_path 中搜寻文件的话,可以将该参数设为 "1"。

context

可选。规定文件句柄的环境。

context 是一套可以修改流的行为的选项。若使用 null,则忽略。

说明

 context 的支持是 PHP 5.0.0 添加的。

返回的数组中每一行都包括了行结束符,因此如果不需要行结束符时还需要使用 rtrim() 函数。

提示和注释

注释:从 PHP 4.3.0 开始,可以用 file_get_contents()来将文件读入到一个字符串并返回。

注释:从 PHP 4.3.0 开始,file() 可以安全用于二进制文件。

注释:如果碰到 PHP 在读取文件时不能识别 Macintosh 文件的行结束符,可以** auto_detect_line_endings 运行时配置选项。

 

参考链接:https://www.jianshu.com/p/2dda515df5a5

https://blog.****.net/wy_97/article/details/77452939