夜间模式暗黑模式
字体
阴影
滤镜
圆角
主题色
攻防世界Web_php_include

题解

该题没有题目描述,网页源代码为

<?php
show_source(__FILE__);
echo $_GET['hello'];
$page=$_GET['page'];
while (strstr($page, "php://")) {
    $page=str_replace("php://", "", $page);
}
include($page);
?>

审计代码可知,该题可以从PHP的include漏洞入手解决。

index.php中使用strstr函数过滤掉page参数中的php://,即试图禁止我们使用PHP伪协议(这部分在后面进行详细说明)。查阅strstr函数的声明

strstr ( string $haystack , mixed $needle [, bool $before_needle = FALSE ] ) : string
返回 haystack 字符串从 needle 第一次出现的位置开始到 haystack 结尾的字符串。
该函数区分大小写。如果想要不区分大小写,请使用 stristr()。

我们发现其对大小写敏感,故可使用大写避开检查。接下来通过PHP://input直接输入我们需要include的PHP代码,这部分代码以POST DATA的形式输入。

然后发现三个文件 fl4gisisish3r3.php index.php phpinfo.php
我们继续对fl4gisisish3r3.php进行探查,采用相同的方法

得到flag

PHP伪协议

PHP中支持的伪协议如下

file://
http://
ftp://
php://
zlib://
data://
glob://
phar://
ssh2://
rar://
ogg://
expect://

PHP.ini
allow_url_fopen:on
默认开启。该选项为on便是激活了URL形式的fopen封装协议使得可以访问URL对象文件等。

allow_url_include:off
默认关闭。该选项为on便是允许包含URL对象文件等。

php://

php:// — 访问各个输入/输出流(I/O streams)

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

php://input

php://input 是个可以访问请求的原始数据的只读流。 POST 请求的情况下,最好使用 php://input 来代替 $HTTP_RAW_POST_DATA,因为它不依赖于特定的 php.ini 指令。

php://input可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行。当传入的参数作为文件名打开时,可以将参数设为php://input,同时POST DATA为文件内容,php执行时会将post内容当作文件内容。从而导致任意代码执行

例子见本题

php://filter

php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。 这对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、 file() 和 file_get_contents(), 在数据流内容读取之前没有机会应用其他过滤器。

php://filter与包含函数结合的时候,php://filter流会被当做php文件执行。故我们可以先对其进行编码(如base64,使其不执行,从而达到任意文件读取的目的。

例子见博客Orz
https://blog.csdn.net/qq_42181428/article/details/87090539
https://www.leavesongs.com/PENETRATION/php-filter-magic.html

data://

用法:data://text/plain;base64
当它与include函数结合时,data://流会被当做php文件执行,从而达到任意代码执行的目的。

zlib://

zlib:// — bzip2:// — zip:// — 压缩流
用法:

compress.zlib://file.gz
compress.bzip2://file.bz2
zip://archive.zip#dir/file.txt

这里主要说zip://,因为一般允许上传的文件类型为.zip。当其与include函数结合时,zip://流会被当做php文件执行,从而达到任意代码执行的目的。

  • zip://中只能传入绝对路径。
  • 要用#分隔压缩包和压缩包里的内容,并且#要用url编码%23(即下述POC中#要用%23替换)
  • 只需要是zip的压缩包即可,后缀名可以任意更改。
暂无评论

发送评论 编辑评论


				
上一篇
下一篇