网络安全之文件包含漏洞及其防护

一、引言

文件包含漏洞也是一种注入型漏洞,其本质就是输入一段用户能够控制的脚本或者代码,并让服务端执行。举个例子,PHP为例,我们常常把可重复使用的函数写入到单个文件中,在使用该函数时,直接调用此文件,而无需再次编写函数,这一过程叫做包含。有时候由于网站功能需求,会让前端用户选择要包含的文件,而开发人员又没有对要包含的文件进行安全考虑,就导致攻击者可以通过修改文件的位置来让后台执行任意文件,从而导致文件包含漏洞。接下来我们来看一下文件包含漏洞产生的原理。

二、文件包含漏洞的原理

其实原理就是由于在代码开发的过程中,有时候会遇到相同的代码,不想重复输入,就将代码单独写在一个文件里面,当遇到的时候就直接调用该文件进行运行,而这种方式就会导致客户端可以调用其他的恶意文件,通过恶意文件造成文件包含漏洞。

2.1常见的文件包含函数

PHP:include() 、include_once()、require()、require_once()

JSP/Servlet:ava.io.file()、java.io.filereader()

ASP:include file、include virtual

2.2 怎么理解呢?

就比如PHP中的include()函数,这个函数在A页面php使用了,那么A页面可以接收另一个php文件B,然后将其显示在A文件php中,也就是B文件被包含在A文件

代码如下A.php

php 复制代码
<?php
	include B.php;
?>

2.3 如何利用漏洞呢?

例如代码:A.php

php 复制代码
<?php
	include $_GET['test'];
?>

也就是访问A.php页面,可以通过url传入一个参数test,如果这个test是一个文件,就可以被包含执行

html 复制代码
http://www.xxx.com/A.php/?test=B.php

那使用者具备一定的计算机知识,并未按照要求在test传参数时传入B.php,他传入了其他的php文件,更有甚者传入一个系统敏感文件比如:/etc/password 那就有可能导致linux服务器的密码泄露

2.4 一些常见的敏感目录信息路径:

Windows系统:

C:\boot.ini //查看系统版本

C:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件

C:\windows\repair\sam //存储Windows系统初次安装的密码

C:\ProgramFiles\mysql\my.ini //Mysql配置

C:\ProgramFiles\mysql\data\mysql\user.MYD //MySQL root密码

C:\windows\php.ini //php配置信息

Linux/Unix系统:

/etc/password //账户信息

/etc/shadow //账户密码信息

/usr/local/app/apache2/conf/httpd.conf //Apache2默认配置文件

/usr/local/app/apache2/conf/extra/httpd-vhost.conf //虚拟网站配置

/usr/local/app/php5/lib/php.ini //PHP相关配置

/etc/httpd/conf/httpd.conf //Apache配置文件

/etc/my.conf //mysql配置文件

这些信息都非常的敏感,一旦泄露对生产系统的危害可想而知。

三、文件包含发现与利用

3.1 文件包含的发现

一些文件包含在url中显示的比较明显

比如:

http://www.xxx.com/index.php/?name=x.php

看到这样的url,我们可以认为这个index.php页面存在页面包含行为,但不一定就存在漏洞。

再比如:在POST的过程中传入了某些页面/文件,那么他也可能存在文件包含

3.2 文件包含漏洞的利用

这个漏洞其实是尝试出来的,还是以上面为例,这个php网站部署在windows系统的C盘下面,我们尝试通过文件包含去读取一些不一样的文件,比如读取C:\Windows\win.ini这样的系统文件

http://www.xxx.com/A.php/?test=.../.../.../Windows/win.ini

PS: 这里面具体要回退多少层很多是尝试出来的,跟具体部署很有关了

其实读取Linux的敏感文件和读取Windows的敏感文件的逻辑是一样的

文件包含中还有另外一种情况就是伪协议读取,下一次分享

四、如何防范和修复文件包含漏洞

对于文件包含漏洞的防护,有很多方式,主要有以下思路:
1、过滤用户输入

如果系统业务要求必须要使用文件包含,那么最好在后台将要包含的文件直接写死,这是最安全、最彻底的防护方案。如果必须要求包含的文件全部名称或部分名称由用户输入,也要做好检查。最好是模仿DVWA,使用白名单的方式,对用户的输入进行限制。这种方案也非常安全。如果这一点也做不到,那就必须对用户的输入进行一些过滤,比如过滤%0a、过滤.../等危险的字符(串)。
2、调整php参数配置

文件包含漏洞收到PHP配置文件中allow_url_fopen和allow_url_include两个参数影响,如果不是必须,可以考虑将这两个参数设置为Off。如果将allow_url_fopen参数设置为Off,这可以在一定程度上增强系统的安全性。
3、使用WAF等辅助防护工具

除了上述措施外,我们还可以使用WAF,来对系统的安全防护性能进一步提升。

五、小结

单纯看文件包含其实内容较少,利用也较简单,但是在真实环境中是对用户输入进行了过滤替换的,在使用漏洞就需要不断考虑如何绕过这些过滤条件。只要我们开发过程中对于使用了文件包含这些函数的时候,一定要严格对用户参数进行过滤,避免一时偷懒导致服务器被黑,其实最终难逃其就。如有还不太理解或有其他想法的小伙伴们都可以私信我或评论区打出来哟,如有写的不好的地方也请大家多多包涵。

相关推荐
网络安全-杰克27 分钟前
网络安全概论
网络·web安全·php
黑客Ela2 小时前
网络安全中常用浏览器插件、拓展
网络·安全·web安全·网络安全·php
Hacker_LaoYi4 小时前
网络安全与加密
安全·web安全
黑客Ash15 小时前
【D01】网络安全概论
网络·安全·web安全·php
.Ayang17 小时前
SSRF漏洞利用
网络·安全·web安全·网络安全·系统安全·网络攻击模型·安全架构
.Ayang17 小时前
SSRF 漏洞全解析(概述、攻击流程、危害、挖掘与相关函数)
安全·web安全·网络安全·系统安全·网络攻击模型·安全威胁分析·安全架构
网络安全-老纪17 小时前
iOS应用网络安全之HTTPS
web安全·ios·https
Mr.Pascal18 小时前
刚学php序列化/反序列化遇到的坑(攻防世界:Web_php_unserialize)
开发语言·安全·web安全·php
dot.Net安全矩阵20 小时前
.NET 通过模块和驱动收集本地EDR的工具
windows·安全·web安全·.net·交互