文章目录
-
- 文件上传
-
- 成因
- 客户端校验
- 服务器校验
- 原理
- 危害
- 防御
- 解析漏洞
文件上传
成因
- 对上传文件的后缀名(扩展名)没有严格限制
- 上传文件MIMETYPE 没有做检查
- 上传文件的文件权限在权限上没有控制(特别是对于shebang类型文件)
- 对于web server对上传文件或指定目录的行为没有限制
客户端校验
-
前段js验证
- 可通过审计修改js代码或burp改包绕过
服务器校验
-
content-type字段校验
- 将Content-Type修改为image/gif,或其他允许类型
- 删除整行
- 删除掉ontent-Type: image/jpeg只留下c,将.php加c后面就可以了,但是要注意引号要跟着c.php
- 将Content-Type修改为content-Type
- 将 Content-Type: application/octet-stream 冒号后面 增加空间
-
文件头校验
- 将文件头修改为允许上传文件类型的文件头
-
检查扩展名
-
黑名单策略
-
列表名绕过
- 找到黑名单中漏网的鱼,比如asa,cer,cer,ashx,asa,cer,cdx,htr,
-
大小写绕过
- 比如aSp,pHp等
-
可分析的后缀名:jsp,jspx,jspf,asp,asa,cer,aspx,ashx,php,php ,php3,php4,exe,exee
-
上传.htaccess文件
-
通过.htaccess 文件调用 php 只要包含一个文件名,分析器就可以分析。cimer字符串的任何文件。.htaccess 文件可以绕过许多上传验证机制。(配合黑名单检测)
-
1.建立.htaccess 内容如下:<FilesMatch “cimer”> SetHandler application/x-httpd-php
-
上传 php 包括木马文件名 cimer
- 设置句子密码cimer
-
-
利用 php 解析器来解析 jpg 文件创建.htaccess 文件内容如下:AddType application/x-httpd-php .jpg
-
-
空格绕过
- 在后缀名后加空格
-
文件名绕过
- php1,php2,php3,php4,php5,Php,aSp
-
绕过特殊字符
- 1.asp_
-
-
白名单策略
- 通过分析漏洞上传
-
0x00截断绕过
假设文件的上传路径是【http://xx.xx.xx.xx/upfiles/lubr.php.jpg】,抓包切断将【lubr.php】后面的【.】换成【0x00】。上传时,文件系统读取0x00会认为文件已经结束,从而结束【lubr.php.jpg】内容写入【lubr.php】从而达到攻击的目的。 上传抓包后(如果上传)jpg文件名字为1.jpg)在hex中找到1.jpg对应的十六进制,将.相应的十六进制(.十六进制是2e)改为00,go,上刀连接就行了
-
00截断是指程序员在编写程序时不严格过滤文件的上传路径,产生0x00上传截断漏洞。PS:0x00是字符串的结束标志
-
例:1.php.jpg
-
限制条件
- PHP<5.3.29,且GPC关闭
-
原理
- 0x00是字符串的结尾标识符。如果系统在阅读文件名时遇到0x00,你会认为取已经结束。
- 注:00是指文件16进制内容中的00,而不是文件名中的00 !!!也就是说,系统按16进制读取文件(或二进制)ascii代码为零的位置停止,这个位置ascii在16进制中,代码为零的位置为00,用0x开头说16进制,也就是说0x00截断。
-
-
绕过双扩展名
- apache的conf配置有AddHandler php5-script.php没有注释,文件名1.php.jpg就能当作php执行
-
-
验证文件类型
- 通过抓包将content-type将允许上传的上传的类型
原理
文件上传漏洞是指网络攻击者将可执行的文件上传到服务器上,没有任何检查或过滤,导致文件执行。这里上传的文件可以是木马、病毒、恶意脚本或WebShell等。
危害
- 上传文件是Web脚本语言,服务器的Web用户上传的脚本由容器解释和执行,导致代码执行。
- 上传文件是Flash的策略文件crossdomain.xml,控制黑客Flash该领域下的其他行为(类似于以类似方式控制策略文件);
- 上传的文件是病毒和木马文件,黑客用来引诱用户或管理员下载和执行。
- 上传的文件是钓鱼图片或包含脚本的图片,在某些版本的浏览器中被用作钓鱼和欺诈的脚本。
防御
- 白名单策略用于验证文件扩展名服务端。
- 服务端验证文件内容
- 随机重新命名上传文件
- 隐藏上传文件的路径
- 文件上传的目录设置为不可执行
- 单独设置文件服务器的域名
解析漏洞
IIS 6.0 在处理含有特殊符号的文件路径时,会出现逻辑错误,导致文件分析漏洞。
-
IIS解析漏洞
-
IIS6.0
-
/目录分析:/xx.asp/xx.jpg ,若目录为"xxx.asp"如果以形式命名,目录中的所有类型文件都将被视为asp分析和执行文件
-
文件解析:test.asp;.jpg ,在IIS6.0下,分号后面不分析,也就是说test.asp;.jpg它将被服务器视为是test.asp
-
还有IIS6.0 默认可执行文件除外asp还包括这三种.asa、.cer、.cdx
-
PUT漏洞
-
成因:IIS Server 在 Web 服务扩展开始了 WebDAV ,可以写入的配置限,造成任意文件上传。
-
修复
- 关闭 WebDAV 和写权限
-
-
短文件名猜解 PS:IIS6.0~10.0都受影响
-
成因:IIS 的短文件名机制,可以暴力猜解短文件名,访问构造的某个存在的短文件名,会返回404,访问构造的某个不存在的短文件名,返回400。
-
修复
-
升级 .net framework
-
修改注册表禁用短文件名功能
- 快捷键 Win+R 打开命令窗口,输入 regedit 打开注册表窗口,找到路径:
-
-
-
-
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem,将其中的 NtfsDisable8dot3NameCreation这一项的值设为 1,“1”代表不创建短文件名格式,修改完成后,需要重启系统生效
- CMD 关闭 NTFS 8.3 文件格式的支持
- 将 web 文件夹的内容拷贝到另一个位置,如 c:\www 到 d:\w ,然后删除原文件夹,再重命名 d:\w 到 c:\www。
- 修复成功后显示:Server is not vulnerable
- 局限性
- 此漏洞只能确定前6个字符,如果后面的字符太长、包含特殊字符,很难猜解
- 如果文件名本身太短(无短文件名)也是无法猜解的
- 如果文件名前6位带空格,8.3格式的短文件名会补进,和真实文件名不匹配
- 远程代码执行
- 成因:在 IIS6.0 处理 PROPFIND 指令的时候,由于对 url 的长度没有进行有效的长度控制和检查,导致执行 memcpy 对虚拟路径进行构造的时候,引发栈溢出,从而导致远程代码执行。
- 修复
- 关闭WebDAV服务
- 使用相关防护设备
- IIS7.0/7.5
- test.jpg/.php
URL 中文件后缀是 .php ,便无论该文件是否存在,都直接交给 php 处理,而 php 又默认开启 “cgi.fix_pathinfo” ,会对文件进行“修理”,可谓“修理”?举个例子,当 php 遇到路径 “/aaa.xxx/bbb.yyy” 时,若 “/aaa.xxx/bbb.yyy” 不存在,则会去掉最后的 “bbb.yyy” ,然后判断 “/aaa.xxx” 是否存在,若存在,则把 “/aaa.xxx” 当作文件。
若有文件 test.jpg ,访问时在其后加 /.php ,便可以把 “test.jpg/.php” 交给 php ,php 修理文件路径 “test.jpg/.php” 得到 ”test.jpg” ,该文件存在,便把该文件作为 php 程序执行了。
修复
- 对新建目录文件名进行过滤,不允许新建包含‘.’的文件
- 取消网站后台新建目录的功能,不允许新建目录;
- 限制上传的脚本执行权限,不允许执行脚本;
- 过滤 .asp/xm.jpg,通过 ISApi 组件过滤。