文件上传漏洞&靶场通关详解

文件上传漏洞&靶场通关详解

什么是文件上传漏洞?

大部分网站都拥有上传文件的部分,文件上传漏洞是由于网站开发者对用户上传文件的过滤不够严格,攻击者可以通过这些漏洞上传可执行文件(如木马,恶意脚本和WebShell等等),从而达到随意控制网站的目的。
img

文件上传漏洞有哪些危害?

攻击者可以通过这些漏洞上传可执行文件(如php),使服务器被控制,从而使攻击者能够植入后门程序,窃取敏感信息,侵犯用户隐私,上传恶意软件,造成数据篡改和损坏等等。

文件上传的过程?

用户发送的文件被服务器接收——>经过网站检测——>产生临时文件——>移动到指定路径
img

什么是WebShell?

WebShell是攻击者成功入侵网站后留下的后门程序,通常由asp,jsp和php编写。攻击者能够随时通过WebShell进入网站后端,随意查看和控制网站内容。
WebShell的分类如下:
img

文件上传漏洞的方法

img
接下来就围绕以上类型进行介绍:

前端检测

JS判断

直接查看:在浏览器中右键点击页面,选择 “查看源代码” 或 “检查”,打开开发者工具并切换到 “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
img
2.浏览器搜索url:about:config,搜索JavaScript,双击关闭

img

第一关

新建php文件,写入一句话木马
img
禁用JS后上传一句话木马,之后直接用蚁剑连接即可
img

还有另外一种方法第三关提到

后端检测

Content-Type检测

原理

后端通过检查HTTP请求头中的Content-Type字段来确定上传文件的类型。服务器是通过ent-type判断类型,content-type在客户端可被修改,因此可以绕过。

第二关

根据以下代码可知检测Content-Type确定文件类型
img
则可以上传php一句话木马,用bp抓包,修改Content-Type为代码中任意一种,即可绕过
img

也可以直接上传图片马,修改后缀为php,第三关会详细介绍

黑名单绕过

黑名单

文件上传黑名单‌是指在文件上传过程中,服务器明确禁止上传的文件类型列表。

第三关

img
分析源码可知后端将检测文件后缀类型,以上四种文件后缀不被服务器所接受,这时就可以通过上传可支持文件,之后抓包修改后缀实现绕过,如(phtml,php3,php5等等).
这里我们尝试phtml
先上传php木马,bp抓包改后缀
img
蚁剑连接失败
img
检查配置文件
img
img
发现phtml被注释,打开这串代码,重启phpstudy,再次尝试,成功连接蚁剑
img

.htaccess绕过

htaccess定义及作用

.htaccess文件(或者分布式配置文件),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。
通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。

绕过方法

因为.htaccess文件拥有改变文件后缀的作用,因此当改文件未被禁止时,我们就可以通过上传该类文件实现改变随后上传文件后缀的目的,从而绕过黑名单。

第四关

img
检查源码,发现是检测后缀是否在黑名单之中,黑名单中没有.htaccess,则可以利用该漏洞入侵服务器。
先新建.htaccess文件,写入如下内容img
作用是让png,txt文件也可以执行php文件功能,也可以删除这串代码中的最后.png .txt,表示将随后上传的所有文件当作php文件处理。
先上传该文件,再上传黑名单之外的一句话木马文件(如图片马).
img
哦吼,连接失败,查询资料才知道启用.htaccess,需要修改httpd.conf,启用AllowOverride和rewrite,将none改成all即可,rewrite模块默认开启。
img
再次尝试,成功连接蚁剑

.user.ini绕过

原理

.user.ini在PHP_INI_USER的配置项之中,官方解释如下
img
.user.ini实际上就是一个可以由用户“自定义”的php.ini,它用于覆盖或追加全局配置文件(如.php.ini)中的PHP配置选项,可以覆盖php.ini文件。

绕过

我们可以通过先上传.user.ini文件,内容如下(其中1.png为随后上传的文件名)
img
再上传一个图片马,包含起来进行getshell。不过前提是含有.user.ini的文件夹下需要有正常的php文件,从而导致服务器对图片文件的错误处理而导致的文件执行。

第五关

黑名单中没有.ini后缀,先上传.user.ini文件,再上传1.png
根据提示img
尝试访问readme.php
img
成功!
蚁剑连接即可img

大小写绕过

原理

有些网站没有严格过滤大小写,这时就可以利用大小写混合来绕过检测。

第六关

img
网页源代码没有过滤大小写,这时就可以利用大小写绕过检测。
先上传php木马文件,然后用bp抓包,修改后缀为大小写混合,用蚁剑连接即可
img
img

空格绕过

如果网站没有过滤空格时,就可以通过在检测数据后添加空格实现绕过

第七关

检测源代码,发现函数trim,其解释如下img
由于本题是通过判断后缀检测文件是否能够上传,则在后缀后添加空格即可,步骤和第六关类似
img
蚁剑连接成功
img

点绕过

和空格绕过类似,这里不再详述。

第八关

img

NTFS交换数据流绕过

原理

window中,文件名+"::\(DATA"会把::\)DATA之后的数据当成文件流处理,不会检测后缀名,且保持"::$DATA"之前的文件名,不会检查后缀名。

第九关

img
源代码中没有过滤::$DATA,和前几关步骤类似,bp抓包,改后缀,蚁剑连接
img

不过蚁剑连接时需要删除::$DATA
img

点空点绕过(. .)

原理

deldot()函数从后向前检测,当检测到末尾的第一个点时会继续它的检测,但是遇到空格会停下来,从而绕过检测。

第十关

img
当从右往左检测文件名时,会删除最后的 '.'和' '然后停止,之后得到文件名'X.php.',和之后点绕过相同。
img
img

双写后缀绕过

原理

在上传模块,有的代码会把黑名单的后缀名替换成空,例如a.php 会把php 替换成空,但是可以使用双写绕过例如 asaspp,pphphp,即可绕过上传。

第十关

img
其中str_ireplace函数会从左往右检测文件后缀是否在黑名单之中,若在的话,就会将其删除。
如果我们将文件后缀变成pphphp时,他只会检测到中间的php并删除,然而剩余字符依然构成php后缀,就能够实现绕过。
步骤依然一样,不再啰嗦。
img

%00截断绕过

原理

如果黑名单上传检测后,没有限定后缀名,绕过的方法很多,使用白名单验证会相对比较安全,因为只允许指定的文件后缀名。但是如果有可控的参数目录,也存在被绕过的风险。
保存文件时处理文件名的函数会从左往右检测,在遇到%00字符认为这是终止符,从而丢弃之后的字符。但是白名单检测时会从右往左检测,如果后面的字符符合后缀白名单要求时,就会通过检测。

第十二关

img
先通过白名单检测,之后从 GET 参数获取的保存路径(通过 $_GET['save_path']),
和文件后缀构成新的文件名。如果我们此时修改get请求的值,添加1.php%00
img
它虽然依然能后和文件后缀构成文件名,但由于遇到%00后服务器会以为已经结束,从而丢弃掉后缀名。
由于这要求php版本在5.3.4以下,因此我的靶场显示上传错误!

第十二关

img
这一关和上一关的区别就是本关是通过post传参保存文件的保存路径。由于post传参不会像get传参那样img对%00进行url解码,因此需要手动对%00解码

img
在php添加一个空格,然后选中空格在右侧选中栏中将16进制数修改为00相当于‘/0’。之后用蚁剑连接即可。

文件头检测绕过

原理

所有的文件都是以二进制的形式进行存储的,在每一个文件(包括图片,视频或其他的非ASCII文件)的开头(十六进制表示)都有一片区域来显示这个文件的实际用法,这就是文件头标志,服务器对白名单进行文件头检测,符合,则允许上传,反之不允许。
主要分为三个方面:前两字节绕过,getimagesize绕过和exif_imagetype绕过。

常见文件头类型

img

第十四关(前两字节绕过)

img
关键函数fread,作用如下:
img
由于服务器只会检测上传文件二进制的前两个字节,所以我们可以通过修改这部分数据实现绕过。
白名单中只有jpg,png,gif这三种文件类型,这里我选择用png类型实现绕过:
先新建一个png图片,用记事本打开,并写入一句话木马
img
注意前面有两个空格,方便用010修改前两字节
img
上传该图片,而提示需要使用文件包含漏洞才能运行恶意代码
img
使用include包含:include.php?file=upload/文件名
img
成功连接

第十五关

img
源代码中包含了getimagesize函数
img
通过终端用一个正常图片和一个一句话木马生成图片马绕过检测
img
然后步骤和第十四关相同。

第十六关

img
源码使用exif_imagetype()检查文件类型是否合法
img
这关和第15关没有什么不同,做法是一样,但这关使用exif_imagetype()检查是否为图片文件,所以我们需要开启开启php_exif扩展,之后同第十五关
img

二次渲染绕过

原理

在我们上传文件后,网站会对图片进行二次处理(格式、尺寸要求等),服务器会把里面的内容进行替换更新。
处理完成后,根据原有的图片对比,找到没被修改的部分,然后利用这一部分,生成一个新的图片并放到网站对应的标签进行显示。

第十七关

img
img
源码对图片进行二次渲染
img
经过二次渲染,图片马中的一句话木马被删除。这是就需要在渲染前后相同部分添加一句话木马。
img
由于png图片渲染前后相同部分很少,一句话木马经过渲染会被删除,因此选择用gif图片插入
这时有两种方法,第一种是将渲染前后对比,在渲染前两者的相同部分插入一句话木马。
另外一种则是直接在渲染后的图片中插入一句话木马。
这里用第一种方法
img
保存后再次上传该图片,然后下载上传后的图片,用010打开,发现经过渲染后一句话木马仍然存在
img
之后利用文件包含漏洞用蚁剑连接即可
img

条件竞争绕过

原理

img
文件先上传到服务器上,然后再判断是否符合白名单,虽然非法文件在服务器中的时间很短,但仍然可以访问,可是一句话木马需要一直连接服务器才能进行操作,因此可以利用这短暂的时间执行非法文件的一句程序语句, 我们这个时候就可以使用条件竞争的方式,通过bp发送大量的上传和文件访问请求。

第十八关

img
先新建一个php文件并写入
img
上传文件到服务器,用bp抓包,发送数据包到intruder模板
上传请求:
img
clear清除payload
img
无限空发请求
img
将齐发线程数调大,之后是访问请求,和上传步骤相同,不过需要访问生成的文件地址,在本题中为http://127.0.0.1/upload-labs/Pass-18/index.php/shell.php
接下来开始攻击,分别点击上传请求的开始攻击按钮和文件访问的按钮。因为需要大量的请求,所以时间可能要长一点。
最后发现我们的目录下有shell.php
img
最后用蚁剑连接即可img

Apache解析漏洞

原理

Apache解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断。比如test.php.a.b的“.a”和“.b”这两种后缀是apache不可识别解析,apache就会把test.php.a.b解析成test.php。

第十九关

代码审计
img
这里定义了一个类,包含了一些白名单后缀。
img
这里是先上传文件,然后重命名文件,所以存在条件竞争。
img
这里对上传后的文件进行重命名。
先复制php木马,不过要利用apache解析漏洞,在后缀后可以添加.7z(只要apache不能解析就行)
img
与第十八关类似,通过bp发送大量的上传和文件访问请求。
上传请求完全相同,但是文件访问请求不大相同,通过查看服务器文件可知,上传文件并没有保存在upload目录下,而是保存在了upload-labs目录下。
文件访问url http://127.0.0.1/upload-labs/upload1733053426.7z
其他方式与第18关相同。

posted @ 2024-12-01 20:22  hackerT  阅读(192)  评论(0编辑  收藏  举报