WEB漏洞-文件上传之后端黑白名单绕过

WEB漏洞-文件上传.png

文件上传常见验证

后缀名(直接)

  • 黑名单,白名单,明确不允许上传的格式后缀asp,php,jsp,aspx,cgi,war,如果php,php5,phtml没有定义到后名单里,可以用这格式绕过限制,依旧可以达到效果

类型(间接)

  • 明确可以上传的格式后缀jpg,png,zip,rar,gif要白名单验证要更安全

文件头等

  • MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式
  • Content-Type称之为MIME信息

image.png

  • 使用正常照片上传,抓包

image (1).png

  • 上传0.jsp文件,抓包

image (3).png

  • 伪造正常上传的content-type

image (4).png

  • 文件头:内容头信息

image (5).png

image (7).png

upload-labs演示案例

Pass-1(前端验证后缀)

采用了前端验证,只验证了文件后缀,图片木马上传后,使用burp修改后缀来绕过前端验证,也可以通过删除js验证的代码来绕过

  • 点击上传后,把gif后缀修改为php

QQ截图20220110094912.jpg

  • 找到地址并打开

QQ截图20220110095207.jpg

QQ截图20220110095245.jpg

Pass-2(验证MIME信息)

给出的提示是根据报文中的MIME信息进行验证,可以使用burp修改MIME信息来绕过

QQ截图20220110095614.jpg

QQ截图20220110095747.jpg

QQ截图20220110095801.jpg

Pass-3(特殊解析后缀)

不允许上传指定的后缀文件,可以通过搜索黑名单的漏洞进行绕过,比如php脚本可以尝试php5,phtml

QQ截图20220110100547.jpg

成功上传,由于我是nginx的配置,题目原意是绕过apache的配置所以nginx无法执行这个脚本

QQ截图20220110100605.jpg

Pass-4(.htaccess)

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

定义.htaccess文件并上传

QQ截图20220110101312.jpg

QQ截图20220110101347.jpg

上传一个特定文件名的文件blog.jpg,由于我是nginx的配置,题目原意是绕过apache的配置所以nginx无法执行这个脚本

QQ截图20220110101450.jpg

Pass-5(.user.ini)

提示中,告诉我们有一个readme.php文件

QQ截图20220110103351.jpg

可以上传.user.ini文件,来设定规则让php.ini获取到,上传的图片木马,然后在执行readme.php文件时包含该木马

;.user.ini
;所有的php文件都自动包含1.gif文件。.user.ini相当于一个用户自定义的php.ini。
auto_prepend_file=1.gif

QQ截图20220110103646.jpg

分别上传.user.ini1.gif

QQ截图20220110103811.jpg

QQ截图20220110103819.jpg

执行readme.php,就会包含1.gif的代码

QQ截图20220110103948.jpg

Pass-6(大小写绕过)

查看源码以后,发现没有对文件大小写进行过滤,将php文件后缀反复修改大小写进行尝试上传,直到成功

QQ截图20220110104614.jpg

由于测试环境搭建在liunx平台,严格区分大小写,所以无法访问,在windows下可以尝试

QQ截图20220110104649.jpg

Pass-7(空格绕过)

查看源码以后,发现没有对空格进行过滤,通过burp抓包后修改文件名加入空格,linux+nginx环境问题最后上传的文件名中包含了空格,无法解析

QQ截图20220110105212.jpg

Pass-8(点号绕过)

查看源码以后,发现没有对.进行过滤,通过burp抓包后修改文件名加入.,linux+nginx环境问题最后上传的文件名中包含了.,无法解析

QQ截图20220110110052.jpg

Pass-9(特殊字符::$DATA绕过)

查看源码以后,发现没有对::$DATA进行过滤,通过burp抓包后修改文件名加入::$DATA,linux+nginx环境问题最后上传的文件名中包含了::$DATA,无法解析

QQ截图20220110110559.jpg

Pass-10(文件名绕过)

查看源码后,发现其路径拼接的是$file_name而不是$file_ext,而$file_name只处理了文件名末尾的点,只需要指定文件名phpinfo.php. .绕过就可以,linux+nginx环境问题最后上传的文件名中包含了.,无法解析

QQ截图20220110111733.jpg

Pass-11(双写绕过)

根据提示会去除指定的后缀,查看源码后,只会去除1次,所以只要重叠写2次就能绕过该验证

QQ截图20220110133818.jpg

上传成功后尝试访问

QQ截图20220110133840.jpg

QQ截图20220110133849.jpg

Pass-12(0x00截断)

查看源码和提示,上传路径可控,并且是最终文件的存放位置是以拼接的方式,可以使用%00截断,但需要php版本<5.3.4,并且magic_quotes_gpc关闭。原理是:php的一些函数的底层是C语言,而move_uploaded_file就是其中之一,遇到0x00会截断,0x表示16进制,URL中%00解码成16进制就是0x00

QQ截图20220110134752.jpg

修改一句话的后缀名为.jpg后上传,抓包后修改URL,成功上传

QQ截图20220110134836.jpg

Pass-13(0x00截断)

修改后缀名为.jpg后上传,抓包后,修改路径处,增加1.php,然后选择Hex后,找到增加的1.php位置,将p后的0d修改为00后放包上传

QQ截图20220110135701.jpg

QQ截图20220110135848.jpg