- 什么是文件包含
由于后端服务器对用户输入内容未作合理的校验处理,导致引入了程序之外的文件并执行
LOW
一、查看页面情况

- 页面中存在引入其他文件的内容,那猜测存在文件包含漏洞
- 在
page后输入不存在的文件名,让页面报错显示出当前网页的位置

- 这里为了体现出成功了,我在靶机的
vulnerabilities目录下创建了phpinfo.png图片文件 - 若页面输出了php有关的信息那就表明成功了
# 这是个图片后缀,其中的内容是
<?php echo phpinfo() ?>
二、具体操作
- 在page后输入
../phpinfo.png

页面成功将图片当作php代码执行,那就证明文件被成功引入当作php代码执行了
三、代码审计
<?php
$file = $_GET[ 'page' ];
?>
- 后端直接读取了用户输入的内容,未作任何过滤校验处理
总结:后端未作任何防护,存在文件包含漏洞
Medium
一、页面无变化
通过查看不存文件看网站位置,之后输入刚才的路径查看
http://192.168.75.1/DVWA/vulnerabilities/fi/?page=../phpinfo.png
- 页面报错,首先想到的是过滤了一些内容,输入了
../phpinfo.png,那猜测是过滤了..,/等字符 - 尝试双写绕过输入
....//phpinfo.png


- 发现成功绕过
二、代码审计
<?php
$file = $_GET[ 'page' ];
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\\" ), "", $file );
?>
- 这里使用了str_replace()函数,将数组中的内容换成空格,从而过滤掉恶意输入内容
- 这里只是做了单次过滤,可以被前端双写绕过
总结:后端对用户输入做替换,将包含有恶意的字符过滤成空格操作,但页面还是存在文件包含漏洞
High
一、查看页面没啥变化
- 直接输入文件路径后看变化
- 发现无论如何操作页面都提示找不到文件

二、由于这是比较老的靶场,那它是用的php语言版本应该是比较早期的(存在有很多问题)可以使用%00截断的方式来尝试绕过
-
%00截断原理(php5.3一下的版本有):%00在url编码后是空字符(表示无),在php的底层原理中(基于c语言的)空字符白表示结束的意思- 那整条语句就是,当php识别到
%00后面的内容后,php语言会将后面的内容忽略,直接执行下一条指令
-
那尝试输入内容
../phpinfo.png%00
!
- 这里发现了一个使用了函数
fanmatch()函数 - fanmatch(a,b)函数简单来说,就是判断b是否包含有a内容
- 结合页面给出的几个文件判断,都有相同的file,php等字段,那就禅师看看
?page=file../phpinfo.png

- 页面有显示,且phpinfo函数正常执行
三、代码审计
$file = $_GET[ 'page' ];
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
- 可以看出直接获取用户传入的信息进行判断
- 通过函数fnmatch()函数限定查找文件的范围
总结:后端只要通过fnmatch()函数来判断用户输入内容的合法性和正确性,忽略了因php版本低导致的漏洞问题
Impossile
一、代码审计
$file = $_GET[ 'page' ];
$configFileNames = [
'include.php',
'file1.php',
'file2.php',
'file3.php',
];
if( !in_array($file, $configFileNames) ) {
echo "ERROR: File not found!";
exit;
- 后端做了白名单过滤,严格控制访问的文件
1815

被折叠的 条评论
为什么被折叠?



