- 上传检测流程概述
上传检测流程概述
选择一脚本文件,点击完上传之后立刻弹出提示框,还没有经过网络,就探测出来不允许上传,这就是本地JS检测,1是看响应速度,2是看代码,响应速度可能不准确,我建议大家最好看一下代码,下面是我在某漏洞平台做的测试。
这里我选择一个后缀为asp的脚本文件,点击上传立刻出现“文件不符合要求”的提示,但这样可能不准确,我们右击检查或审查元素,在form表单中看它有没有加载检查文件,如图可以看到“车FileExt”这个检查元素。
找到这个JS函数,可以清楚的看到它的检查后缀的条件判断。
- 客户端检测绕过(JS检查)
- 直接编辑HTML,删除检测函数或者是在检测函数的白名单中加上php或者asp后缀,右击编辑HTML
可以看到直接把“checkFileExt”删除
可以看到加上php这一后缀,再次上传脚本木马
- 服务端黑名单绕过(特殊可解析后缀)
特殊可解析后缀绕过:
黑名单规则不严谨,在某些特定环境中某些特殊后缀仍会被当作php文件解析
php、php2、php3、php4、php5、php6、php7、pht、phtm、phtml
如,基于debian和ubuntu的apt-get安装apache,默认对于文件的解析规则如下
- 服务端黑名单绕过(大小写绕过)
大小写绕过
windows对大小写不敏感,所以上传大小写混写的php进行绕过
(因为后端一般验证后缀字符串是否和‘php’相等,(前提是没有将你传入的字符串进行小写转换后再对比),大写字母和小写字母肯定不相等,所以可以利用这一点进行绕过,又因为windows对大小写不敏感,所以.PhP文件被当成php文件解析)
- 服务端黑名单绕过(点绕过)
$file_name = deldot($file_name); //删除文件名末尾的点
- 服务端黑名单绕过(空格绕过)
trim()收尾去空
$file_ext = trim($file_ext); //收尾去空
若无此函数,在数据包中 filename="XXX.php " 末尾加个空格即可绕过黑名单,在windows中又会自动去掉空格还原成php格式
空格' '和点'.'都会被windows自动恢复
(7)服务器黑名单绕过(目录路径检测绕过)
目录路径检测,一般就检测路径是否合法,可以利用目录路径绕过配合iis解析漏洞
(很多韩国的站存在这种漏洞)
选择一图片木马上传,还是抓包,go一下 ,可以看到图片保存目录
在“filepath”下加上/x.asp/或者/x.asp;.解析
可以看到目录变为/x.asp/…
- 服务端黑名单绕过(:$DATA绕过)
必须是Windows,必须是php
php在windows时如果文件名加了::DATA会把::DATA会把::DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名 目的就是不检查后缀名
(9)服务端黑名单绕过(双后缀名绕过)
将非法的后缀过滤为空
绕过方式:后缀双写绕过,如:pphphp即可绕过。
(10)服务端白名单绕过(MIME类型检测绕过)
MIME检测:
这里的MIME其实就是对上传文件的Content-Type进行了检测
绕过方式:在上传文件时,开启Burp抓包工具,修改Content-Type为合法上传文件类型,比如:img/gif
- 服务端白名单绕过(%00及Ox00截断绕过)
00截断绕过:
Chr(chracode)返回与指定的ASCII字符代码相对应的字符从0到31的数字表示标准的不可打印的ASCII代码,通过ASCII码得知0=null chr(0)表示字符串结束。
而00截断常见的有%00、0x00等。
他们都表示ASCII字符表中的保留字符chr(0)。不管表示编码有什么区别,只要能让服务器正确解析为chr(0)就行。
原理:chr(0)表示结束,限制条件:小于php5.3.4 小于jdk1.7,magic_quoes_gpc=off
在上传文件的时候,如果上传的路径可控,那么在路径后加入/1.php%00当文件系统读到[0x00]时,会认为文件已经结束。
这里需要注意的是%00是添加在URL中的,所以直接添加即可。
0x00绕过:
在这里路径的位置后面添加1.php a只是一般空格的16进制为0x20,添加一个a是为了找到空格的位置,算是起到一个标记符的作用,此时通过Burp的Hex查找空格对饮的16进制位置,修改为00
此时点击Send,即可上传成功。
- 服务端内容检查绕过(文件头检查)
文件头检测
主要是在文件内容开始设置好图片文件的幻数要绕过 jpg 文件检测就要在文件开头写上下图的值
要绕过 gif 文件检测就要在文件开头写上下图的值
要绕过 png 文件检测就要在文件开头写上下面的值
然后在文件头后面加上自己的一句话木马就行了图像大小及相关信息检测常用的就是 getimagesize()函数
只需要把文件头部分伪造好就 ok 了,就是在幻数的基础上还加了一些文件信息
有点像下面的结构
GIF89a(…some binary data…)<?php phpinfo(); ?>(… skipping the rest of binary data …)
- 服务端内容检查绕过(突破getimagesize及exif_imagetype);
突破getmagesize():
1.1、原理:
隐写术的使用,将Shellcode隐写到一张BMP图片中,把字符串拆成字节,写入每个像素的alpha通道中,然后上传到可信任的网站下偏移拼接shellcode进行远程动态加载,能有效地增加了免杀性和隐匿性。
getimagesize()用于获取图像大小及相关信息,该函数参数为字符串表示的图像资源。
可以是服务器图片等可以获取的资源,也可以是用户表单上传的图像
利用过程:
第一步:准备一张图片,要上传的shellcode文件
第二步:利用隐写术,将shellcode写进图片中
第三步:上传经过隐写后生成的图片
文件拼接
在上文GIF绕过的时候提到
使用命令将2文件内容合并(可以将zip等其他类型文件伪装成图片等,copy/b 1.gif/b+1.rar/b 2.gif)
就是隐写的一直,但是容易使用010Editor等工具观察发现问题,或者使用Linux下的binwalk这个工具。
binwalk可以自动化的分析图片中附加的其他的文件,其原理就是检索匹配文件头,常用的一些文件头都可以被发现,然后利用偏移可以配合winhex或者是dd分割出隐藏的部分。
LSB图片隐写
是一种常见的方式,LSB也就是最低有效位 (Least Significant Bit)。
原理:
图片中的像数一般是由三种颜色组成,即三原色,由这三种原色可以组成其他各种颜色,例如在PNG图片的储存中,每个颜色会有 8bit,LSB隐写就是修改了像数中的最低的1bit,把信息隐藏进去,但是人眼看不出来。
Stegsolve可以辅助寻找这种LSB隐藏痕迹
突破exif_imagetype():
2.1、原理:
exif_imagetype() 读取一个图像的第一个字节并检查其签名。如果发现了恰当的签名则返回一个对应的常量,否则返回 FALSE
exif_imagetype ( string $filename ) : int
$filename是文件位置和名称,如果检查是图片文件则返回一个跟图像类型对应的数字,否则返回 FALSE。
利用过程:
利用包含文件包含漏洞
(14)服务端内容检查绕过(二次渲染绕过)
方法一
攻击函数本身
通过上传不完整的图片让其渲染函数暴露,然后攻击之。
方法二
对文件加载器进行溢出攻击。
方法三
如果我们上传图片马,你上传或者数据库备份之后,我们用菜刀连不上,它可能对你的图片马进行二次渲染了,
就是你上传图片携带的木马,它经过二次渲染,把你的木马去掉了,那你再把它修改为脚本格式也没有可以执行的代码了,所以你的菜刀连不上
一个案例就是ImageMagick,其实就是攻击它的图片操作函数,我们保存了一个图片,图片里面放置一段可执行的代码,他调用图片时把我们的命令执行了
- 服务端内容检查绕过(文件包含绕过)代码逻辑(条件竞争绕过)
文件内容检测与绕过
文件内容的检测是利用getimagesize()函数获取图片的宽高等信息,如果上传的不是图片,那么则获取不到信息。
文件内容检测的绕过常见的有两种方式:
1.在脚本文件前面补充对应的文件头
常见的图片文件头:
(16)apache、nginx、lIS7.5、8中间件解析漏洞绕过
Apache解析漏洞
Apache 是从右到左开始判断解析,如果为不可识别解析,就再往左判断。
比如 v.php.owf.rar “.owf”和”.rar” 这两种后缀是apache不可识别解析,apache就会把v.php.owf.rar解析成php脚本文件。
如何判断是不是合法的后缀就是这个漏洞的利用关键,测试时可以尝试上传一个v.php.rara.jpg.png…(把你知道的常见后缀都写上…)去测试是否是合法后缀。
IIS 7.0/IIS 7.5/ Nginx <8.03畸形解析漏洞
Nginx解析漏洞这个伟大的漏洞是我国安全组织80sec发现的,一般在互助,微信互刷平台 ,爱心福利等站有这种漏洞,这是08的站 ,PHP的特性。
在默认Fast-CGI开启状况下,黑阔上传一个名字为v.jpg,内容为
<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>’);?>
的文件,然后访问v.jpg/.php,在这个目录下就会生成一句话木马 shell.php
Nginx <8.03 空字节代码执行漏洞
影响版:0.5.,0.6., 0.7 <= 0.7.65, 0.8 <= 0.8.37
Nginx在图片中嵌入PHP代码然后通过访问
v.jpg%00.php
来执行其中的代码
(17)文件上传漏洞安全防范
防范文件上传漏洞常见的几种方法:
1.文件上传的目录设置为不可执行
只要web容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响,因此这一点至关重要。
2.判断文件类型
在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。在文件类型检查中,强烈推荐白名单方式,黑名单的方式已经无数次被证明是不可靠的。此外,对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码。
3.使用随机数改写文件名和文件路径
文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用了随机数改写了文件名和路径,将极大地增加攻击的成本。再来就是像shell.php.rar.rar和crossdomain.xml这种文件,都将因为重命名而无法攻击。
4.单独设置文件服务器的域名
由于浏览器同源策略的关系,一系列客户端攻击将失效,比如上传crossdomain.xml、上传包含Javascript的XSS利用等问题将得到解决。
系统开发阶段的防御
系统开发人员应有较强的安全意识,尤其是采用PHP语言开发系统。在系统开发阶段应充分考虑系统的安全性。对文件上传漏洞来说,最好能在客户端和服务器端对用户上传的文件名和文件路径等项目分别进行严格的检查。客户端的检查虽然对技术较好的攻击者来说可以借助工具绕过,但是这也可以阻挡一些基本的试探。服务器端的检查最好使用白名单过滤的方法,这样能防止大小写等方式的绕过,同时还需对%00截断符进行检测,对HTTP包头的content-type也和上传文件的大小也需要进行检查。
系统运行阶段的防御
系统上线后运维人员应有较强的安全意思,积极使用多个安全检测工具对系统进行安全扫描,及时发现潜在漏洞并修复。定时查看系统日志,web服务器日志以发现入侵痕迹。定时关注系统所使用到的第三方插件的更新情况,如有新版本发布建议及时更新,如果第三方插件被爆有安全漏洞更应立即进行修补。对于整个网站都是使用的开源代码或者使用网上的框架搭建的网站来说,尤其要注意漏洞的自查和软件版本及补丁的更新,上传功能非必选可以直接删除。除对系统自生的维护外,服务器应进行合理配置,非必选一般的目录都应去掉执行权限,上传目录可配置为只读。
总结
上传的文件能够被Web容器解释执行。所以文件上传后所在的目录要是Web容器所覆盖到的路径。
用户能够从Web上访问这个文件。如果文件上传了,但用户无法通过Web访问,或者无法得到Web容器解释这个脚本,那么也不能称之为漏洞。
最后,用户上传的文件若被安全检查、格式化、图片压缩等功能改变了内容,则也可能导致攻击不成功。