1.文件上传漏洞
1.1漏洞概述与成因
文件上传漏洞是发生在有上传功能的应用中,如果应用程序对用户上传的文件没有控制或者存在缺陷,攻击者可以利用应用上传功能存在的缺陷,上传木马、病毒等有危害的文件到服务器上面,控制服务器。
1.2漏洞危害
- 网站被挂马
- 网页被攻击者篡改
- 被安装后门
- 服务器被远程控制
1.3webshell
1.3.1webshell的介绍
webshell是通过服务器开放的端口获取服务器的某些权限。webshell又称脚本木马,
一般分为大马、小马、一句话木马,
1.3.2利用原理
利用文件上传漏洞,其他漏洞等,将木马上传到目标服务器后,也就是我们常常说的“后门”,此时就可以进行远程命令执行,文件管理等一系列恶意操作。
1.3.3不同木马的特点
1.大马:体积大、功能齐全、能够管理数据库、文件管理、对站点进行快速的信息收集,甚至能够提权。
2.小马:上传文件的时候,会被限制上传的文件大小或是被拦截的情况,那么可以通过小马来上传大马,实现更多的功能。
3.一句话木马:短小精悍、功能强大、隐蔽性好、使用客户端可以快速管理webshell。
1.3.4一句话木马
<?php @eval($ PosT[shell]);?>
<?php assert($ PosT[shell]);?>
<?php fputs(fopen("info.php","w"),"<?php phpinfo( )?>")?>
<eval request("shell")>
基本原理:利用文件上传漏洞,往目标网站中上传一句话木马,然后你就可以在本地通过中国菜刀或者蚁剑即可获取和控制整个网站目录。表示后面即使执行错误,也不报错。
分析:
<?php > 基本框架
@符号的意思是不报错,即使执行错误,也不报错。
密码为 x 原因:
php里面几个超全局变量:$_GET
、$_POST
就是其中之一。$_POST['a']
; 的意思就 是a这个变量,用post的方法接收。
eval的用处:
eval()把字符串作为PHP代码执行。
例如:eval("echo 'a'");其就等于直接 echo 'a';
再来看看<?php eval($_POST['pw']); ?>首先,用post方式接收变量pw,比如接收到了:pw=echo 'a';这时代码就变成<?php eval("echo 'a';"); ?>连起来意思就是:用post方法接收变量pw,把变量pw里面的字符串当做php代码来执行。也就是说,你想执行什么代码,就把什么代码放进变量pw里,用post传输给一句话木马。
上传成功后就可以通过 蚁剑或者菜刀连接
1.4常见webshell管理工具
- 蚁剑
- 哥斯拉
- 冰蝎
1.5文件上传思路
1.5.1常见漏洞位置
- 常规类:上传头像,后台系统上传,扫描获取上传,其他途径上传
- cms类:利用已知的cms漏洞进行文件上传。
- 编辑器类:ckeditor,fckeditor,kindeditor,xxxxedltor
1.5.2实战思路
在目标网站,先看中间件,是否存在解析漏洞,CMS中间件漏洞,编辑器漏洞。扫描存在上传文件的位置,然后进行验证和绕过。
2.文件上传漏洞利用
2.1前端限制的绕过方法
以upload-labs第一关为例
查看源码发现是前端JS校验 直接禁用 js
禁用后直接上传 木马文件
令 x=phpinfo() (用来显示php的一些信息)
2.2后端限制绕过方法
2.2.1抓包修改文件类型
第二关为后端检测 不能使用上一关的办法 需要用burp抓包 修改文件类型
Content-Type:也叫互联网媒体类型(Internet Media Type)或者 MIME 类型,
在 HTTP 协议消息头中,它用来表示具体请求中的媒体类型信息。
例如:text/html 代表 HTML 格式image/gif 代表 GIF 图片Image/png 代表 GIF 图片application/octet-stream 二进制流,不知道文件类型(PHP)application/json 代表 JSON 类型
抓包
修改文件类型
放包
上传成功
2.2.2黑名单
2.2.2.1利用解析漏洞绕过黑名单
所谓的解析漏洞就是中间件配置错误,导致中间件可以将任意后缀的文件当作脚本语言进行解析,如果任意后缀名文件中包含恶意的脚本语言,服务器就会受到攻击。
以第三关为例
禁止上传 asp....php后缀文件 但是黑名单不完全 可以通过一些畸形后缀名通过 php1、php2、php3、php4、php5、php7、pht、phtml、 phar、 phps、Asp、aspx、cer、cdx、asa、asax、jsp、jspa、jspx等
将后缀名改成 .php3
前提条件 pache的httpd.conf有配置代码AddType application/x-httpd-php .pht .phtml .phps .php5 .pht
2.2.2.2上传.htaccess文件绕过黑名单
什么是.htaccess文件?
文件夹密码保护、用户自动重定向、自定义错误页面等功能,
.htaccess被称为超文本入口,此文件有多个功能,其中一个功能可以改变文件扩展名,同时也可以实现
编写.htaccess文件
<FilesMatch "info.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
此文件的内容大概意思为,.htaccess文件可以将info.jpg文件当作php文件解析执行。
以第四关为例
可以看到禁止上传畸形后缀名
可以先上传.htaccess SetHandler application/x-httpd-php
可以把任何文件形式解析为php
上传.htaccess后 再把一句话木马的后缀改为.jpg上传 即可成功
2.2.2.3大写绕过
利用windows系统的特性,windows系统中是不区分大小写,但是linux系统是严格区分大小写,所以此方法只适用于windows系统。
将文件后缀改为 .Php 直接上传
2.2.2.4空格绕过
windows系统会自动去除文件后缀名的空格,因此可以利用空格绕过网站限制,但是此方法只适用于windows系统。
上传php文件,使用bp抓包截断,然后在文件名info.php处添加空格放包即可上传成功。
2.2.2.5点号绕过
windows系统会自动去除文件后缀名的点号。上传info.php文件,使用bp抓包,将其文件名修改为info.php.即可上传成功,然后访问。
2.2.2.6::$DATA绕过限制
windows系统不允许文件名中包含特殊字符,因此Windows系统在保存info.php:$DATA一类的文件时会自动去除文件后的::$DATA字符串,保存的文件名为info.php。
2.2.2.7空格+点号绕过
2.2.2.8双写绕过
程序中的str _ireplace函数会将黑名单中的后缀替换为空,但是只替换了一次,因此我们可以使用双写绕
过此函数。
2.2.2.9CVE-2015-2348 move_uploaded file()00截断
move_uploaded file()函数本身存在逻辑漏洞缺陷,可以实现00截断绕过。也可以在php文件名后添加任
意字符,只要不在黑名单限制内都可成功上传文件。
2.2.3白名单
2.2.3.1MIME类型绕过
服务端MIME类型检测是通过检查http中包含的Content-Type字段中的值来判断上传文件是否合法的。
利用Burp抓包,将报文中的Content-Type改成允许的类型
Content-Type: image/gif(gif图像)
Content-Type: image/jpg(jpg图像)
Content-Type: image/png(png图像)
如上面演示的第二关
2.2.3.2GET型00截断
windows系统识别到文件名中00的时候将不再向后识别,这是windows系统特性导致的。
%00不是代表空格,而是null,一个空字符,当程序执行到%00后,那么后面的数据就会停止,意思就是误当作结束符,把后面的数据直接忽略了,这就会导致漏洞产生。
在文件上传后,利用%00截断,在文件扩展名验证的时候,就会取文件的扩展名进行验证,但是在最后保存在本地的时候,%00就会截断文件名,只保存%00之前的内容。
%00只能用于php版本低于5.3的。这里我们需要把phpstudy切换一下版本,把magic_quotes_gpc关闭,以phpstudy为例。其他选项菜单—php扩展及设置—参数开关设置—把magic_quotes_gpc关闭。
2.2.3.3POST型00截断
接受值从get变成了post,它两的区别就是get会自行解码,而post不会解码,所以需要对%00进行解码。
在BS抓包中选中%00右键选择URL其次选择网址解码。
2.2.3.4二次渲染
在我们上传文件后,网站会对图片进行二次处理(格式、尺寸要求等),服务器会把里面的内容进行替换更新,处理完成后,根据我们原有的图片生成一个新的图片并放到网站对应的标签进行显示。。将一个正常显示的图片,上传到服务器。寻找图片被渲染后与原始图片部分对比仍然相同的数据块部分,将Webshell代码插在该部分,然后上传。
制作图片马
将图片与木马合并为图片
上传该图片马,上传后重新下载。将图片马与下载后的图片进行十六进制比较。
找到两个文件数据相同块,在下载后的图片数据相同处插入php恶意语句保存即可,
2.2.3.5条件竞争时间差
条件竞争就是在源代码中是存在校验的,但是校验是在文件上传后,才开始校验,也就是文件先上传至服务器中,然后服务器会对该文件进行校验,当符合的时候则会对文件进行重命名,当文件不符合要求的时候就对将文件进行删除。
而我们则需要在服务器对文件删除前进行访问,由于文件在访问过程中,服务器是无法删除的,所以就可以利用这个节点实现条件竞争。
<?php file put contents("info.php",'<?php phpinfo();)?>')?>#file put contents()把字符串写入文件中<?php fputs(fopen('info.php','w'),'<?php phpinfo();?>');?>
上传该文件后进行抓包,并且发送到intrude模块
设置好payload和线程数,不断的访问目标路径,直到成功为止。
3.waf绕过
waf绕过其实就是将数据包截获到,通过正则匹配来匹配危险函数或者后缀实现拦截,对里面的内容进行解析,比如对文件的后缀名就判断是否在相应的黑名单中,文件内容中是否存在webshel代码。总的来说文件上传都是在数据包中进行各种操作来进行绕过。文件上传时,我们首先要判断参数的可更改性。
Content-Disposition:一般可更改
name:表单参数值,不能更改
filename:文件名,可以更改
Content-Type:文件MIME,视情况更改
3.1常见绕过方式
3.1.1数据溢出-防匹配(脏数据)
当上传时候发现被拦截,可以尝试用脏数据
3.1.2符号变异-防匹配('"';)
1)去掉文件名的双引号
2)去掉文件名最后的双引号
3)将双引号去掉,然后改为单引号后,去掉后面的单引号4)将原数据包中的"eval.php"修改为"x.jpg;.php
5)修改为filename="Content-Type:image/jpeg;eval.php
3.1.3数据截断-防匹配(%00,换行)
通过空格回车换行和分号截断
3.1.4重复数据-防匹配(参数多次)
通过设置多个参数进行匹配,避免被匹配到。
4.防御与修复
后端验证:针对后端验证的可以采用通过服务器进行验证。
后缀检测:利用黑白名单进行过滤,当然最好是使用白名单,黑名单有时候总归会存在一些未想到的后缀,而白名单就相对简单一点,只需要想放通哪些后缀即可,而且防范更好一些。
上传目录:对上传文件到的目录可以设置一个不可执行的权限。
文件名:针对文件名可以自定义一些随机数以及一些其他的内容进行二次修改,从而改变文件的名称。
内容检测:可以使用文件头,完整性检测,最好能够对内容的数据进行判断是否存在一些webxshll类似的代码,若出现这类代码,直接删除。