1. 概念
相同代码重复出现在不同文件中出现代码冗余,所以出现了文件包含函数,就是让代码更为高效,需要用到的部分回去调用,且被包含的文件会当作PHP代码执行,忽略后缀本身。
2. 原理:
文件包含漏洞产生的原因是在通过PHP函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。
3. 函数
3.1 include
使用include引用外部文件时,只有代码执行到include代码段时,调用的外部文件才会被引用并读取,当引用的文件发生错误时,系统只会给出个警告错误,而整个php文件会继续执行。【先执行后加载】
3.2 require
在php文件被执行之前,php解析器会用被引用的文件的全部内容替换require语句,然后与require语句之外的其他语句组成个新的php文件,最后后按新的php文件执行程序代码。【先加载后执行】
3.3 include_once
使用include_once会在导入文件前先检测该文件是否在该页面的其他部分被引用过,如果有,则不会重复引用该文件,程序只能引用一次。【要导入的文件中存在一些自定义函数,那么如果在同一个程序中重复导入这个文件,在第二次导入时便会发生错误,因为php不允许相同名称的函数被重复声明】
3.4 require_once
require_once语句是require语句的延伸,他的功能与require语句基本一致,不同的是,在应用require_once时,先会检查要引用的文件是不是已将在该程序中的其他地方被引用过,如果有,则不会在重复调用该文件。【同时使用require_once语句在同一页面中引用了两个相同的文件,那么在输出时,只有第一个文件被执行,第二个引用的文件则不会被执行】
4. 本地文件包含(Local File Include; LFI)
仅能够对服务器本地的文件进行包含,由于服务器上的文件并不是攻击者所能够控制的,因此该情况下,攻击着更多的会包含一些 固定的系统配置文件,从而读取系统敏感信息。很多时候本地文件包含漏洞会结合一些特殊的文件上传漏洞,从而形成更大的威力。
一些常见的敏感信息路径:
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/passwd // 账户信息
- /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 配置文件
5. 远程文件包含(Remote File Include; RFI)
能够通过url地址对远程的文件进行包含,这意味着攻击者可以传入任意的代码。
前提:
allow_url_include = ON
allow_url_fopen = ON
6. PHP伪协议
用于执行特定操作。例如,当路径指向一个PHP文件时,访问该路径,会导致执行PHP,如果想读取该PHP文件的内容(代码),就需要使用php://filter伪协议。
6.1 php://filter
有一些敏感信息会保存在php文件中,如果我们直接利用文件包含去打开一个php文件,php代码是不会显示在页面上的,此时就需要使用php://filter。
例如:php://filter/convert.base64-encode/resource=文件路径
6.2 data://
利用data:// 伪协议可以直接达到执行php代码的效果。
6.3 zip://
如果网站允许我们上传压缩文件,我们也可以将php文件压缩后进行上传,再通过zip://协议直接执行,而无需提前解压。
6.4 php://input
利用该方法,我们可以直接写入php文件,输入file=php://input,然后使用burp抓包,写入php代码。
7. 防护
-
使用str_replace等方法过滤掉危险字符
-
配置open_basedir,防止目录遍历
-
php版本升级,防止%00截断
-
对上传的文件进行重命名,防止被读取
-
对于动态包含的文件可以设置一个白名单,不读取非白名单的文件
-
做好管理员权限划分,做好文件的权限管理
References:
poggioxay
Matthew…
Monsterlz123
pikachu