01
漏洞介绍
文件包含漏洞是代码注入的一种。其原理就是注入一段用户能控制的脚本或代码,并让服务器端执行,代码注入的典型代表就是文件包含File inclusion。文件包含可能会出现在jsp、php、asp等语言中。服务器通过函数去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,而我们可以构造这个恶意文件来达到邪恶的目的。常见的文件包含的函数如下:
PHP:include() 、include_once( )、require( )、require_once( )、fopen( )、readfile( )
ASP:include file、include virtual
02
文件包含漏洞的分类
文件包含可以分为本地文件包含和远程文件包含两种。顾名思义,本地文件包含就是通过URL将服务器本地的其他文件include进来。远程文件包含就是将远程服务器的文件include进来。最主要的是,包含进来的文件都以当前脚本文件解析,比如,当前测试系统是Apache加php环境,那么被include进来的文件,不管是什么类型,比如说图片,文本文档,这些文件被包含以后,都会被当做php脚本来解析。
03
文件包含漏洞的危害
执行任意代码
读取文件源码或敏感信息。
包含恶意文件控制网站,甚至控制服务器。
04
文件包含漏洞漏洞复现
利用DVWA靶场进行CSRF漏洞演练:
1. Low Security Level
查看源码:
服务器获取 page 的值,没有进行任何过滤。因此直接读取C:\Users\dell\Desktop\1.txt文件。
若文件中存在php代码,,则会执行php代码并返回代码执行的结果。
还可以进行远程文件包含,如下:
2. Medium Security Level
查看源码:
Medium等级的代码将'http://', 'https://', '../', '..\'都替换为空,防御了简单的远程和本地包含。但是我们在后面加绝对路径一样可以执行。
并且,源码中使用的是 str_replace() 函数,可以使用重写的方式绕过。
htthttp://p:// -> http://
..././ -> ../
3. High Security Level
查看源码:
High等级的代码限制了page参数必须以file开头,或者page参数为include.php。
如果要以file开头,我们可以采用file协议来读取,即file:///C:/Users/dell/Desktop/1.txt
05
防御方案
严格判断包含中的参数是否外部可控,因为文件包含漏洞利用成功与否的关键点就在于被包含的文件是否可被外部控制;
路径限制:限制被包含的文件只能在某一文件内,一定要禁止目录跳转字符,如:“../”;
包含文件验证:验证被包含的文件是否是白名单中的一员;
尽量不要使用动态包含,可以在需要包含的页面固定写好,如:include('head.php')。
领取专属 10元无门槛券
私享最新 技术干货