文件上传漏洞基础知识总结

文件上传:-----主要学习绕过方法

为什么有文件上传漏洞:

如果不对上传的文件进行限制或限制绕过,该功能可被利用上传可执行文件、脚本到服务器上,从而进一步导致服务器沦陷。

文件上传漏洞的成因:

1.服务器的错误配置
2.开源编码器漏洞
3.本地上传上限制不严格被绕过
4.服务器端过滤不严格被绕过

常见上传检测流程

clipboard.png

2.文件上传漏洞的危害

(1)网站被控制
(2)服务器沦陷
(3)同服务器的其他网站沦陷

文件上传检测类型:

3.客户端验证检测

可以看到客户端代码中使用了javascript语言进行了简单的文件后缀名判断---一般都是白名单校验

clipboard2.png

首先:如何区分是客户端还是服务端检测

在网络处查看是否有数据包来判断

解决办法:

上传图片后缀的小马文件,抓包修改后缀为对应网站的脚本语言;

4.服务器端MIME绕过

MIME检测的是数据包content-type字段。常见的图片格式的MIME类型有以下 几种类型:

  • PNG图像:image/png
  • GIF图形: image/gif
  • JPG图形:image/jpeg

解决办法:

抓包修改数据包content-type字段为以上3种;

5.服务器端目录检测绕过

在文件上传时,有的程序允许用户将文件放到指定的目录中,如果指定目录存在就将文件写 入目录,不存在则先建立目录,然后写入。关键代码如下:

在HTML页面有一个隐藏的表单,它默认提交的文件夹名称为value的值,即”uploads”。代 码如下:

风险:

asp程序中:
如果文件保存路径含有.asp,那么这个目录下边所有的文件都可以按照asp来解析;
只能上传一个图片,但是可以控制目录。目录名:aaa.asp

上传的文件路径:.../aaa.asp/test.jpg
test.jpg文件会被按照asp解析

6.服务器端扩展名检测绕过
分为黑名单、白名单

判断黑白名单方式:

上传一个不存在的后缀名,例如a.asdasds文件,如果上传成功则为黑名单,反之为白名单。

黑名单绕过办法:

1).大小写组合绕过:pHp,AsP

2).特殊文件名绕过

在Windows下有一个特性就是如果文件后缀以点‘.’或者空格‘ ’结尾的后缀 名时,系统在保存文件时会自动去除点和空格。但要注意 Unix/Linux 系统没有 这个特性。

例如: 网站上传函数处理xxx.asp.时,在保存文件时,去除.,文件后缀最终保存的后缀 名为xxx.asp

3). 0x00截断绕过

文件名后缀有一个0x00字节,可以截断某些函数对文件名的判断。在许多语言函 数中,处理字符串的函数中0x00被认为是终止符
例如: 网站上传函数处理xxx.asp0x0.jpg时,首先后缀名是合法的jpg格式,可以 上传,在保存文件时,遇到0x00字符丢弃后面的 .jpg,文件后缀最终保存的后缀 名为xxx.asp

4) .htaccess文件攻击

.htaccess文件时Apache服务器的一个配置文件,负责相关目录下的配置。
如果服务器对文件名控制不够严格,通过move_UPLOADED_FILE函数把自己写的.htaccess文件覆盖掉服务器上的,这样就可以定义名单了;

clipboard3.png

通过文件调用php解释器去解析一个文件名中只要包含“haha”这个字符串的任意文件,无论你文件名是什么样子,只要包含“haha”这个字符串就可以按照php解析。

5).配合解析漏洞(apache)

白名单绕过办法

1).0x00 截断绕过

用像test.asp%00.jpg的方式进行截断,属于白名单文件
先在.jpg前面加一个空格,然后再hex中修改20为00

2).解析/包含漏洞绕过(IIS、nginx)

这类漏洞直接配合上传一个代码注入过的白名单文件即可,再利用解析,包含漏洞。
asp程序中:
如果文件保存路径含有.asp,那么这个目录下边所有的文件都可以按照asp来解析;
只能上传一个图片,但是可以控制目录。
目录名:aaa.asp
上传一个sqp文件,后缀为jpg,上传成功后,yvette.jpg按照asp文件解析。

7.文件内容检测绕过:

针对文件内容检测的绕过,一般有两种方式,

  1. 制作图片马
  2. 文件幻术头绕过

1).图片马的制作

Windos下的制作
准备一个一句话小马文件:
cmd:

copy 1.png/b+shell.php/a 1.png

其中第一个/b表示指定以二进制格式进行复制(合并) 第二个/b表示以什么样的格式保存我们刚刚合并的那个文件( 用于图像类/声音类文件)
还有一种参数/a,它表示以ASCII格式复制合并文件,用于txt等文档类文件

Linux下的制作
cat a,jpg shell.php > tupianma.jpg
当然 >>追加符号也是可以用的

2).文件幻术头绕过

图像相关的信息检测常用getimagesize( )函数。每种类型的图片内容最开头会有一个标志性 的头部,这个头部被称为文件幻术。常用图片类型有以下几类:
绕过jpg文件幻术检测要在文件开头写上下图的值----hex
Value = FF D8 FF E0 00 10 4A 46 49 46

jpg.png

绕过png文件幻术检测要在文件开头写上下图的值:
Value = 89 50 4E 47

png.png

绕过gif文件幻术检测要在文件开头写上下图的值:
GIF89a
Value = 47 49 46 38 39 61

gif.png

8.解析漏洞:

解析漏洞这里介绍三种:
中间件

  1. Apache解析漏洞
  2. IIS解析漏洞
  3. Ngix解析漏洞

1).Apache解析漏洞

一个文件名为test.php.aaa.bbb.ccc的文件,Apeche会把从ccc的位置开始尝试解析,如果ccc不属于apache能解析的后缀名,那么Apache就会尝试去解析bbb,一只尝试,直到遇到一个能被解析的扩展名为止。(黑名单)

WampServer2.0All Version (WampServer2.0i / Apache 2.2.11) [Success] l
WampServer2.1All Version (WampServer2.1e-x32 / Apache 2.2.17) [Success] l
Wamp5 All Version (Wamp5_1.7.4 /Apache 2.2.6) [Success] l
AppServ 2.4All Version (AppServ - 2.4.9 /Apache 2.0.59) [Success] l
AppServ 2.5All Version (AppServ - 2.5.10 /Apache 2.2.8) [Success] l
AppServ 2.6All Version (AppServ - 2.6.0 /Apache 2.2.8) [Success]

2). IIS解析漏洞

IIS6.0有两个解析漏洞,一个是如果目录名包.asp 、.asa、.cer字符串,那么这个目录下所有的文 件都会按照 asp 去解析。前提可以创建目录
例如: test.asp/1.jpg
因为文件名中有.asp字样,所以该文件夹下的1.jpg会按照asp文件去解析执行

另一个是只要文件名中含有.asp、.asa、.cer会优先按 asp 来解析
例如:test.asp;.jpg(白名单)

IIS7.0/7.5是对php解析时有一个类似于Nginx的解析漏洞, 对任意文件名只要在URL后面追加 上字符串“/任意文件名.php”就会按照 php 的方式去解析 。
例子 : ”http://www.baidu.com/upload/1.jpg/test.php"
这种情况下访问1.jpg,该文件就会按照php格式被解析执行

3).Nginx解析漏洞

一个是对任意文件名,在后面添加/任意文件名.php的解析漏洞,比如原本文件名是 test.jpg, 可以添加为 test.jpg/x.php 进行解析攻击。
白名单
一种是对低版本的 Nginx 可以在任意文件名后面添加%00.php
例如:127.0.0.1/sql-loads/load/test.jpg%00.php
那么test.jpg也就被当作php格式文件执行
nginx 0.5.* [Success]
nginx 0.6.* [Success]
nginx 0.7 <= 0.7.65 [Success]
nginx 0.8 <= 0.8.37 [Success]


总结:

前端绕过:
   javascript对文件后缀名有限制,一般会判断文件后缀名;(白名单)
服务端验证:

  1. 文件类型---image/jpeg;image/gif;image/png;image/bmp
  2. 上传时允许指定上传目录(asp解析漏洞)
  3. 文件后缀
    黑名单

   文件名大小写;
   windows特性绕过;
   00截断;
   htaccess文件攻击;
   php php2 php3 php5(基本没用);
   黑名单列表不全asp---asa、cer;
   解析漏洞(apache)

   白名单

   00截断;
   配合解析漏洞(IIS、nginx);
   文件包含

  1. 文件内容:

图片马;
改文件头部特征;


上传测试流程:

1.寻找上传点:
2.测试上传点是否可用,上传一张正常的图片;
3.再上传一张正常的图片---抓包修改文件后缀为对应网站脚本语言;------判断是否对文件后缀名的检测
上传成功---上传图片马---。。。。
上传失败---对后缀名进行了检测,近一步判断是黑名单检测/白名单检测
4.判断是黑名单检测/白名单检测:上传一张正常的图片,在后缀随便加几个字符进行上传;(后缀既不再黑名单也不在白名单)
成功---黑名单检测;失败--白名单检测;
黑名单检测绕过:。。。。
白名单检测绕过;。。。。

具体上传测试过程参考uplaod-labs的通关笔记

标签: none

添加新评论