文件包含

心不动则不痛 提交于 2019-12-05 22:31:37

部分引用  https://www.freebuf.com/articles/web/182280.html

友链  https://blog.csdn.net/qq_33020901/article/details/82684483

 

文件包含给开发人员带来了极大的便利,当网站需要一样的页面或模板时,直接包含需要的网页,就没必要重复编写代码,且需要更改页面的时候,只需修改包含的页面,带来极大的便利的同时,也带了巨大的威胁

在PHP中文件包含函数分为四个

require()

require_once()

include()

include_once()

其中require和include的区别是,require在包含的过程中如果出现错误,程序会继续执行,而include出现错误就停止执行。

require_once和include_once则只包含一次

不管它们里面包含的是什么,图片也好,文本也好,都会被函数当成PHP代码解析,所以文件包含运用不当会给服务器带来极大的威胁

 

文件包含分为两类,即本地文件包含LFI(Local File Inclusion)和远程文件包含RFI (Remote File Inclusion)

本地包含就可以包含服务器本地的文件

远程文件包含可以包含远程的文件,且远程文件包含危害性比本地包含危害还大

远程文件包含还需要PHP配置文件中打开以下两个配置,但是从PHP5.2开始allow_url_include默认为Off

allow_url_fopen = On

allow_url_include = On

 

 

比如我们有个代码,因为没有任何的过滤机制,导致可以任意的进行本地文件包含

<?php
   include($_GET['file']);
?>

可以包含一些敏感信息如/etc/passwd,如果上传了图片马,则可以直接包含利用

 

 

 

远程文件包含测试,包含远程服务器的1.txt, 其中1.txt内容为 <?php phpinfo()?>

 

 

 

 

 

一些绕过方式和技巧

1、%00绕过

但是受magic_quotes_gpc和addslashes等函数的过滤,同时PHP 5.3之后版本全面修复

现在代码修改这样,只能用html,

<?php
include($_GET['file'].html);
?>

但是可以用%00来截断

 

 

 

 2、路径长度截断

条件:windows OS,点号需要长于256;linux OS 长于4096

Windows下目录最大长度为256字节,超出的部分会被丢弃

Linux下目录最大长度为4096字节,超出的部分会被丢弃。

测试代码


<?php
include($_GET['file'].html);
?>

但是本地测试失败

 

3、点号截断

条件:windows OS,点号需要长于256

同样本地测试失败(求懂得大佬留言)

 

 

远程文件包含绕过

测试代码


<?php
include($_GET['file'].html);
?>

?绕过

引用《代码审计:企业级Web代码安全架构》

访问http://remotehost/1.txt和http//remotehost/1.txt?.php返回结果是一样的,webserver会把?之后的内容当成请求参数,txt不在webserver里面解析,参数对访问1.txt返回内容不影响,实现伪截断

 

 同样的测试%23也可以

 

 

 

 

下面介绍一些PHP伪协议

文件包含常常便随着php伪协议,也CTF常用套路

 

1、php://filter   可以对文件进行以base64的形式读取,

需要 allow_url_include=On

常用语法 

?file=php://filter/convert.base64-encode/resource=xxx.php

测试

 

 在用base64解码就即可获得源代码

 

 

2、php://input 可以进行代码执行,写入木马,利用POST传参

需要allow_url_fopen 和 allow_url_include=on

CTF套路 碰到file_get_contents函数可以用php://input进行绕过

这里测试 写入一句话,在www目录下生成shell.php文件

 

 

 

3、file://  可以读取系统文件

 

 

4、data://伪协议 数据流封装器

利用了流的概念,和php://input类似,同样可以造成代码执行

?file=data://text/plain;base64,执行代码base64加密后

 

 

 5、phar://

不管后缀是什么,都会当做压缩包来解压,PHP > =5.3.0 压缩包需要是zip协议压缩,rar不行

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!