文件上传类型总结

这篇文章有点旧了,看了喜欢的可以看看,主要是博客更新麻烦,通常我在有道云上做笔记。
http://note.youdao.com/noteshare?id=3a2e27d0d1005f9a8d9f218e523eda6d&sub=7627628443FD46D7975A7381BA71AFC8
1. 前端代码
2. 逻辑绕过
3. 文件内容检测
4. 文件包含、文件备份
5.网站后台
6. 容器及语言特性
7. 畸形报文
8. 系统特性
9.SQLI 方面
 
上传文件时WAF 检测点:
1 )请求的 url url 是否合法
2 Boundary 边界,通过 Boundary 边界确定内容来检测内容
3 MIME 类型,即 content-type
4 )文件扩展名
5 )文件内容
 
文件上传后导致的常见安全问题一般有 :
1 )上传文件是 Web 脚本语言,服务器的 Web 容器解释并执行了用户上传的脚本,导致代码执行。
2 )上传文件是 Flash 的策略文件 crossdomain.xml ,黑客用以控制 Flash 在该域下的行为(其他通过类似方式控制策略文件的情况类似 );
3 )上传文件是病毒、木马文件,黑客用以诱骗用户或者管理员下载执行。
4 )上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。
本文重点是 web 层面的 web shell
 
需要注意的要点:
1 )上传后的路径在哪里
2 )上传后的文件名是否被修改了
 
有些地方可能内容有些重复,请自行琢磨。
1.前端代码
主要是通过前端的JavaScript 进行过滤,可以十分简单地绕过。如正常发包,之后抓包修改。
 
 
2.逻辑绕过
2.1MIME检测
后台代码通过检测客户端请求报文中的Content-Type 字段来判断文件类型 . ,可以先上传正常文件再修改文件内容与文件名进行绕过。
各类文件的mime 类型,百度即可,此处不列举。
2.2文件后缀检测
逻辑不严谨,过滤不严谨,导致被绕过
1) 采用黑名单,简单地过滤了 “php” ,但通过大小写的方式可以绕过 WAF ;或是替换了 php 等关键字符,通过双写 pphphp 即可绕过,这种简单的过滤方式可以通过上传之后查看文件名来判断。
2) 没有过滤 .htacess 文件上传。这时可以借助.htaccess 文件来上传恶意代码并解析。如:上传一个 .htaccess 文件,内容为 AddTypeapplication/x-httpd-php .jpg ,上传的 jpg 文件就可以当作 php 来解析
  文件上传类型总结_第1张图片
3) 没有过滤掉可以被解析的 .asa .cdx .cer 等,所以还应该使用白名单来防御。
2.3 二次上传
主要是代码的逻辑漏洞,用户上传一次文件后,网站系统就设置允许用户下一次的上传,不再对用户的上传文件进行检测,这个比较奇葩。
3文件内容检测
1 )通过检测文件内容是否含有正常文件的一些关键字符
2 )是否含有恶意代码
3 )检测文件的大小,如果文件太小了或是太大了都可能上传失败。可以添加一些无用的字符来增加文件的大小。
针对(1 ),我们可以在文件之中添加一些相应文件的标识,如下表;
类型
标识
JPEG
头标识 ff d8 , 结束标识 ff d9
.PNG
头标识 89 50 4E 47 0D 0A 1A 0A
GIF
头标识 (6 bytes) 47 49 46 38 39(37) 61 GIF89(7)a
.BMP
头标识 (2 bytes) 42 4D BM
或是使用windows 下的 copy 命令来将 .php 文件内容附加到正常的 .png 文件,合成后的文件后缀名根据情况修改。
 
 
4.文件包含
假如网站存在文件包含漏洞,可利用文件包含 来包含任意文件,如包含png 文件解析一句话木马。

5.网站后台
1)有的网站存在文件备份,数据库备份等一些可以利用的功能,如将.doc 文件备份为 .php 文件,这些都是需要细心注意的。
2)后台可能存在,可以修改PHP配置文件,网站标题等功能。也可以在这些地方尝试。一般是通过查找对应CMS,找到相应的修改方式。没有源代码的话就靠猜测,但是搞不好要写崩后台。
 
6.容器及语言特性
 
 PHP    版本 <5.3.4
据说是因为PHP 沿用了 C 语言空字符截断的特性,官方认为这不是一个漏洞,但最后还是修改了。截断漏洞的发生是有条件的。
首先需要知道,在代码层面,假如文件名不分离 ,截断是无法作用的。比如, filename=hack.php%00.gif PHP 代码拿到的文件名是 hack.php 。但是,有的程序员可能会写下   $_FILES[ 'uploaded' ][ 'name' ].'png' 之类的代码,也不检查文件名,就导致漏洞的发生。
假如不是在代码层面上检测上传的文件名,这个检测者 WAF 拿到的文件名就是 hack.php%00.gif ,它认为 %00 是正常字符串,然后漏洞就发生了。
最后一点,在使用截断%00 时需要 urlencode 一下。
 
 PHP CGI 解析漏洞:
IIS 7.0/7.5     Nginx < 0.8.3
以上的容器版本中默认php 配置文件 cgi.fix_pathinfo=1 时,上传一个存在于白名单的扩展
名文件shell.jpg ,在请求时以 shell.jpg/shell.php 请求,会将 shell.jpg php 来解析。
 Apache 解析漏洞( Apache1.x 2.x
文件名解析漏洞,遇到不认识的后缀类型会忽略并继续向前寻找后缀来解析,比如a.php.gif a.php.aaa.
 IIS 6.0
1 )目录名,包含 .asp .asa .cer ,则该目录下的文件都将被解析为 .asp 文件
文件上传类型总结_第2张图片 
2 )文件名中,分号本身以及后面的都会被系统忽略 a.asp;.gif
 
3 )文件名,文件后缀名字中为 .asp .asa .cer 之一,都会被解析为 .asp 文件
 
 Nginx 
1 )版本 0.5.* | 0.6.* | 0.7 - 0.7.65 |  0.8 - 0.8.37
利用0 截断,如 shell.png%00.php
2 )版本 0.8.41-1.5.6
利用0 截断,如 shell.png%20%00.php
 
7 . 畸形报文
WAF 对报文格式过于信任,没有处理这类问题,可能导致被绕过。
5.1 Multi Content-Disposition
IIS 的环境下,上传文件时如果存在多个 Content-Disposition 的话, IIS 会取第一个
Content-Disposition 中的值作为接收参数,而如果 waf 只是取最后一个的话便会被绕过。
 
Win2k8 + IIS7.0 + PHP
  文件上传类型总结_第3张图片
 
5.2 请求正文格式问题
1 )顺序
Content-Disposition: form-data; name="file1"; filename="shell.asp"
Content-Type: application/octet-stream
IIS6.0 下将请求正文顺序稍作变换,把filename 放在其他地方:
 
2 )插入特殊字符
  一个空格导致安全狗被绕过:
Win2k3 + IIS6.0 + ASP
  文件上传类型总结_第4张图片
边界多了两横杠导致,边界匹配不成功
Win2k3 + IIS6.0 + ASP
  文件上传类型总结_第5张图片
3 )长度
数据过长导致的绕过:
waf 如果对 Content-Disposition 长度处理的不够好的话可能会导致绕过,例如:
 
  文件上传类型总结_第6张图片
基于构造长文件名,需要文件被重命名。
 
  文件上传类型总结_第7张图片
  文件上传类型总结_第8张图片

 
5.3 文件覆盖
php环境下, 开发者没有意识到一个请求包可能包含“两个文件”,开发者虽然对前面一个进行了十分严格的检测,但是最后一个文件可以覆盖掉前面的文件。如前面文件为 image/gif . xx.gjf
,但后面跟了一个  image/gif   xx.php ,最终保存的只是后面一个。
下面是一个请求包的示例。
  文件上传类型总结_第9张图片
在畸形报文方面,大家应该天马行空地想象,大胆尝试。
8 系统特性
 Windows 特殊字符:
当我们上传一个文件的filename shell.php{%80-%99} 时:
waf 可能识别为 .php{%80-%99} ,就会导致被绕过。
Win2k8 + IIS7.0 + PHP
  文件上传类型总结_第10张图片
 
 NTFS ADS 特性:
ADS NTFS 磁盘格式的一个特性,用于 NTFS 交换数据流。在上传文件时,如果 waf 对请求
正文的filename 匹配不当的话可能会导致绕过。
 
  文件上传类型总结_第11张图片
Windows 在创建文件时,在文件名末尾不管加多少点都会自动去除,那么上传时 filename
可以这么写shell.php...... 也可以这么写 shell.php::$DATA.......
 
Win2k8 + IIS7.0 + PHP
  文件上传类型总结_第12张图片
 
 
 
9.SQLI方面
 SQLI 漏洞利用
SQLI 漏洞直接写入文件,需要满足四个条件,要求高
1 )写的权限,通常为 dba 权限方可
2 )单引号或双引号没有被过滤,因为文件名必须要用它们括起来
3 )知道网站在服务器中的绝对路径
4 )文件名不能重复,不算条件的条件
例如:select 0xaaaa into outfile  “/var/www/html/shell.php”
遇到一些网站虽然有写的权限,但是由于写入的文件名必须要带单引号或是双引号(无法用十六进制的方式),导致无法写入,这也是蛋疼的地方。本人暂时不知道有没有什么办法绕过。
 
 phpmyadmin
假如发现并进入phpmyadmin 后台,也可以尝试拿 shell ,不过还是要知道网站的据对路径信息。
1 )利用 SQL 执行来写入一句话到网站后台中。
  文件上传类型总结_第13张图片
如果网站的my.ini 文件中没有包含 secure_file_priv=这句话,就会提示如下错误信息。
 
  文件上传类型总结_第14张图片
  文件上传类型总结_第15张图片
如果提示写入失败可以尝试其他目录,多试试,名字为uploads 等的目录能够被写的可能性更高。
2 )通过日志来 Get Shell
选择变量功能
 
搜索关键字 log 找到,下面两个东西,将 "general log" 编辑为 “ON” ,且修改 “general log file” 位置为网站的绝对路径
 
 
之后在“SQL” 执行功能中输入一句话并执行就 OK 了, log 将记录这一句话。
 
 
  文件上传类型总结_第16张图片
 
结合前段时间的学习并下面文章所写。
参考
我的WafBypass 之道( upload 篇) https://xianzhi.aliyun.com/forum/read/458.html
 
 
 
 
 
 

你可能感兴趣的:(信息安全)