文件包含漏洞的由来:开发人员通常会把可重复使用的函数写入到单个文件中,在使用某些函数时
直接调用此文件,而无需再次编写,这种调用文件的过程被称为“包含”。
有时候由于网站功能需求,会让前端用户选择要包含的文件,而开发人员没有对其进行安全防护,就导致攻击者可以通过修改文件的位置来让后台 执行任意文件,从而导致文件包含漏洞。
Security Level: Low/ Medium/High
#1 比较代码
Level Low没有任何验证或过滤,可以直接修改URL, 用’…/’ 进行任意目录遍历( LFI ); 或传入外部URL 进行远程包含 ( RFI )
Level Medium 引入黑名单字符替换; 通过str_replace()函数将http://和https://都替换成了空,主要是为了防止远程文件包含, 还过滤了…/ 和 …\ 防本地包含;函数只擦除一层,不会循环递归过滤,因此可以双写(例如: ‘…//’ 或 'hthttp://tp://‘)绕过;
远程包含 ( RFI )漏洞前提, 需要服务器的 php.ini配置文件,满足如下:
allow_url_fopen= On //默认打开
allow_url_include= On //默认关闭
magic_quotes_gpc= Off //默认关闭
Level High 使用 fnmatch()函数进行前缀匹配限制——它要求变量必须以’file’开头, 或者完全等同于 ‘include.php’ ;但是该限制忽略了PHP 内置的‘伪协议机制’,所以Payload 以’file://’ 开头的伪协议路径 (例如:’ file:///etc/passwd’)绕过;