文件上传漏洞&靶场通关详解
什么是文件上传漏洞?
大部分网站都拥有上传文件的部分,文件上传漏洞是由于网站开发者对用户上传文件的过滤不够严格,攻击者可以通过这些漏洞上传可执行文件(如木马,恶意脚本和WebShell等等),从而达到随意控制网站的目的。
文件上传漏洞有哪些危害?
攻击者可以通过这些漏洞上传可执行文件(如php),使服务器被控制,从而使攻击者能够植入后门程序,窃取敏感信息,侵犯用户隐私,上传恶意软件,造成数据篡改和损坏等等。
文件上传的过程?
用户发送的文件被服务器接收------>经过网站检测------>产生临时文件------>移动到指定路径
什么是WebShell?
WebShell是攻击者成功入侵网站后留下的后门程序,通常由asp,jsp和php编写。攻击者能够随时通过WebShell进入网站后端,随意查看和控制网站内容。
WebShell的分类如下:
文件上传漏洞的方法
接下来就围绕以上类型进行介绍:
前端检测
判断
直接查看:在浏览器中右键点击页面,选择 "查看源代码" 或 "检查",打开开发者工具并切换到 "Sources" 或 "代码" 选项卡。然后搜索与文件上传相关的 JavaScript 函数,通常会有一些函数用于验证上传文件的类型、大小等属性。比如,可能会找到名为 validateFileUpload 或类似名称的函数,这很可能就是用于前端验证的函数。
查找特定关键词:使用浏览器的搜索功能(通常是快捷键 Ctrl+F 或 Command+F)在源代码中查找与文件上传验证相关的关键词,如 upload、file、validate、check 等,结合这些关键词来定位前端验证的 JavaScript 代码部分。
用浏览器开发者工具:打开浏览器的开发者工具,切换到 "Network" 选项卡,然后尝试上传一个文件。观察在文件上传过程中发起的网络请求,查看请求头和请求体中的信息。如果在请求发送之前有 JavaScript 代码对文件进行了验证,那么在请求头或请求体中可能会体现出验证的结果或相关参数。例如,可能会看到一个名为 X-File-Validated 的请求头,其值表示文件是否通过了前端验证。
借助抓包工具:除了浏览器开发者工具外,还可以使用专业的抓包工具,如 Wireshark 或 Fiddler。通过这些工具捕获文件上传时的网络数据包,分析其中的 HTTP 请求和响应,以确定是否存在前端 JavaScript 验证。如果有前端验证,通常会在请求发送之前看到一些与验证相关的 JavaScript 操作。
尝试绕过验证:选择一个不符合页面要求的文件进行上传,例如文件类型不被允许或者文件大小超过限制。如果页面只是简单地弹出一个提示框告知文件不符合要求,而没有将文件真正上传到服务器进行验证,那么很可能是使用了前端 JavaScript 进行验证。因为如果是后端验证,通常会先将文件上传到服务器,然后服务器再返回验证结果。
修改前端代码:通过浏览器开发者工具找到与文件上传验证相关的 JavaScript 代码,尝试修改其中的验证逻辑,例如将文件类型的限制条件修改为允许所有类型的文件。然后再次上传文件,如果此时文件能够成功上传,而在修改代码之前不能上传,那么就可以确定该页面使用了前端 JavaScript 验证。
绕过方法
禁用JS检测 :
1.F12打开开发人员选项,右上角三个点打开设置,禁用js
2.浏览器搜索url:about:config,搜索JavaScript,双击关闭
第一关
新建php文件,写入一句话木马
禁用JS后上传一句话木马,之后直接用蚁剑连接即可
还有另外一种方法第三关提到
后端检测
Content-Type检测
原理
后端通过检查HTTP请求头中的Content-Type字段来确定上传文件的类型。服务器是通过ent-type判断类型,content-type在客户端可被修改,因此可以绕过。
第二关
根据以下代码可知检测Content-Type确定文件类型
则可以上传php一句话木马,用bp抓包,修改Content-Type为代码中任意一种,即可绕过
也可以直接上传图片马,修改后缀为php,第三关会详细介绍
黑名单绕过
黑名单
文件上传黑名单是指在文件上传过程中,服务器明确禁止上传的文件类型列表。
第三关
分析源码可知后端将检测文件后缀类型,以上四种文件后缀不被服务器所接受,这时就可以通过上传可支持文件,之后抓包修改后缀实现绕过,如(phtml,php3,php5等等).
这里我们尝试phtml
先上传php木马,bp抓包改后缀
蚁剑连接失败
![img](https://img2023.cnblogs.com/blog/3542155/202411/3542155-20241127230318243-424320538.
检查配置文件
发现phtml被注释,打开这串代码,重启phpstudy,再次尝试,成功连接蚁剑
.htaccess绕过
htaccess定义及作用
.htaccess文件(或者分布式配置文件),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。
通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
绕过方法
因为.htaccess文件拥有改变文件后缀的作用,因此当改文件未被禁止时,我们就可以通过上传该类文件实现改变随后上传文件后缀的目的,从而绕过黑名单。
第四关
检查源码,发现是检测后缀是否在黑名单之中,黑名单中没有.htaccess,则可以利用该漏洞入侵服务器。
先新建.htaccess文件,写入如下内容
作用是让png,txt文件也可以执行php文件功能,也可以删除这串代码中的最后.png .txt,表示将随后上传的所有文件当作php文件处理。
先上传该文件,再上传黑名单之外的一句话木马文件(如图片马).
哦吼,连接失败,查询资料才知道启用.htaccess,需要修改httpd.conf,启用AllowOverride和rewrite,将none改成all即可,rewrite模块默认开启。
再次尝试,成功连接蚁剑
.user.ini绕过
原理
.user.ini在PHP_INI_USER的配置项之中,官方解释如下
.user.ini实际上就是一个可以由用户"自定义"的php.ini,它用于覆盖或追加全局配置文件(如.php.ini)中的PHP配置选项,可以覆盖php.ini文件。
绕过
我们可以通过先上传.user.ini文件,内容如下(其中1.png为随后上传的文件名)
再上传一个图片马,包含起来进行getshell。不过前提是含有.user.ini的文件夹下需要有正常的php文件,从而导致服务器对图片文件的错误处理而导致的文件执行。
第五关
黑名单中没有.ini后缀,先上传.user.ini文件,再上传1.png
根据提示
尝试访问readme.php
成功!
蚁剑连接即可
大小写绕过
原理
有些网站没有严格过滤大小写,这时就可以利用大小写混合来绕过检测。
第六关
网页源代码没有过滤大小写,这时就可以利用大小写绕过检测。
先上传php木马文件,然后用bp抓包,修改后缀为大小写混合,用蚁剑连接即可
空格绕过
如果网站没有过滤空格时,就可以通过在检测数据后添加空格实现绕过
第七关
检测源代码,发现函数trim,其解释如下
由于本题是通过判断后缀检测文件是否能够上传,则在后缀后添加空格即可,步骤和第六关类似
蚁剑连接成功
点绕过
和空格绕过类似,这里不再详述。
第八关
NTFS交换数据流绕过
原理
window中,文件名+"::\(DATA"会把::\)DATA之后的数据当成文件流处理,不会检测后缀名,且保持"::$DATA"之前的文件名,不会检查后缀名。
第九关
源代码中没有过滤::\(DATA,和前几关步骤类似,bp抓包,改后缀,蚁剑连接 ![img](https://img2023.cnblogs.com/blog/3542155/202411/3542155-20241128212256028-774043099.bmp) 不过蚁剑连接时需要删除::\)DATA
点空点绕过(. .)
原理
deldot()函数从后向前检测,当检测到末尾的第一个点时会继续它的检测,但是遇到空格会停下来,从而绕过检测。
第十关
当从右往左检测文件名时,会删除最后的 '.'和' '然后停止,之后得到文件名'X.php.',和之后点绕过相同。
双写后缀绕过
原理
在上传模块,有的代码会把黑名单的后缀名替换成空,例如a.php 会把php 替换成空,但是可以使用双写绕过例如 asaspp,pphphp,即可绕过上传。
第十关
其中str_ireplace函数会从左往右检测文件后缀是否在黑名单之中,若在的话,就会将其删除。
如果我们将文件后缀变成pphphp时,他只会检测到中间的php并删除,然而剩余字符依然构成php后缀,就能够实现绕过。
步骤依然一样,不再啰嗦。
%00截断绕过
原理
如果黑名单上传检测后,没有限定后缀名,绕过的方法很多,使用白名单验证会相对比较安全,因为只允许指定的文件后缀名。但是如果有可控的参数目录,也存在被绕过的风险。
保存文件时处理文件名的函数会从左往右检测,在遇到%00字符认为这是终止符,从而丢弃之后的字符。但是白名单检测时会从右往左检测,如果后面的字符符合后缀白名单要求时,就会通过检测。
第十二关
先通过白名单检测,之后从 GET 参数获取的保存路径(通过 $_GET['save_path']),
和文件后缀构成新的文件名。如果我们此时修改get请求的值,添加1.php%00
它虽然依然能后和文件后缀构成文件名,但由于遇到%00后服务器会以为已经结束,从而丢弃掉后缀名。
由于这要求php版本在5.3.4以下,因此我的靶场显示上传错误!
第十二关
这一关和上一关的区别就是本关是通过post传参保存文件的保存路径。由于post传参不会像get传参那样对%00进行url解码,因此需要手动对%00解码
在php添加一个空格,然后选中空格在右侧选中栏中将16进制数修改为00相当于'/0'。之后用蚁剑连接即可。
文件头检测绕过
原理
所有的文件都是以二进制的形式进行存储的,在每一个文件(包括图片,视频或其他的非ASCII文件)的开头(十六进制表示)都有一片区域来显示这个文件的实际用法,这就是文件头标志,服务器对白名单进行文件头检测,符合,则允许上传,反之不允许。
主要分为三个方面:前两字节绕过,getimagesize绕过和exif_imagetype绕过。
常见文件头类型
第十四关(前两字节绕过)
关键函数fread,作用如下:
由于服务器只会检测上传文件二进制的前两个字节,所以我们可以通过修改这部分数据实现绕过。
白名单中只有jpg,png,gif这三种文件类型,这里我选择用png类型实现绕过:
先新建一个png图片,用记事本打开,并写入一句话木马
注意前面有两个空格,方便用010修改前两字节
上传该图片,而提示需要使用文件包含漏洞才能运行恶意代码
使用include包含:include.php?file=upload/文件名
成功连接
第十五关
源代码中包含了getimagesize函数
通过终端用一个正常图片和一个一句话木马生成图片马绕过检测
然后步骤和第十四关相同。
第十六关
源码使用exif_imagetype()检查文件类型是否合法
这关和第15关没有什么不同,做法是一样,但这关使用exif_imagetype()检查是否为图片文件,所以我们需要开启开启php_exif扩展,之后同第十五关
二次渲染绕过
原理
在我们上传文件后,网站会对图片进行二次处理(格式、尺寸要求等),服务器会把里面的内容进行替换更新。
处理完成后,根据原有的图片对比,找到没被修改的部分,然后利用这一部分,生成一个新的图片并放到网站对应的标签进行显示。
第十七关
源码对图片进行二次渲染
经过二次渲染,图片马中的一句话木马被删除。这是就需要在渲染前后相同部分添加一句话木马。
由于png图片渲染前后相同部分很少,一句话木马经过渲染会被删除,因此选择用gif图片插入
这时有两种方法,第一种是将渲染前后对比,在渲染前两者的相同部分插入一句话木马。
另外一种则是直接在渲染后的图片中插入一句话木马。
这里用第一种方法
保存后再次上传该图片,然后下载上传后的图片,用010打开,发现经过渲染后一句话木马仍然存在
之后利用文件包含漏洞用蚁剑连接即可
条件竞争绕过
原理
文件先上传到服务器上,然后再判断是否符合白名单,虽然非法文件在服务器中的时间很短,但仍然可以访问,可是一句话木马需要一直连接服务器才能进行操作,因此可以利用这短暂的时间执行非法文件的一句程序语句, 我们这个时候就可以使用条件竞争的方式,通过bp发送大量的上传和文件访问请求。
第十八关
先新建一个php文件并写入
上传文件到服务器,用bp抓包,发送数据包到intruder模板
上传请求:
clear清除payload
无限空发请求
将齐发线程数调大,之后是访问请求,和上传步骤相同,不过需要访问生成的文件地址,在本题中为http://127.0.0.1/upload-labs/Pass-18/index.php/shell.php
接下来开始攻击,分别点击上传请求的开始攻击按钮和文件访问的按钮。因为需要大量的请求,所以时间可能要长一点。
最后发现我们的目录下有shell.php
最后用蚁剑连接即可
Apache解析漏洞
原理
Apache解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断。比如test.php.a.b的".a"和".b"这两种后缀是apache不可识别解析,apache就会把test.php.a.b解析成test.php。
第十九关
代码审计
这里定义了一个类,包含了一些白名单后缀。
这里是先上传文件,然后重命名文件,所以存在条件竞争。
这里对上传后的文件进行重命名。
先复制php木马,不过要利用apache解析漏洞,在后缀后可以添加.7z(只要apache不能解析就行)
与第十八关类似,通过bp发送大量的上传和文件访问请求。
上传请求完全相同,但是文件访问请求不大相同,通过查看服务器文件可知,上传文件并没有保存在upload目录下,而是保存在了upload-labs目录下。
文件访问url http://127.0.0.1/upload-labs/upload1733053426.7z
其他方式与第18关相同。