博主昵称:跳楼梯企鹅
创作初心:本博客的初心为与技术朋友们相互交流,每个人的技术都存在短板,博主也是一样,虚心求教,希望各位技术友给予指导。
博主座右铭:发现光,追随光,成为光,散发光;
博主研究方向:渗透测试、机器学习 ;
博主寄语:感谢各位技术友的支持,您的支持就是我前进的动力 ;
一、原理
随着网站业务的需求,程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,但是正是这种灵活性通过动态变量的方式引入需要包含的文件时,用户对这个变量可控而且服务端又没有做合理的校检或者校检被绕过就造成了文件包含漏洞。
二、常见的文件包含函数
1.include
当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时之给出一个警告,然后继续向下执行。
2.include_once()
Require()与include()的区别在于require()执行如果发生错误,函数会输出错误信息,并终止脚本的运行。
3.require()
Require()与include()的区别在于require()执行如果发生错误,函数会输出错误信息,并终止脚本的运行。
4.require_once()
功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次。
5.highlight_file()、show_source()
函数对文件进行语法高亮显示,通常能看到源代码
6.readfile()、file_get_contents()
函数读取一个文件,并写入到输出缓冲
三、文件包含分类
1.本地文件包含
当被包含的文件在服务器本地时,就形成的本地文件包含漏洞。
2.远程文件包含
要实现远程的文件包含,那么需要满足两个条件在php.ini中。当php.ini 中的配置选项allow_url_fopen和allow_url_include为ON的话,那么就可以实现远程文件包含。就是通过包含第三方服务器的文件,来进行包含。
四、php伪协议
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
并且要知道日志的路径
想要知道绝对路径可以通过phpinfo进行探测,也可以进行猜测日志文件,一般情况下任何配置文件都会定义好路径,所以可以进行尝试。
3.演示
通过日志写入一句话木马
(1)我们通过phpinfo查询日志的绝对路径
(2)根据路径查看代码
(3)任意访问,查看时候记录日志了
(4)打开日志
发现确实存储进去了
(5)利用网址进入目录
(6)进行一句话木马写入
(7)需要抓包改一下编码继续写入
(8)验证
(9)查看效果
这里是因为编码问题所以看这个很乱,但是能看到是存在ip的
七、session包含
三个条件
1.找到session位置
找位置的方法 <1>phpinfo() 通过查找session找路径 <2>猜测日志文件的默认 保存路径 <3>包含配置文件,找到配置文件的存储位置
2.里面的内容可以控制
3.知道session的文件名
七、CMS管理系统
在这里给大家介绍两款CMS管理系统
1.74CMS
2.DedeCMS
方便大家对远程文件包含进行学习练习