文件包含漏洞专题

文件包含漏洞基础

文件包含:程序开发人员通常会把可重复使用的函数写到单个文件中在使用某些函数时,直接调用此文件,而无须再次编写,这种调用文件的过程一般被称为包含。

漏洞成因:在通过动态包含的方式引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可以导致意外的文件泄露甚至恶意的代码注入。

文件包含-JSP

JSP能否文件包含致代码执行?需要什么条件
(1) JSP 文件包含函数: java.io.file()、 java.io.filereader()、 静动态include
(2)静态包含: <%@ include file="1.jsp"%>
动态包含:
<% String name = request.getParameter("name");%>
<jsp:include page=" <%=name%>" />
注:
(1)静态包含是不支持变量赋值的,只能包含指定的文本文件。
(2)动态包含仅支持包含web路径下的jsp文件。(像绝对路径非、web路径非jsp, 文件包含通通失败)
(3)留后门还是一种利用方式。

文件包含-ASPX

aspx能否文件包含致代码执行?需要什么条件?
(1)aspx文件包含函数: include file、include virtual
(2)静态包含:
<!- #include file="top.aspx" -->
<!-- #include virtual ="header.inc" -->
注:
(1) aspx 不支持动态包含,asp一样不支持动态包含。
(2)任意目录任意文件可被包含,可以把内容当做aspx代码执行
(3)留后门是一种利用方式。

文件包含-PHP

php

(1)任意目录任意文件可被包含(和apsx类似,前提是又文件读取权限)
(2)可以动态包含

文件包含常用函数

include()、include_one()、require() 、require_one()、fopen()、readfile()

include()和require()区别

当包含一个不存在的文件时,include会报错。但是下面的语句正常执行,而require就会报错并停止脚步继续执行

include_one()和require_one()

当之前包含过一个文件,就不会再包含了

fopen()和readfile()

readfile是读取一个文件到缓冲区,返回一个整数(为文件的内字符的长度)

fopen()返回的是一个指针

漏洞产生场景

开发过程中,多个文件共用的代码,通常会放到一个单独的文件中,用到的时候再包含进来。

1.如果包含的文件是在程序中是直接指定的,那么就不存在文件包含漏洞了

2.如果包含的文件是动态的,有时候也是需要动态的去包含文件的,这个时候就可能产生文件包含漏洞

文件包含
inlude0等具有文件包含功能的函数通过动态变量的方式引入需要包含的文件

漏洞成因
用户能够控制该变量,防护没做或者没做好,导致可以包含恶意代码。

文件包含漏洞的危害

1)配合文件上传漏洞Getshell (图马)
2)可执行任意脚本代码
3)网站源码文件及配置文件泄***r> 4)远程包含GetShell
5)控制整个网站甚至服务器

防御

(1)不要直接导入用户输入的内容(本地与远程文件包含漏洞相同)做好过滤
(2)路径限制:限制被包含的文件只能在某一目录内,并且一定要禁止目录跳转;开 启 open_basedir 函数,只允许用户访问web目录,可以防止包含其他目录的文件。
(3)做好文件的权限管理,等。

本地文件包含

1、本地文件包含漏洞
本地文件包含(LFI) 漏洞是PHP中一 种典型的高危漏洞。由于程序员未对用户可控的变量进行输入检查,导致用户可以控制被包含的文件,成功利用时可以使Web服务器将特定文件当成php执行,从而导致用户可获取一定的服务器权限。
2、注意事项
(1)两个文件在同一录下
(2)若不在同一录,包含的文件路径必须写相对路径或绝对路径
(3)被包含的页面的后缀无论是什么都会当作php解析

3、漏洞

1)程序没有对要包含的文件进行验证,导致可控,没有任何防护。

2)替换../防止遍历;可以使用复写或者..\绕过。

3)在包含的文件末尾添加后缀的方式进行防护;使用00截断的方式绕过。

远程文件包含

1、远程文件包含漏洞
远程文件包含漏洞(RFI) ,实也属于”代码注入”的-种,其期理就是注入一段用户能控制
的脚本或代码,并让其在服务端执行。
2、前提条件
(1) allow_url_ fopen ON (默认ON)
(2) allow_ur_ include ON (默认OFF)
(3)被包含的变前没有目录的限制
3、注意事项
(1)远程包含文件路径必须为绝对路径
(2)被包含的文件不能够被服务器解析,如php文件

4、漏洞利用

(1)程序没有对要包含的文件进行验证,导致可控 ;可以直接使用远程文件包含的方式,把远程主机上的文件包含进来。

(2)采用在包含的文件末尾添加后缀的方式进行防护;00截断(%23)

文件包含漏洞的利用技巧

File://伪协议

(1)file:// —用于访问本地文件系统
(2)php版本:5.0以上
(3)是PHP 使用的默认封装协议
(4)当指定了一个相对路径(不以/、\、\或Windows 盘符开头的路径)提供的路径 将基于当前的工作目录

php://filter伪协议

(1)php://filter 伪协议用于数据流打开时的筛选过滤应用
(2)在数据流内容读取之前没有机会应用其他过滤器
(3)php 版本:5.0
(4)使用方式:php://filter/read=convert.base64-encode/resource=phpinfo.txt

php://input伪协议

(1)利用条件 allow_url_fopen 不做要求 allow_url_include = On
(2)使用版本:5.6.0 php://input 可反复使用。
(3)利用姿势:
POST 以下数据: ');?>

hackbar中发送post数据

data://伪协议

(1)data:// —数据
(2)使用版本:PHP 5.2.0 起data: 数据流封装器开始有效。
(3)用法:
data://text/plain,
data://text/plain;base64, PD9waHAgcGhwaW5mbygpOyA/Pg==

http://伪协议

(1)http:// -- https:// —访问HTTP(s) 网址
(2)允许通过HTTP 1.0 的GET方法,以只读访问文件或资源。
(3)HTTP 请求会附带一个Host:头,用于兼容基于域名的虚拟主机。如果在你 的php.ini 文件中或字节流上下文(context)配置了user_agent 字符串,它也会被包含 在请求之中。

ftp://伪协议

(1)ftp:// -- ftps:// —访问FTP(s) URLs
(2)允许通过FTP 读取存在的文件,以及创建新文件。
(3)如果服务器不支持被动(passive)模式的FTP,连接会失败。
(4)打开文件后你既可以读也可以写,但是不能同时进行。
(5)版本:php4.3以上 (6)PHP 5.0.0 起文件可以通过ftp:// URL 封装器来追加(append)。在之前的版本, 尝试通过ftp://来追加一个文件将会导致错误。

例如

(1)ftp://example.com/pub/file.txt
(2)ftp://user:password@example.com/pub/file.txt
(3)ftps://example.com/pub/file.txt
(4)ftps://user:password@example.com/pub/file.txt

phar

(1)phar协议的作用是归档,自PHP 5.3.0 起开始有效
(2)Phar归档文件最有特色的特点是可以方便地将多个文件分组为一个文件。这样, phar归档文件提供了一种将完整的PHP应用程序分发到单个文件中并从该文件运行它的 方法,而无需将其提取到磁盘中。
(3)phar 可以处理tar和zip文件

phar伪协议的利用方式
phar://phpinfo.zip/phpinfo.txt
注意事项:
(1)压缩包中文件的名字要和后面的一样
(2)压缩包在压缩后还可以改后缀名
其他归档压缩类扩展
Bzip2、zip、LZF等
zlib:// -- bzip2:// -- zip:// — 压缩流

comress.zlib://file.gz
comress.bzip2://file.bz2
zip://comress.zip:#dir/file.txt

40页后面的使用

什么事文件包含

str_replace

php://input

400 request 能写入数据