1. 文件包含漏洞原理
文件包含【将文件以脚本执行】
文件包含漏洞是指网站在展示或者运行一些页面的时候需要将一些文件包含进来运行,这种行为跟文件上传漏洞是一样的,都是一种正常的操作,但是对包含的文件没有做严格的过滤、检查就会导致包含一些非法的文件来运行。
文件包含各个脚本代码:
<include file="1.asp">
<include file="1.aspx">
<c:import url="http://thief.one/1.jsp">
<jsp:include page="head.jsp"/>
<%@ include file="head.jsp"%>
<?php include('test.php')?>
测试:
在一个文本文件中写入一段代码,在phph文件中包含该文件,执行浏览器访问php文件:
2. 文件包含漏洞类型
- 白盒:代码审计
- 黑盒:漏洞扫描工具、公开漏洞、手工看参数值及功能点
文件包含类型: 本地包含、远程包含
2.1 本地包含
- 无限制:
test.php代码如下,访问该文件,并传入一个txt文件的地址:
- 有限制:
test.php代码如下,访问该文件,并传入一个txt文件的地址:
出现错误,因为该代码强制在后面加上.html后缀:
解决方法:
%00截断
条件:
php.ini文件中 magic_quotes_gpc=off
php版本 < 5.3.4
长度截断
条件:
windows,点号需要长于256
Linux,点好需要长于4096
2.2 远程包含
- 无限制:
查看是否开启远程包含权限:
在远程服务端的a.txt中写入如下代码:
在浏览器中传入该远程文件地址:
- 有限制:
解决方法:
1. 加 ?
2. 加 %00
3. 加 %23
3. 漏洞修复
固定后缀
固定文件
WAF产品
4. PHP伪协议
php://filter
经常使用的伪协议,一般用于任意文件读取,有时也可以用于getshell.在双OFF的情况下也可以使用。
php://filter是一种元封装器,用于数据流打开时筛选过滤应用。这对于一体式(all-in-one)的文件函数非常有用。类似readfile()、file()、file_get_contents(),在数据流读取之前没有机会使用其他过滤器。
参数:
resource=<要过滤的数据流> 这个参数是必须的。它指定了你要筛选过滤的数据流 read=<读链的筛选列表>
该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。 write=<写链的筛选列表>
该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。 <;两个链的筛选列表> 任何没有以 read= 或 write= 作前缀
的筛选器列表会视情况应用于读或写链。
php://input
php://input可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行。当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容。
需要开启allow_url_include
注: 当enctype=”multipart/form-data”时,php://input是无效的。
php://filter用于读取源码
php://input用于执行php代码