一、原理
随着网站业务的需求,程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,但是正是这种灵活性通过动态变量的方式引入需要包含的文件时,用户对这个变量可控而且服务端又没有做合理的校检或者校检被绕过就造成了文件包含漏洞。
二、常见的文件包含函数
1.include
2.include_once()
3.require()
4.require_once()
5.highlight_file()、show_source()
6.readfile()、file_get_contents()
三、文件包含分类
1.本地文件包含
当被包含的文件在服务器本地时,就形成的本地文件包含漏洞。
2.远程文件包含
要实现远程的文件包含,那么需要满足两个条件在php.ini中。当php.ini 中的配置选项allow_url_fopen和allow_url_include为ON的话,那么就可以实现远程文件包含。就是通过包含第三方服务器的文件,来进行包含。
四、php伪协议
伪协议 | 解释 |
file:// | 访问本地文件系统 |
http:// | 用于远程文件包含 |
php:// | php://input----写入一句话木马,用POST的方式执行代码 php://filter----通常用来读取源码 |
zip:// & zlib:// | 压缩流,可以读取压缩包里面的子文件当做代码解析 |
data:// | 数据流 可以用get请求的方式执行代码 |
phar:// | 他的作用和zip一样,但是写法不一样 |
五、绕过姿势
1.本地绕过
<1>路径长度截断
条件:在 windows系统中,文件后缀最大长度256字节,在Linux中最大长度是4096字节 , 超出的部分会被丢弃
例如:
.....或者 /. --------进行绕过
<2>00截断
00截断是操作系统层的漏洞,由于操作系统是C语言或汇编语言编写的,这两种语言在定义字符串时,都是以\0(即0x00)作为字符串的结尾。操作系统在识别字符串时,当读取到\0字符时,就认为读取到了一个字符串的结束符号。因此,我们可以通过修改数据包,插入\0字符的方式,达到字符串截断的目的。00截断通常用来绕过web软waf的白名单限制。
2.远程绕过
绕过方式 |
?绕过 |
samba绕过 |
%23绕过 |
以上的绕过方式会单独出一篇文章进行讲解
六、日志包含
1.意思
2. 条件
allow_url_fopen为ON
allow_url_include为ON
并且要知道日志的路径
3.演示
通过日志写入一句话木马
(1)我们通过phpinfo查询日志的绝对路径
(2)根据路径查看代码
(3)任意访问,查看时候记录日志了
(4)打开日志
发现确实存储进去了
(5)利用网址进入目录
(6)进行一句话木马写入
(7)需要抓包改一下编码继续写入
(8)验证
(9)查看效果
这里是因为编码问题所以看这个很乱,但是能看到是存在ip的
七、session包含
三个条件
七、CMS管理系统
在这里给大家介绍两款CMS管理系统
1.74CMS
2.DedeCMS
方便大家对远程文件包含进行学习练习