文件上传漏洞-用骗子的角度分析

(一)文件上传漏洞

文件上传漏洞,发送在用户上传文件功能中,很多网址都对上传的文件格式进行限制,但是被攻击机者找到漏洞,把木马、病毒进行上传,然后控制服务器。对上传的文件格式不是不限制,而是限制了,攻击者还有办法用特别的方法绕过。

有个渗透测试大佬说:做我们这行的,思想要变态,行为要严谨。要用非同寻常的目光与思维去破解程序员设置的安全检测机制。

网站都是程序员开发出来,本次就以骗子的的角度,对程序员开发、设置的检测方法进行欺骗。

话不多说,今天就做一回骗子,欺骗欺骗哪些文件上传检测方法。知己知彼,做骗子也做个有格调的骗子,我们的先了解网站程序员都是怎么检测上传的文件格式的,再想办法骗骗。

以下面是常见一个文件上传检测方法,我们骗骗

(二)上传限制方法与欺骗方法

1、前端js

场景:这是用前端的js,实现上传检测。

使用js实现上传检测过程:

  1. 给上传文件的input元素绑定一个change事件
  2. 在change事件中获取到用户选择的文件
  3. 判断文件的类型、后缀、大小等属性,例如限制文件大小不能超过特定值,或者限制文件类型只能是某些特定类型(比如图片)
  4. 如果文件属性不符合要求,弹出提示框告知用户,同时清空input元素中所选文件
  5. 如果文件属性符合要求,上传文件或进行其他相关操作。

欺骗方法:

方法一:直接在浏览器禁用js
这是一个只能上传图片的一个靶场,我们按F12进入开发者模式,直接把绑定的方法删除(直接暴力删除,让你检测都没有,看你还这么检测),这样就直接绕过


效果如下:已经把文本文件上传成功。


2、方法二:burp 抓包,修改上传文件后缀
我们上传一个符合文件格式,在点击上传之后,使用burpsuite或者其他Http代理工具拦截并修改请求,将文件名后缀改回原来的格式如.txt(先用符合的png文件上传,骗骗前端的js,然后点击上传之后,我们在修改回来),然后再次发送请求。


结果也是上传成功的。
之所以用burp抓包,那是因为不同的环境和配置可能会导致上传文件的校验方式不同,因此一些简单的靶场可能允许你直接修改文件后缀名,而不需要使用Burp Suite等代理工具。

但是,在一些实际环境中,上传文件的校验可能会比较严格,尤其是在Web应用程序中使用了一些防护措施(例如WAF),直接修改文件后缀名可能会被拦截或导致上传失败。此时,使用代理工具进行修改会更加稳妥

扫描二维码关注公众号,回复: 15486752 查看本文章

2、文件名包含绕过

场景:使用MIME 校验进行文件检测

解释:

        MIME类型是指在互联网上定义的一种多用途文件类型,它是通过在HTTP标头中添加Content-Type字段来表示的。任何Web应用程序通常使用MIME类型对上传文件进行检测和校验。
        上传文件内容校验可以分为两个阶段。首先,在本地客户端进行第一步校验,检查上传文件的大小是否符合要求,然后将文件发送到服务器。其次,在服务器进行第二步校验,验证文件的大小、类型和内容是否符合预期。

        MIME类型检测就是服务器检测的一种,对于MIME校验,服务器通常根据文件的MIME类型来判断文件类型是否合法。如果上传的文件不包含或者包含了错误的MIME类型,服务器将拒绝上传文件并返回相关错误信息。常见的校验如下

text/plain(纯文本)
text/html(HTML文档)
text/javascript(js代码)
application/xhtml+xml(XHTML文档)
image/gif(GIF图像)
image/jpeg(JPEG图像)
image/png(PNG图像)
video/mpeg(MPEG动画)
application/octet-stream(二进制数据)
application/pdf(PDF文档)

简单来说就是,我们在点击上传的时候,会在请求信息的头部,加上一个Content-Type字段,用来识别文件类型,当数据传到服务器,服务器根据这个Content-Type字段的值来判断是否上传文件的类型符合。

欺骗方法:修改Content-Type的值

直接上传非法文件,然后使用burpsuite或者其他Http代理工具拦截并修改请求。可以看到原本上传的文件在Content-Type赋值为application/octet-stream,这是描述二进制数据或者未知的数据类型。于网络传输,由于存在各种未知的数据类型和不同的操作系统,因此在发送二进制数据时,许多服务器都使用application/octet-stream类型来表示未知文件类型或不确定文件类型
把Content-Type赋值为:image/jpeg,这是ipg图片格式,进行重发之后,

3、getimagesize检测

场景:在php网页中,利用getimagesize函数来检测文件上传

解释:

在PHP中,getimagesize()函数是用于获取图片信息的函数,包括图片的类型、宽度、高度和其它相关信息等,会返回一个数组,具体信息如下:

  • 图片宽度,像素为单位
  • 图片高度,像素为单位
  • 图片类型标识,表示图片类型的常量值,例如IMAGETYPE_GIFIMAGETYPE_JPEGIMAGETYPE_PNG
  • 图片类型描述,表示图片类型的可读字符串,例如"PNG"、"JPEG"等
  • 用于HTML标签中的图片宽度,以像素为单位
  • 用于HTML标签中的图片高度,以像素为单位
  • 其他图片信息(如果参数$imageinfo有提供)
     

 
这是服务器段检测,在一个只允许图片上传的网址中,通过getimagesize函数来获取,上传文件

欺骗方法:把文件和图片拼接到一块,在进行上传

利用copy把图片和文件拼接到一起(这种像欺骗方法像披着羊皮的狼,利用羊皮的外部特征进行欺骗),上传之后,因为里面有普通的的信息,利用getimagesize函数来获取时候,因为拼接到一起的内容里依旧还存在图片的信息,所有能够成功获取到信息,所有服务器会认为,上传的是一个图片。
方法:
在cmd中,进入文件的路径,输入:
copy 1.jpg /b + 1.php /a test.jpg

copy 1.jpg /b + 1.php /a test.jpg 命令的作用是将 1.jpg 和 1.php 文件合并成一个文件 test.jpg,并以二进制模式将两个文件内容拼接在一起。具体解释如下:

  • 1.jpg:是要在输出文件中作为因子一的文件。
  • /b:以二进制模式复制。
  • +:代表将1.jpg1.php的文本内容拼接在一起。
  • 1.php:是要在输出文件中作为因子二的文件。
  • /a:将 ASCII 文本内容附加到文件的末尾。
  • test.jpg:是合并后输出的文件,包含了1.jpg1.php两个文件的内容。因为文件扩展名是 .jpg,所以这个文件实际上不是一个真正的 JPEG 图像,而是一个合并的文件

 这个命令的作用是将两个文件合并成一个,并将它们的内容拼接在一起

结果如下,可以看到可以访问成功

 因为这是一个文件和图片拼接在一起,上传的时候,是以图片形式存在的,所有不能直接利用,需要通过其他漏洞信息,例如文件包含漏洞,访问我们刚刚上传的文件

4、黑名单绕过

场景:当文件上传到后台服务器中时,服务器会识别文件类型,与一个禁止上传的名单匹配,如果所上传的文件类型是该名单中,就禁止上传。这个名单就是黑名单,明确禁止不予上传的文件类型。其实在现实中,有许许多多的限制规则的,这里例举几项。

欺骗方法:

方法一:寻找漏网之鱼

有些网址只是.asp .aspx .php .jsp等文件类型,可以器其它找漏网之鱼绕过(你不让我过,我让我兄弟上,我不是一个人,我有一帮兄弟) 例如:特殊文件名绕过: .php3 .php4 .php5 .phtml .phtm .phps .phpt .php3(但是这里有个条件,对方服务器配置也要对这些php其他文件名配置了解析的设置,否则就算上传了成功了,也解析不了)

方法二:大小写绕过

有些一网址只是对文件大小写,没有限制,只是限制php文件,但是没有限制Php、pHp、PHP等等文件,我们就可以改变一些大写试试(这种欺骗方法就像:鲁迅喝酒,跟我周树人什么事),服务器如果没有大小写过滤,我们是可能上传成功的

方法三:利用上传.htaccess

        在一些网址中,它的黑名单已经有许许多多的例子,例如php3 .php4 .php5等也囊括在内,很是齐全,让我们无法从漏网之鱼下手。此时我们就要把对象转移一下(漏洞目标那么多,我们不能单盯着一处不放),我们尝试上传.htacess文件看看,有一些文件时没有禁止上传这个文件的。

        htaccess 文件是 Apache 服务器中的一个配置文件,它负责相关目录下的网页配置,是写一些规则方面的配置。通过 htaccess 文件,可以实现:网页 301 重定向、自定义 404 错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。

        在文件上传漏洞的利用中,我们可以通过htaccess文件,写入规则,把读取png图片转化为解析层php文件,也就是,我们虽然上传的是png等图片格式,但是通过htaccess之后,服务器会解析成php文件(这种欺骗方法,就像给服务器戴上”有色眼镜“,然后每当我上传图片,服务器都图片当作php文件处理,当我访问图片,服务器也那个图片当作php文件然后呈现回来)

具体做法如下:

新建.htaccess文件,内容为:
 

<FilesMatch ".png">
SetHandler application/x-httpd-php
</FilesMatch>

作用:把任何.png格式的文件,协议为php

 建立1.txt文件,立马存放探针(测试用),修改文件后缀为png,进行伪装,点击上传

结果上传成功,当我们访问1.png文件时候,能够触发探针文件

猜你喜欢

转载自blog.csdn.net/weixin_49349476/article/details/131225304