【root-me CTF练习】Web服务器安全-第二十关- PHP filters

靶机:http://challenge01.root-me.org/web-serveur/ch12

解题思路:

指定inc参数值为不存在的文件时,通过提示的警告信息得知该参数是通过include函数进行文件包含的。

那么首先来了解下include函数的作用:

include函数

包含并运行指定文件,通过 include 或 require 语句,可以将 PHP 文件的内容插入另一个 PHP 文件,作用类似于载入模块。

#vars.php
<?php
$color = 'green';
$fruit = 'apple';
?>

#test.php
<?php
echo "A $color $fruit"; // A
include 'vars.php';
echo "A $color $fruit"; // A green apple
?>

不仅如此,接下来才是重点,include函数还能接受PHP流。

php://

php:// — 访问各个输入/输出流(I/O streams)。PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。

详情请参考官方文档:http://php.net/manual/zh/wrappers.php.php

这里介绍今天的考点:php://filter

php://filter

php://filter是PHP语言中特有的协议流,作用是作为一个“中间流”来处理其他流,具有四个参数:

名称 描述 备注
resource=<要过滤的数据流> 指定了你要筛选过滤的数据流。 必选
read=<读链的筛选列表> 可以设定一个或多个过滤器名称,以管道符(|)分隔 可选
write=<写链的筛选列表> 可以设定一个或多个过滤器名称,以管道符(|)分隔。 可选
<两个链的筛选列表> 任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。  

例子:

<?php
#这里没有指定过滤器
readfile("php://filter/resource=http://www.example.com");

/* 这会以大写字母输出 www.example.com 的全部内容 */
readfile("php://filter/read=string.toupper/resource=http://www.example.com");

/* 这会和以上所做的一样,但还会用 ROT13 加密。 */
readfile("php://filter/read=string.toupper|string.rot13/resource=http://www.example.com");
?>

那么,我们可以使用php://filter来读取任意文件内容

php://filter/convert.base64-encode/resource=目标文件

通过读取login.php文件源码得知包含了config.php文件,那么再读取此文件的源码即可得到密码。

关于PHP各种流的操作还有很多用法,以后碰到了再一一研究。

猜你喜欢

转载自blog.csdn.net/a15803617402/article/details/83097452