前言
文件包含,代码执行,命令执行常见的函数,以及如何绕过过滤
一、文件包含漏洞
文件包含是什么
程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这种文件调用的过程一般被称为文件包含。
服务器执行PHP文件时,可以通过包含函数加载另一个文件中的PHP代码,并且当PHP来执行,这会为开发者节省大量的时间。这意味着可以创建供所有网页引用的标准页眉或菜单文件。当页眉需要更新时,只更新一个包含文件就可以了,或者当您向网站添加一张新页面时,仅仅需要修改一下菜单文件。
1.文件包含漏洞简介
产生漏洞原因
这是一段PHP代码,从代码上分析可以看出,把一个GET请求的参数“page”传给了一个变量filename,然后包含了这个变量。然而,开发者没有对 G E T [ ‘ p a g e ’ ] 参 数 经 过 严 格 的 过 滤 , 直 接 带 入 了 i n c l u d e 的 函 数 , 我 们 可 以 修 改 _GET[‘page’]参数经过严格的过滤,直接带入了include的函数,我们可以修改 GET[‘page’]参数经过严格的过滤,直接带入了include的函数,我们可以修改_GET[‘page’]的值,包含自己想看的文件。(文件的路径一定要对,不对的话就包含不了)
文件包含漏洞就是: 程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码。从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。
1.文件包含重点四个函数
require()
require_once()
include()
include_once()
include():执行到include时才包含文件,找不到被包含文件时只会产生警告,
脚本将继续执行 ;
require():只要程序一运行就包含文件,找不到被包含的文件时会产生致命
错误,并停止脚本;
include_once()和require_once():若文件中代码已被包含则不会再次包含
2.漏洞利用的条件
1.程序用include()等文件包含函数通过动态变量的范式引入需要包含的文件
2.用户能够控制该动态变量
3.要保证php.ini中allow_url_fopen和allow_url_include要为On
注意:
1.PHP中只要文件内容符合PHP语法规范,包含时不管扩展名是什么都会被PHP解析,
2.若文件内容不符合PHP语法规范则会暴漏其源码。
3.php.ini配置文件:allow_url_fopen=off 只有开启了才可以包含文件。
4.php4存在远程&本地,php5仅存在本地包含。
3.漏洞分类
本地包含:
可以包含本地文件,在条件允许时甚至能执行代码
读敏感文件,读PHP文件
包含日志文件GetShell
包含data:或php://input等伪协议
若有phpinfo则可以包含临时文件
配合上传图片马,然后包含从而GetShell
远程包含:
包含远程的木马或病毒文件,从而GetShell
注意:要实现远程文件包含需要allow_url_fopen和allow_url_include都开启
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 配置信息
c:\windows\my.ini
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
/etc/my.conf // mysql 配置文件
2.本地包含敏感文件
1.本地包含文件过程:
在一个网站中,
存在着这么几个文件:index.php 、LFI.php 、phpinfo.php
其中,index.php存在着包含的功能,现在想用index.php包含LFI.php文件和phpinfo.php文件
1.首先让page=LFI.php文件
2.page的值传给变量filename
3.include包含这个变量
4.网页便包含了这个文件
phpinfo.php这个文件也这么包含进来
2.文件包含简单例子
拿windows系统中的boot.ini文件为例进行包含,因为boot.ini在C盘的根目录下,我们要包含这个文件的话首先要进入到这个目录下才能包含它。
这里便遇到了相对路径和绝对路径的概念
绝对路径:是指目录下的绝对位置,直接到达目标位置,需要输入完整的文件路径。
相对路径:是指由这个文件所在的路径引起的跟其它文件(或文件夹)的路径关系。
相对路径需要用到“…/”来访问上一级路径
假设index.php在C:\www目录中
则包含boot.ini路径为
/index.php?page=../../boot.ini
3.文件包含简单绕过限制
有一些对文件包含做出了过滤限制,比如代码为
include($filename . ".html") ///在包含变量$filename时,限制了只允许包含“.html”
格式的文件,这就阻止了一些非法的包含其他文件的情况
</