攻防世界:Web_php_include

本文知识点
php伪协议:
php://input,是一个只读流,用于访问 HTTP 请求的原始主体数据(body)。简单来说就是将请求体部分的内容当作文件进行读取。
php// 客户端发送:POST /api,Content-Type: application/json // 请求体:{"name":"张三","age":25} $json = file_get_contents('php://input'); $data = json_decode($json, true); echo $data['name']; // 输出:张三 echo $data['age']; // 输出:25 // 对比 $_POST(此时为空数组) print_r($_POST); // Array()
php://filter/convert.base64-encode/resource=flag.php: 将flag.php的内容编码为base64,防止php代码引擎执行。
php://filter/convert.iconv.<input-encoding>.<output-encoding>这个同样能够转换php文件的编码。data伪协议:
data://text/plain, echo "nihao data", 这个协议可以将后面的内容当作文件传递(即echo "nihao data")。
解题思路:
-
根据源码可以看到,此题会将我们传递的page参数进行检查,然后用include包含。但是会将
php://的数据替换掉,防止我们利用php伪协议。 -
两种方法:
a. 尝试绕过
php://的替换,这里的关键就是strstr函数与str_replace函数- strstr函数用于确定某个字符串是否含有有个字串,这里就是监测
$page字符串中是否包含子字符串php://,但是他区分大小写 - str_replace用于替换字符串的内容,这里就是将
php://替换为空,但是这个函数区分大小写
因此我们可以使用大写的PHP来绕过strstr以及str_replace的替换操作,如下:
查看当前目录文件的数据:

查看文件的内容,得到flag

b. 使用data协议
由于第一种方法已经知道文件是
fl4gisisish3r3.php, 因此这里我直接传递如下的数据,注意,需要将空格替换为%20。
- strstr函数用于确定某个字符串是否含有有个字串,这里就是监测
c. 使用php的filter用于复习前面所学的知识

解码得到数据:
