本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容
本期用到的软件:yakit(因为经过之前好多期的学习,我相信大家已经足够了解yakit,哪怕不熟悉,至少也知道各个模块有什么用)
我们先来翻译一下这个单词组合是什么意思(不安全的文件上传),和之前我们学到的RCE,File inclusion有一点相似,但是希望大家仔细观察,不要搞混
介绍
不安全的文件上传漏洞概述
文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后,后台会对上传的文件进行判断 比如是否是指定的类型、后缀名、大小等等,然后将其按照设计的格式进行重命名后存储在指定的目录。 如果说后台对上传的文件没有进行任何的安全判断或者判断条件不够严谨,则攻击者可能会上传一些恶意的文件,比如一句话木马,从而导致后台服务器被webshell。
所以,在设计文件上传功能时,一定要对传进来的文件进行严格的安全考虑。比如:
--验证文件类型、后缀名、大小;
--验证文件的上传方式;
--对文件进行一定复杂的重命名;
--不要暴露文件上传后的路径;
--等等...
你可以通过"Unsafe file upload"对应的测试栏目,来进一步的了解该漏洞。
个人评价:会用到非常多的"米奇妙妙工具",只要有一定的开发基础理解起来会非常容易(没有的也别担心,会一一解释的,只是领悟的时间问题而已)
适用场景:有文件上传功能的网站都可以
实际反馈:用起来很简单,但是很多大厂会有过滤,而且没有长时间的后端了解,盲目进行"米奇妙妙工具"的开发会非常艰难,甚至耗费大量时间,结果没用(在此也强调,如果你幸运的拥有大佬们发出来的"米奇妙妙工具",请你使用时关掉杀软或者断网进行测试,不要乱传,不仅可能会锒铛入狱,还会让大佬们分享出来的东西被彻底分析透,导致工具失效)
一,client check
原理
它一般指检查客户端输入的安全性。当用户上传文件时,系统会验证文件的扩展名是否符合要求,防止恶意文件被上传。比如,检查上传的文件是否是图片(如.jpg、.png)而不是可执行文件或其他潜在危险的文件。
就好像一个高中的保安一样,通过识别学生的胸牌和校服来决定他是否可以进入校园
但是同样的,找个看起来很年轻的人,让他穿校服,然后伪造一个胸牌,他也可以进入
实践
有了前几期的了解,我们会知道,前端的很多防护形同虚设,有了自由上传的环境后,就到了我们大展拳脚的时候
因此,我就有了第一个最简单的方法进行攻击
也就是禁止JavaScript
这个在之前的暴力破解模块中就有说到,通过禁止JavaScript可以使他简单的前端防护失效
不过在此之前,我们需要先构建一个木马(这个木马是针对服务器的)(为了防止大家迷惑,所以关于木马的知识我会之后单独出一期的,大家先了解本期的理论内容)
<?php @eval($_POST['shell']); ?>
当然了,知己知彼,方能百战百胜,我们先来分析一下这是什么东西
该代码的主要功能是执行客户端通过 POST 请求发送的 'shell' 参数中的 PHP 代码。黑客可以将恶意 PHP 代码放入 'shell' 参数,服务器端接收到后会直接执行,从而实现远程代码执行,对服务器进行控制、窃取数据、发起攻击等恶意操作。
<?php 和 ?>这是PHP代码的开始和结束标签,用于包裹PHP脚本代码。
@这是PHP的错误抑制运算符,它会关闭错误报告,即使代码执行失败,也不会输出任何错误信息。这是一种隐藏恶意行为手段,使得代码执行中的错误不会被发现。
eval()这是一个PHP函数,它会将传入的字符串作为PHP代码来执行。它是这段代码的核心危险所在。
任何通过$_POST['shell']传递的字符串都会被当作PHP代码执行。
$_POST['shell']这是PHP的超全局变量,用于接收通过POST方法发送的数据。
shell是一个键名,攻击者可以通过构造特定的POST请求,将恶意代码传递到这个键中。
不了解的朋友可能看不懂,但是别担心,努力学习,都会明白的,毕竟我可以把理论说的通俗一点,但是专用性的内容真的没办法
我们来试一下,木马后缀改为php(切记放入杀毒软件的白名单里,不然刚做出来就被杀了)

可以看到,成功了
同样在打开F12后我们可以看到他的前端防护暴露出来了

把
onchange="checkFileExt(this.value)"
删掉就没问题了
上传之后我们可以通过各类连接方面的"米奇妙妙工具"来进行更大的破坏,我之后会同关于木马的讲解一起发出来的,因为我们首先要了解的是理论基础
至此,client check完成
二,MIME type
原理
首先,翻译一下什么是MIME 和MIME type
MIME(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展)类型,最初设计用于在电子邮件传输中标识内容格式,现广泛应用于互联网,向服务器和客户端提供文件信息,帮助它们知道如何处理文件。
组成结构 :由两部分组成,即类型(Type)和子类型(Subtype)。类型表示文件的通用类别,如文本、图像、音频、视频等;子类型则进一步细化,具体说明文件的格式,如纯文本、HTML 文档、JPEG 图像等。
作用机制 :当客户端向服务器请求文件时,服务器会根据文件的 MIME type 来确定如何处理和传输文件。客户端接收到文件和对应的 MIME type 后,根据已知的类型和子类型,判断如何显示或处理文件,比如用特定的程序打开、在浏览器中直接渲染等。
就好像超市进行商品分区一样,哪怕你是从大山里刚被现代人类带回来,只要认识中文后,进入商城后看分区牌子就知道这是干什么的,大概就是类似于日常生活中"标签"这个概念
实践
直接发送我们可以看到不行,但是我们现在知道MIME的概念了
我们还是用熟悉的yakit抓个包

我们直接换格式(也就是我们原理中谈到的MIME这个东西的使用)
换成他要的格式(这里以image/jpg格式为例,别的格式可以自己尝试比如image/jpeg)

发送,成功
三,getimagesize
原理
同样,我们先来分析,解释这是什么意思
getimagesize()
是一个 PHP 函数,主要用于获取图像文件的尺寸信息(例如宽度和高度)以及其他相关信息,比如图像的类型(格式)和 MIME 类型。如果函数感知不到是图像类型就没用
假设你有一堆照片,每张照片的背面都贴着一个小标签(MIME),上面写着这张照片的尺寸、照片的样式(比如纸质打印的那种和正式的红底,蓝底,白底照片)和其他一些信息(比如拍摄日期)
检查照片:想象你正拿着一张照片,首先确认这张照片是真的,而不是一张废纸。
查看标签:你在照片背面找到那个标签,上面有它的尺寸信息,拍摄时间
读取信息:你仔细看标签上的内容,比如是2025年拍摄的,它是一张彩色的全家福。getimagesize()
函数做的也是类似的事情,它读取图像文件中的标签信息。
整理信息:你把这张照片的尺寸、格式等信息记录下来,方便之后使用。getimagesize()
也会把这些信息整理成一个数组,让你可以方便地使用这些数据。
实践
其实很简单,既然他的函数要识别的到,那我们就给他图片,但是后面加上东西(类似于上面说过的扮演成高中生的社会人士,因为穿了校服,保安就不容易发现)
由此我们就有了攻击思路
也就是把图片和木马内容整合在一起
我们先用记事本打开一个图片(记住要符合他的传送内容的要求)

在这里也解释一下为什么图片用记事本打开会是乱码
为了更好理解我们就用简单的方式来说,如果有朋友想要详细了解,可以自己查找,在此不过多赘述:图片用记事本打开就好像用勺子吃牛排,牛排做的再好,用勺子你也吃不好
然后把木马内容放在结尾(放在结尾是因为函数通常是通过文件特征来识别是什么格式的,放在末尾更安全)

当然用yakit也是可以的,也是将木马内容放在末尾就好,再次便不再赘述
至于之后如何启用连接的话,也会同之后的木马内容一并发出来
至此Unsafe Fileupload模块完成
通过本期内容,我们了解了一下关于木马的知识点,也学会了如何制造一个简单的木马,虽然简单,但是需要大家进行自主尝试,比如这次是要图片格式的,那以后用其他文件格式的应该怎么搞,需要举一反三