原理
攻击者可以上传一个与网站脚本语言相对应的恶意代码动态脚本到服务器上,然后访问这些恶意脚本中包含的恶意代码,从而获得了执行服务器端命令的能力,进一步影响服务器安全。
危害
可能会导致用户信息泄露,被钓鱼,甚至使攻击者可以直接上传WebShell到服务器,进而得到自己想要的信息和权限,最终达到对数据库执行、服务器文件管理、服务器命令执行等恶意操作,甚至完全控制服务器系统。
产生条件
1、能够成功上传恶意文件。
2、用户能够访问上传的恶意文件,所以需要知道上传恶意文件的准确路径。
3、上传的恶意文件能够被web容器解析执行,所以上传路径要在web容器覆盖范围内。
检测与绕过
客户端绕过
前端检测原理:调用JS的selectFile()函数,将文件名转化为小写,然后通过substr获取文件名最后一个点好后面的后缀(包括点号)进行判断。
查看前端页面源代码删除JS事件
构造URL上传表单
使用bp抓包更改后缀名
服务端绕过
后缀名检测与绕过
黑名单绕过
1、大小写
2、名单列表
上传的文件能够被解析且不在名单列表中。
想让上传的文件能够被解析,需要在httpd.conf文件中配置:
AddType application/x-httpd-php .php .phtml .php5 .php3(指定上传的文件后缀)
3、Windows特性 末尾的点【.】绕过 空格【 】绕过 ::$DATA
(如果上传的文件不能解析,需要在Apache的配置文件httpd.conf文件中添加相应的语句即可:例如需要解析后缀为.phtml的文件时,需要添加 AddType application/x-httpd-php .php .html .phtml)
.htaccess文件攻击(分布式配置文件)
全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride All指令来设置.htaccess文件内容,.htaccess文件解析规则的增加,是可以按照组合的方式去做的。
利用方式:上传覆盖.htaccess文件,重写解析规则,将上传的带有脚本马的图片以脚本方式解析。
第一种、虽然好用,但是会误伤其他正常文件,容易被发现<IfModule mime_module>AddHandler php5-script .gif #在当前目录下,只针对gif文件会解析成Php代码执行SetHandler application/x-httpd-php #在当前目录下,所有文件都会被解析成php代码执行</IfModule>
第二种、精确控制能被解析成php代码的文件,不容易被发现<FilesMatch "evil.gif">SetHandler application/x-httpd-php#在当前目录下,如果匹配到evil.gif文件,则被解析成PHP代码执行AddHandler php5-script .gif #在当前目录下,如果匹配到evil.gif文件,则被解析成PHP代码执行</FilesMatch>
第三种、同1没太大区别<IfModule mime_module>AddType application/x-httpd-php .gif</IfModule>
htaccess 文件生效前提条件为: mod_rewrite 模块开启 AllowOverride All
#1:这个.htaccess的意思就是把所有名字里面含有shell的文件当成php脚本来执行
<FilesMatch "shell">
SetHandler application/x-httpd-php
</FilesMatchc>
#2:这里代码的意思可以让 .jpg后缀名文件格式的文件名以php格式解析
AddType application/x-httpd-php .jpg
白名单
1、配合文件包含漏洞或者配合解析漏洞解析
2、MIME类型绕过
bp抓包修改HTTP头部的Content-Type的值(读取的是上传文件的后缀,抓包修改)
.js application/x-javascrip .html text/html
.jpg eimage/jpeg .png image/png .pdf application/pdf
3、00截断绕过
两个条件: (1)php版本小于5.3.4 (2)php的magic_quotes_gpc为OFF状态
GET:上传1.jpg burp抓包,在请求行中.../upload/后面加上 1.php%00 把%00当成结束符,后面的数据直接忽略,这也导致了很多的问题,文件包含也可以利用这一点。
POST:与GET类似,但需要在二进制中进行修改。(0x00)
文件内容检测与绕过
文件头检测绕过
将图片头部格式放在上传文件头部可以绕过上传成功。
JPG:FF D8 FF E0 00 10 4A 46 49 46
GIF :47 49 46 38 39 61 (GIF89a)
PNG:89 50 4E 47
图片马绕过
检测原理:利用getmagesize()函数或exif_imagetype()
函数根据文件头的字节返回文件的类型。将恶意程序嵌入图片中,构成图片马,制作方法如下:
方法一:文本方式打开图片直接粘贴一句话木马
方法二:cmd命令行执行
copy 1.jpg /b+2.php 3.jpg /b是二进制形式打开 /a是ascii方式打
方法三:16进制打开图片在末尾添加一句话木马。
方法四:PS先打开图片,点击文件->文件简介,添加木马,上传连接
二次渲染绕过
核心思想是先上传一张图片,再将上传完成后的图片保存下来,对比渲染前后图片的编码变化,在未被渲染的区域写入webshell。由于不同格式文件的特性,再进行二次渲染时,选用gif文件最为简单,对于jpg、png需要利用脚本进行改写。
条件竞争检测与绕过
原理:代码存在条件竞争问题,非法文件上传后会先保存在upload目录下,然后调用unlink函数删除,在这中间时间差里,我们可以不断上传和访问非法文件,只要速度快就可以触发成功。
绕过步骤:
1、先设置上传Info.php请求,burp拦截到上传文件后发送到intrude模块,因为这里没有参数需要爆破,只需反复发起请求即可,所以payload设置为null payloads,请求次数为5000次,线程为60。
2、接下来设置访问请求,浏览器构造请求url://http://127.0.0.1/upload/upload/info.php,进行访问,发送到burp的intrude模块,跟步骤1一样设置同样的payload、5000次请求次数、60个线程。
3、同时开始攻击,观察第二个请求返回的长度,长度不一样的则成功。
防御
1、文件上传的目录设置为不可执行
2、判断文件类型:强烈推荐白名单方式。此外,对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码。
3、使用随机数改写文件名和文件路径:一个是上传后无法访问;再来就是像shell.php.rar.rar和crossdomain.xml这种文件,都将因为重命名而无法攻击。
4、单独设置文件服务器的域名:由于浏览器同源策略的关系,一系列客户端攻击将失效,比如上传crossdomain.xml、上传包含Javascript的XSS利用等问题将得到解决。