目录
2.3 大小写绕过(直接修改后缀名为PhP、phP等进行绕过)
2.6 ::$DATA绕过(uploads-labs pass9)
一、什么是文件上传漏洞
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直接和有效的,“文件上传” 本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。
二、漏洞原理
文件上传漏洞是指用户上传了一个可执行的脚本文件(php、jsp、xml、cer等文件),而WEB系统没有进行检测或逻辑做的不够安全。文件上传功能本身没有问题,问题在于上传后如何处理及解释文件。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。
三、造成漏洞的原因
1.服务器配置不当
2.开源编辑器上传漏洞
3.本地文件上传限制被绕过
4.过滤不严格被绕过
5.文件解析漏洞导致文件执行
6.文件路径截断
四、文件上传的分类
1.常规类
常规类呢,第一种就是扫描,通过扫描网站的敏感文件,来获取到上传地址,第二种在一些网站的会员中心,这些地方可能有上传功能,这个上传功能就是一个上传点,第三种各种途径后台里面获取到上传,各种途径只要是文件上传漏洞都行。
2.cms类
我们要知道这个网站是用什么程序源码搭建的(ckeditor,fckeditor,kindeditor,xxxxeditor)
3.编译器类
就观察对方网站也没有使用编译器,如果有就直接找那个编译器的漏洞。
4.其他类/cve类
第三方平台或者相关应用产生的漏洞。直接在网上找网上公开的漏洞。
五、文件上传漏洞的绕过方式
1.前端---JS类防护
例题(ctfhub)
1.根据源代码的提示,上传一个jpg文件,发现上传成功
2.抓包,修改文件后缀名,然后放包
3.使用蚁剑链接,链接成功
4.在www目录下,找到flag
2.黑名单----后端绕过
2.1 特殊解析后缀(利用难度高)
特殊解析后缀绕过是由于黑名单过滤规则不严谨,在某些特定的情况下的后缀也能够被当作php文件进行解析,例如PHP2、php3、php4、phtml、pht等情况。
可以使用phtml、php3、php4、php5,当然前提是apache服务器,同时在配置文件夹中需要有将AddType application/x-httpd-php .php .phtml .phps .php1 .php4 .pht 这样的一段话前面的注释删除,重启phpstudy让其生效。
等价后缀名:
asp:asa、cdx、cer
php:php3、php4、php5、phtml
aspx:ashx、ascx、asmx
jsp:jspx、jspf
exe:exee
2.2 .htaccess解析(ctfhub)
例题1
1.根据题目,于是新建文档,输入AddType application/x-httpd-php .txt //将.txt文件当作php文件解析或者SetHandler application/x-httpd-php //所有的文件当做php文件来解析(注意.htaccess不要有前缀名)
2.上传.htaccess,上传 成功
3.再上传有一句话木马的txt文件,发现上传成功
4.用蚁剑链接,连接成功
5.找到flag
例题2([MRCTF2020]你传你🐎呢1)
1.先抓包,发现修改文件头和文件类型没有用,考虑到可能与user.ini或.htaccess文件有关
2.新建一个.htaccess文件,在里面输入AddType application/x-httpd-php jpg,将所有的jpg(经过尝试,只能上传jpg或者png文件等)都解析为php文件
注意:在上传.htaccess文件时,要抓包修改Content-Type
3.上传.htaccess文件之后,再上传一个有一句话木马的jpg文件,上传成功,再用蚁剑连接
2.3 大小写绕过(直接修改后缀名为PhP、phP等进行绕过)
后缀大小写是通过服务端未将后缀进行统一的格式转换,导致可以上传PHP的文件,同时由于Windows系统对后缀大小写并不敏感,所以当在写PHP的改成Php就会被当作PHP进行解析。
2.4 点绕过(uoloads-labs pass5)
点绕过其实就是利用了Windows对文件和文件名的限制,当将点放在结尾的时候,就会触发操作系统的命名规范问题,所以在生成文件的时候,添加在结尾的点就会被去除。
2.5 空格绕过(uploads-labs pass7)
2.6 ::$DATA绕过(uploads-labs pass9)
在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,他的目的就是不检查后缀名
2.7 配合解析漏洞
配合解析漏洞就是利用文件上传漏洞和相关的解析漏洞进行结合完成攻击,比如配合iis、nginx、apache、tomcat的解析漏洞得到上传漏洞的实现。具体的看下面提到各种相关的解析漏洞。
2.8 双写缀名绕过(ctfhub)
服务端可能存在将后缀替换为空的情况,但是这就存在一种可能就是在编辑过滤的时候只过滤了一次,所以就出现了可以通过双写就绕过的可能。(若上传的文件后缀在禁止的列中,那么就将后缀替换为空,而这里又是只过滤一次,那么就可以通过双写进行绕过)
1.上传文件,发现满足双写绕过的条件
2.使用bp抓包,将文件后缀名双写进行绕过
3.用蚁剑连接,连接成功
4.找到flag
3.白名单
白名单就是服务端明确可以上传的格式后缀,例如:jpg、png、jpeg等。
3.1 MIME绕过(ctfhub)
服务端MIME类型检测是通过检查http中包含的Content-Type字段中的值来判断上传文件是否合法的。
利用Burp抓包,将报文中的Content-Type改成允许的类型
Content-Type: image/gif(gif图像)
Content-Type: image/jpg(jpg图像)
Content-Type: image/png(png图像)
1.使用bp转包,并修改Content-Type
2.使用蚁剑连接
3.2 %00截断(ctfhub)
%00不是代表空格,而是null,一个空字符,当程序执行到%00后,那么后面的数据就会停止,意思就是误当作结束符,把后面的数据直接忽略了,这就会导致漏洞产生。
在文件上传后,利用%00截断,在文件扩展名验证的时候,就会取文件的扩展名进行验证,但是在最后保存在本地的时候,%00就会截断文件名,只保存%00之前的内容。
1.根据源码可知可以上传的文件类型,上传一个jpg,发现上传成功
2.使用抓包,用%00将后面的内容截断
3.使用蚁剑连接
3.3 0×00截断(看上题)
3.4 0×0a截断(看上题)
4.文件头检测
图片的格式在防护中通常是不会使用后缀进行判断的依据,文件头是文件开头的一段二进制码,不同类型的图片也就会有不同的二进制头。
JPEG (jpg),文件头:FF D8 FF E1
PNG (png),文件头:89 50 4E 47
GIF (gif),文件头:47 49 46 38
1.经过尝试,上传一个png文件
2.在图片的编码后面加上一句话木马
3.修改文件后缀名,改为php文件
4.php文件上传成功
5.用蚁剑连接
5.二次渲染
二次渲染就是在我们上传的图片后,网站会对图片进行二次处理,比如对图片的尺寸、格式、以及网站对图片进行定义的一些要求等进行处理,并且服务器会对里面的内容进行二次替换更新,在处理完后,会生成一个合规的图片在网站上显示出来。当我们上传一张 .jpg/.png/.gif 后缀的图片时,网页上显示的并不是我们原先上传的图片,而是经过后台加工过的图片,这张图片会修改原图的某些部分,当然我们的肉眼是看不出来的,通过修改原图,将原图中插有的恶意代码进行覆盖,这就是图片二次渲染。
1.只允许上传 JPG PNG gif 在源码中使用 imagecreatefromgif 函数对图片进行二次生成。生成的图片保存在,upload目录下
2.接着对比两者之间有什么相同点
3.跟着再找找相同处,覆盖字符串,填写一句话木马或者恶意指令
4.将修改好的图片再次上传
文件上传漏洞的修复
- 设置白名单:在文件上传过程中,对文件类型进行白名单校验,即只允许上传指定的文件类型。
- 文件命名策略:在保存上传文件时,应该采用随机生成的文件名,并结合文件名前缀、日期等信息来唯一标识上传文件。这样可以防止黑客通过反猜测文件名来直接访问上传文件。
- 限制文件大小:为了防止恶意用户上传过大的文件导致服务器资源耗尽,应该限制文件的大小。
- 检查文件内容:除了校验文件扩展名之外,还应该对文件内容进行检查。可以利用PHP的内置函数对图片文件进行解析和校验,确保上传的文件是有效的图片。
- 文件权限控制:在保存上传文件时,要确保文件的执行权限不被设置为可执行。可以通过设置文件的权限为只读或屏蔽执行权限来防止黑客执行恶意代码。