当前位置: 首页 > news >正文

第九周文件上传

文件上传漏洞

不同的网站要不同的webshell。我们使用是php开发的网站。

一服务器白名单绕过

服务端白名单(Whitelist)是⼀种安全机制,它只允许预定义的合法元素通过(只有有限的元素进入),其他所有内容默认被拒绝。相比黑名单,白名单通常更安全。但某些情况也会被绕过。
分为两种:

1.1MIME类型检测绕过

利用burp来整。可以修改Content-Type来发送php,把类型改为image就ok。

不过都是可以在发送图形时,掺一点php代码就。

1.2 00截断绕过

该类型漏洞比较老且条件苛刻,实战当中几乎不会出现,仅理解原理即可.

操作系统在识别字符串时,当读取到\0字符时,就认为读取到了⼀个字符串的结束符号。系统是C语⾔或汇编语⾔定义字符串时以\0作为字符串的结尾,电脑在读取到\0时认为到结尾了,因此,我们可以通过修改数据包,插⼊\0字符的方式,达到字符串截断的⽬的。
⽤户在前端输⼊的时候是不能直接使⽤\0的,通常会使⽤%00或者0x00。
举例子
http://www.XXX.com/upload/aaa.php%00bbb.jpg
\0在ASCII码表中意味空字符,所以输入的时候%00bbb.jpg是省略的。

二服务器黑名单绕过

服务端⿊名单(Blacklist)是⼀种安全防护机制,它会明确禁⽌某些已知的危险元素,但这玩意太多了,所以相比于白名单较为容易绕过。

缺点
说明案例
覆盖不全无法穷尽所有危险项漏掉.phtml
导致绕过
静态防御难以应对新型攻击变种新型扩展名不断出现
维护成本高需持续更新黑名单每个新漏洞都需添加规则
误杀风险可能组织合法请求禁止 select
影响正常查询
绕过手段多攻击者创新速度快大小写/编码/截断等多种方式
依赖实现细节受服务器解析逻辑影响IS/APACHE/Nginx处理差异

2.1特殊可解析后缀

就是说除了代码中的禁止个后缀名的,我们可以写入许多 Web 服务器配置也会将以下扩展名识别为 PHP 脚本并执⾏其中的代码:

其他的后缀名:
  1. .phtml:传统上⽤于 "PHP + HTML" 混合⽂件,许多默认配置中已启⽤
  2. .phps:本应⽤于显示 PHP 源代码(Source),但如果配置不当,可能会被执⾏⽽⾮显示
  3. php5:⽤于 PHP 5 特定脚本,在⼀些服务器上显式⽀持
  4. .pht:较少⻅但可被解析的扩展
  5. 其他变种:.php4   .php3 (旧版 PHP 3)    .php7     .phar (PHP 归档⽂件)

2.2.htaccess⽂件绕过

Upload-labs(Pass-04)源码分析,又多了黑名单后缀,相中间件为Apache的情况下,⿊名单未校验 .htaccess ⽂件,导致可上传该⽂件,绕过⿊名单检测.

2.2.1什么是.htaccess 呢?

.htaccess ⽂件也被称为分布式配置⽂件,全称是 Hypertext Access。.htaccess ⽂件提供了针对目录改变配置的⽅法, 即在特定的⽂档⽬录中放置⼀个包含⼀条或者多条规则指令的该文件,以作⽤于此⽬录及其所有子目录。通过.htaccess⽂件,可以帮我们实现:
  • 网页301重定向、⾃定义404错误⻚⾯、
  • 改变⽂件扩展名、允许/阻⽌特定的⽤户或者⽬录的访问(我们就是着重与这个)
  • 禁⽌⽬录列表、配置默认⽂档等功能。

.htaccess⽂件⽣效的前提条件

  • mod_rewrite模块开启
  • AllowOverride All

由于没有过滤 .htaccess ⽂件,可以重写⽂件解析规则绕过,上传⼀个.htaccess文件

<FilesMatch "a.jpg">  #名字非常重要,发送后下面的名字要相同
Sethandler application/x-httpd-php
</FilesMatch>

记住 filename要改为".htaccess "。.htaccess针对的是文件夹生效的。这样子就会把a.jpg当成php来解析。

然后再把a.jpg发送进去,记住名字一定改为a.jpg

2.3.user.ini⽂件绕过

.user.ini和.htaccess⼀样是⽬录的配置⽂件,.user.ini就是⽤户⾃定义的php.ini,可以利用这个⽂件来构造后⻔和隐藏后⻔。不过有一个前提是传输的服务器里面必须有一个php文件,否则.user.ini无法生效
.user.ini使⽤范围很⼴,不仅限于 Apache 服务器,同样适⽤于 Nginx服务器,只要服务器启⽤了
fastcgi 模式 (通常⾮线程安全模式使⽤的就是 fastcgi 模式)。但是docker环境不是fastcgi模式,⽆法复现该漏洞。

2.4⼤⼩写绕过

通过Upload-labs(Pass-06)查看源代码,可以看到又禁了很多后缀名。但是没有后缀名大小写进进行统一。可以利⽤大小写进⾏绕过。PhP,Php

2.5空格绕过

Upload-labs(Pass-07)通过代码分析没有去空格,在⽂件后缀加空格后上传.

不过上传成功了,但是我们无法访问成功。原理:Windows系统中会⾃动去除⽂件名最后的空格,靶场是linux环境。

因此在Windows系统中可以使用此方法绕过。

2.6点绕过

Windows系统中会⾃动去除⽂件名最后的 . ,因此在Windows系统中可以使⽤此⽅法绕过;Linux系统虽然不会⾃动去除⽂件名最后的 . ,但是部分Linux系统搭配中间件可以实现解析。

2.8::$DATA绕过

在Windows中,如果⽂件名 + ::$DATA 会把 ::$DATA 之后的数据当成⽂件流处理,不会检测后缀名,且保持::$DATA之前的文件名。使⽤它的⽬的就是不检查后缀名。

Windows会⾃动去掉末尾的::$DATA变成 phpinfo.php

这个是图片展现了防止::$DATA绕过。

这是上传

2.9配合解析绕过

也就是说⾸尾去空,删除末尾的点,去除字符串:$SDATA,转换为小写这些措施只验证了⼀次,所以绕过思路也很简单:在数据包中把后缀名改为:
.php. .(两个点之间有个空格)
.php. ::$DATA

以 .php. . 为例的验证过程:⾸先系统发现最后有⼀个点,这时会把它去掉,又发现有⼀个空格,也会把它去掉,这时还有⼀个点,也就是.php. 由于系统只验证⼀次,所以不会再去掉剩下的点,这时就可以上传成功。

2.10双写后缀名绕过

从源码中可以发现,源码中定义了黑名单列表,我们上传⽂件的后缀名凡是符合黑名单中任意一个后缀都会被替换为空,那么我们可以利⽤双写后缀名的方式进行绕过。例如
phpinfo.pphphp 替换后变成 phpinfo.php

三.服务端内容检查绕过

3.1文件头检查

Upload-labs Pass-14 根据下⾯描述, 需要使⽤图片进行上传, 然后使用文件包含漏洞进行利用获 Webshell 。查看源码, 发现web后端代码检查了上传⽂件的前两个字节并且根据字节判定文件后缀,

只能上传后缀为图片的文件。从代码看,都可以看出类似白名单。

绕过是与文件包含有关系的。特点就是无论后面是什么,都会把它当是php代码来执行。

3.2突破getimagesize和exif_imagetype

⽤getimagesize函数来判断上传⽂件,作⽤是获取⽂件是不是图⽚格式
的。但都是可以上传⼀张真图然后抓包,在最后添加木马就行了。

3.3二次渲染绕过

这一个比较综合了。这个的过程就是,先接收的时候检查一下文件的后缀名字和文件类型,然后再利用⽤ imagecreatefrom[jpeg|png|gif] 函数来判断是否为真的图片,如果是图片的话image[jpeg|png|gif] 函数对其进行二次渲染。
简单来说,它会把你发的图片检查一下确认是否为真的图片,如果确认为真的图片后再生成一张图片。
我们上传张图片看看,可以明显看出两张图片大小不对。所以我们可以找到两张图片没有改变的部分,然后再把php代码插入进去。不过图片有不同的后缀
  • GIF:渲染前后的两张 GIF,没有发生变化的数据块部分直接插⼊ Webshell 即可
  • JPG:需要使用脚本将数据插⼊到特定的数据块,而且可能会不成功,所以需要多次尝试
  • PNG:没有 GIF 那么简单,需要将数据写⼊到 PLTE 数据块 或者 IDAT 数据块
如何找出两张图片的相同和不同之处了?
这就需要工具010editor:010 Editor - Pro Text/Hex Editor | Edit 300+ Formats | Fast & Powerful | Reverse Engineering
下载好后打开比较,curl+m
比较后。match蓝色意味相同,找到相同的后在蓝色区域插入PHP代码。
记得在右边更改且保存
重新上传文件出现图片则证明成功了。(如果不成功,可以按同样方法多操作几次)

3.4条件竞争

代码看出,当你上传文件时,会判断是否是图片,如果是的话重新命名,如果不是的话,就会直接删除代码。也就是说,不管我们上传是不是图片,都会短暂的保留在服务器里面,只要我们在电脑判断期间让上传的php代码执行速度快过删除速度就行了。

如果赶在被删除之前执行并生成新的webshell而新的webshell是不会被删除的。这个也叫做条件竞争上传绕过

#一旦执行就会生成新的webshell
<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST["aa"])?>');?>

我们进行竞争分为两步

1.利用burp的Intruder模块来不断地上传php文件

记住要把插件关掉,否则会崩溃。

2访问php⽂件

再重发get请求,多试一试几次就成了。

从这里可以看出已经成了。再次访问一下创建的文件,再用蚁剑连接

四.中间件解析漏洞

文件上传漏洞在不同的系统 、架构以及行为中, 利用形式也是各不相同 。常用的web容器有IIS Tomcat Nginx Apache 。以下主要以⽐较经典的解析漏洞做解释。

IIS 5.x/6.0 解析漏洞

漏洞原理

  1. 当创建.asp的⽂件⽬录的时候 ,在此⽬录下的任意文件, 服务器都解析为asp文件 。例如如下: 漏洞⽬录利⽤形式:www.xxx.com/xx.asp/xx.jpg。xx.jpg的内容可以为—段合法的asp脚本文件。
  2. 服务器默认不解析;以后的内容, 导致xx.asp;.jpg被解析成xx.asp

漏洞⽂件利⽤形式:www.xxx.com/xx.asp;.jpg xx.jpg的内容可以为—段合法的asp脚本⽂件。

微软认为这不是漏洞所以没有补丁。

Nginx 解析漏洞

漏洞原理:Nginx⽂件解析漏洞主要发⽣在PHP环境与Nginx的配合使用中,核心问题是NginxPHP-FPM对请求URI的处理不—致导致的。

触发条件:

  1.   Nginx版本 < 0.8.41
  2. 配置了  fastcgi_split_path_info  且正则表达式不安全

Apache 解析漏洞

Apache 1.x2.x版本中存在解析漏洞 ,例如如下地址格式

  www.xxxx.com/post_shell.php.mage.edu

Apache从右到左开始判断后缀 ,若edu非可识别后缀, 再判断mage 直到找到可识别后缀才停止, 然后将 该可识别后缀进解析, 因此如上地址解析为访问apache.php文件

五.Upload_Auto_Fuzz

在日常遇到文件上传时,如果一个个去测,会消耗很多时间,如果利用工具去跑的话就会节省很多时间,本Burp Suite插件专为文件上传漏洞检测设计,提供自动化Fuzz测试,共500+条payload。
地址:GitHub - T3nk0/Upload_Auto_Fuzz: 本Burp Suite插件专为文件上传漏洞检测设计,提供自动化Fuzz测试,共500+条payload。

主要功能

windwos特性

  • NTFS数据流(::$DATA)
  • 保留设备名(CON, AUX)
  • 长文件名截断

内容欺骗

  • 魔术字节注⼊(GIF/PNG/PDF头)
  • SVG+XSS组合攻击
  • 文件内容混淆(注释插⼊、编码变异)

安装⽅式

该插件是python开发,因此需要先安装jython。

这样就好了。


文章转载自:

http://4xWM80Ji.drfcj.cn
http://nUxgpmb2.drfcj.cn
http://ZN4tMPB6.drfcj.cn
http://lwpKQQjS.drfcj.cn
http://O4g9suuX.drfcj.cn
http://0QnaBiKJ.drfcj.cn
http://qAPy6Ac1.drfcj.cn
http://UKRIQ6Yq.drfcj.cn
http://SR5KrVU0.drfcj.cn
http://f8YnlZYu.drfcj.cn
http://tbHAB5r8.drfcj.cn
http://golYo6z2.drfcj.cn
http://SZ9Pnzpj.drfcj.cn
http://kECAuFUx.drfcj.cn
http://O3LHqtVr.drfcj.cn
http://8mhMsLqN.drfcj.cn
http://ss6LsEP0.drfcj.cn
http://bI2tCdWC.drfcj.cn
http://zbfbrmQ3.drfcj.cn
http://io7j6cnP.drfcj.cn
http://U13ekMQz.drfcj.cn
http://rD6b9aNW.drfcj.cn
http://6sDSDwZV.drfcj.cn
http://BrD9ySw4.drfcj.cn
http://HtZR4kM5.drfcj.cn
http://Brw6b2yn.drfcj.cn
http://7TzW18db.drfcj.cn
http://QJSaqO6P.drfcj.cn
http://XH3ZZ3pD.drfcj.cn
http://7PQ5xxPs.drfcj.cn
http://www.dtcms.com/a/388619.html

相关文章:

  • MCP大白话理解
  • 【Qt】QJsonValue存储 int64 类型的大整数时,数值出现莫名其妙的变化
  • 【C语言】冒泡排序算法解析与实现
  • [GESP202309 三级] 进制判断
  • 【C++】const和static的用法
  • 箭头函数{}规则,以及隐式返回
  • brain.js构建训练神经网络
  • 开学季高效学习与知识管理技术
  • C++STL与字符串探秘
  • 【面试题】- 使用CompletableFuture实现多线程统计策略工厂模式
  • 打工人日报#20250917
  • LeetCode:12.最小覆盖字串
  • 【C++】 深入理解C++虚函数表与对象析构机制
  • C++ 中 ->和 . 操作符的区别
  • SQL CTE (Common Table Expression) 详解
  • 解决windows更新之后亮度条消失无法调节的问题
  • FPGA学习篇——Verilog学习译码器的实现
  • JavaScript Promise 终极指南 解决回调地狱的异步神器 99% 开发者都在用
  • AI智能体开发实战:从提示工程转向上下文工程的完整指南
  • jtag协议处理流程
  • 【LeetCode 每日一题】2749. 得到整数零需要执行的最少操作数
  • 《饿殍:明末千里行》Switch版试玩发布 3月13日发售
  • LeetCode:9.找到字符串中所有的字母异位词
  • Java获取淘宝商品详情数据的详细说明
  • PyTorch张量运算、索引与自动微分详解
  • Simulink变量优先级与管理策略
  • 大模型学习:什么是FastText工具
  • 从芯片到云:微软Azure全栈硬件安全体系构建可信基石
  • 当文件传输遇上网络波动:如何实现稳定高效的数据交换
  • C++访问限定符private、public、protected的使用场景