文件上传及解析漏洞

发布于 2022-03-16  390 次阅读


条件:

  • 有上传点(可能有存在上传代码,函数。。。)
  • 上传文件可以被解析
  • 上传文件可以被访问

可能存在的地方

  • 可以上传文件的任意地方
  • 上传头像
  • 上传附件
  • 上传资料

解析漏洞

IIS6.0 => web容器 [windows server 2003自带]

IIS => windows server(asp aspx)

IIS => asp apsx

apache => php jsp

nginx => php xxx

IIS6.0 中,.asa .cer cdx 会当作asp处理(特性),这是因为IIS6.0在应用程序扩展中默认设置了.asa .cer .cdx 都会调用 asp.dll

aspx兼容asp

asp一句话:``

区别

解析漏洞:让文件当作php来执行

文件上传:通过一些方法将文件上传

防御

  • 客户端检测:浏览器(JS检测)==》没有检测,可以绕过
  • 服务端检测:目标主机(后端代码检测)

检测分为两种:

  • 黑名单:不允许xxx
  • 白名单:只允许xxx 最常见 .jpg .png .gif

靶场实操

Pass-01(前端验证)

方法一:

通过抓包,将相应的数据包进行修改,删除JS部分,然后就可以绕过JS,无限制上传一句话

抓包

image-20220305190412984

将请求发出

image-20220305190446663

拦截到相应的数据包

image-20220305190545868

删除该部分,即可无限制上传

image-20220305190643858
image-20220305193401239

菜刀连接获得webshell

方法二:

将一句话木马后缀修改为图片格式

image-20220305194520844

绕过前端验证后抓包,修改文件后缀名即可上传

第一关的防御方式:后缀检测

Pass-02(Content-Type方式绕过)

与第一关第一种方法一样,上传jpg文件,然后修改后缀名即可

Content-Type是文件类型

pass-03(黑名单绕过)

PHP中上传文件的函数move_uploaded_file

绕过方法:

.php =>phtml php3 php4 php5

.jsp => jspx jspf

.asp => asa cer aspx

.exe =>exee

image-20220305201011608

pass-04(.htaccess文件绕过)

.htaccess => 分布式配置文件 是apache中特有的

.htaccess 并不是默认开启的。

.htaccess 全称是Hypertext Access(超文本入口).htaccess 文件也被称为分布式配置文件,提供了针对目录改变配置的方法,在一个特定的文档目录中放置一个包含一个或多个指令的文件,以作用于此目录及其所有子目录。

.htaccess 的功能:

文件夹密码保护、用户自定义重定向、自定义404页面,拓展名伪静态化、禁止特定IP的用户、只允许特定的IP的用户、禁止目录列表

AddType application/x-httpd-php .jpg    # 这个指令代表.jpg文件会被当作php来解析

先上传.htaccess 文件,然后上传1.jpg文件,就会使得jpg当作php解析image-20220305203454009

pass-05(后缀大小写)

将后缀名大小写混写就可以绕过

pass-06(文件后缀(空)绕过)

.php.php空格 是不同的后缀

因为windows会自动去后缀末尾的空格,所以上传.php空格 文件就可以绕过后端的后缀验证

抓包修改后缀

image-20220305204522526
image-20220305204722964

pass-07(文件后缀(点)绕过)

因为windows会自动去后缀末尾的点,所以上传.php. 文件就可以绕过后端的后缀验证

image-20220305204949545

pass-08(::$DATA(Windows文件流绕过))

windows文件流(NTFS格式)

可以寄生文件

image-20220306094913813

这条命令执行后生成了123.txt 但是文件大小却为0k,是空文件,那123被写到哪里了?

image-20220306095102142

dir也招不到

dir /r 可以找到隐藏的文件

image-20220306095321823

对于windows而言,文件名后+::$DATA windows会把::$DATA 之后的数据当作文件流处理,不会检测后缀名

image-20220306100631905

成功将123写入1.txt

image-20220306100909522
image-20220306100931347

上传成功!

pass-09(构造文件后缀绕过)

本关可以利用源码中的规则对后缀名进行改变,

image-20220306093721362

根据代码,可以将后缀名更为成.php. .

上传成功

image-20220306093509845

这种方法需要知道源码的前提下进行分析

  1. github gitee 找源码
  2. CMS魔改
  3. 源码泄露 www.zip
  4. 官方提供
  5. 了解公司的开发风格
  6. 建模、强测

pass-10(双写文件后缀绕过)

源码中有这样一行代码

 $file_name = str_ireplace($deny_ext,"", $file_name);

str_ireplace() 该函数可以替换字符串中的一些字符,不区分大小写

str_replace() 功能一样,区分大小写

更改后缀名为.pphphp

image-20220306094431085
image-20220306094512787

上传成功!

pass-11(%00截断绕过)

麦克风: over 计算机中是00 源于电报

php缓存文件(Temp)->移动文件并重命名

%00 是URL编码00

move_uploaded_file($temp_file,$img_path)将文件移动到新的地方$temp_file 移动的文件$img_path 要移动文件的位置$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;rand是随机数date("YmdHis")获取当前时间转换成数字
image-20220306114435700
image-20220306113721983

pass-12(00截断(POST传参))

因为POST传参并不会进行URL编码,所以只需要00截断即可

这里需要用16进制的编辑器修改为00,手动敲的0对应的是30

image-20220306132146677
image-20220306131706719

pass-13(图片马绕过)

图片马:图片+马

制作命令:copy 1.png/b + 1.php/a 2.png

  • /b是二进制形式打开
  • /a是ascii方式打开

2.png 是生成的图片马

image-20220306140112272

图片马只能够保证可以上传,并不可以解析

解析漏洞(中间件的问题)、文件包含

CGI解析漏洞:任何后缀后加上/.php 都会当作php文件来解析

image-20220306150027818

pass-14(getimagesize图片类型绕过)

与13同种绕过方式

pass-15(php_exif模块图片类型绕过)

直接上传图片马

pass-16(二次渲染)

绕过方法:gif动图格式可以绕过

制作gif图片马,采用十六进制编辑器写入

image-20220306153612894

pass-17(条件竞争)

条件竞争:

上传文件的流程:

    - 先检测:检测合格再上传    - 先上传:先上传后检测,不合格删除

检测是需要时间的

在检测的空挡时间,如果可以访问到php代码,就可以被执行

马生马:生成在与该文件目录一致

')>

本关在本地测试

image-20220306164221810

先随便上传了一个图片,查看一下路径

image-20220306164558297

然后跑数据包,一个是上传555.php的包,另一个是访问555.php的包;当访问了555.php,就会执行里面的写马的代码,于是生成了666.php

image-20220306170955434
image-20220306171215923

pass-18(条件竞争(二))

方法相似,进行一下绕过

pass-19(move_uploaded_file()截断)

依然可以00截断

image-20220306154623251
image-20220306154654566

这里直接访问php文件就行

image-20220306154736730

pass-20(IIS6.0解析漏洞(一))

本关,上传asp一句话,抓包,修改后缀名为.cer 就可以绕过。

image-20220306190515589
image-20220306190833574

上传成功

image-20220306191346777

菜刀连接得到shell

pass-21(IIS6.0解析漏洞(二))

1.asp;.jpg

1.asp/2.txt 1.asp是文件夹 2.txt是一句话 会将2.txt当作.asp 文件来执行

都会当作asp进行解析

本关采用; 对后缀名进行截断

上传

image-20220306195438513
image-20220306195455432

pass-22(IIS6.0解析漏洞(三))

1.asp/2.txt 1.asp是文件夹 2.txt是一句话 会将2.txt当作.asp 文件来执行

需要配合:后台使用,你有建立文件夹的权限

pass-23(CGI解析漏洞)

常见组合:Nginx + PHP

Nginx默认是以CGI的方式来支持PHP解析的,普遍的做法是在Nginx配置文件中通过正则匹配设SCRIPT_FILENAME

当访问www.xx.com/phpinfo.jpg/1.php这个URL时,$fastcgi_script_name会被设置“phpinfo.jpg/1.php”,然后构造成SCRIPT_FILENAME(绝对路径)传递给PHP CGI,如果开启了cgi.fix_pathinfo=1选项(这个默认值就是1,所以没有设置过就是开启),那么就会触发在PHP中的如下逻辑:
PHP会认为SCRIPT_FILENAME(绝对路径)是phpinfo.jpg,而1.php是PATH_INFO,所以就会phpinfo.jpg作为PHP文件来解析了.

也是一个逻辑问题,所以说我们只需要在正常的.jpg后面加/.php就可以成功的绕过解析

访问文件:1.jpg

解析根据:/.php

image-20220306212436690

直接上传1.gif文件

image-20220306212709794
image-20220306212752911