第一
百里香叶简介
百里叶是一个现代的Java服务器端模板引擎,它基于XML/XHTML/HTML5语法。
引擎的核心优势之一是自然模板化
这意味着百里香叶HTML模板通过使用HTML标签中的其他属性,看起来和工作起来都像HTML。
这是一个官方的例子:
2号
百里香叶的特性
动静结合:百里香叶既可以在联网环境下运行,也可以在非联网环境下运行,即允许美工在浏览器中查看页面的静态效果,程序员在服务器中查看带有数据的页面的动态效果。这是因为它支持html原型,然后在html标签中添加附加属性,实现模板+数据的显示模式。浏览器在解释html时会忽略未定义的标记属性,因此百里香叶的模板可以静态运行。当数据返回到页面时,百里香叶标签将动态替换静态内容,使页面动态显示。
开箱即用:提供标准和spring标准两种方言,可以直接套用模板实现jstl和OGNL表达效果,免去了每天设置模板、JSTL和换标签的麻烦。同时,开发人员还可以扩展和创建自定义方言。
多方言支持:百里香叶提供spring标准方言和一个与SpringMVC完美集成的可选模块,可以快速实现表单绑定、属性编辑、国际化等功能。
与springoot完美集成,springoot提供了百里香叶的默认配置,并为百里香叶设置了一个视图解析器。我们可以像以前的jsp一样操作百里香叶。除了模板语法,代码几乎没有区别。
如果使用浏览器打开包含此代码的页面,您将看到一个已填充的表,并且所有百里香叶特定的属性都将被跳过。但是,当百里香叶处理此模板时,它会用传递给模板的值替换标签文本。
要尝试处女膜中的SSTI,我们必须先了解处女膜属性中出现的表达。百里香叶表达式可以有以下类型:
$ {...}:变量表达式–实际上,它们是OGNL或Spring EL表达式。
* {...}:选择表达式–类似于变量表达式,但用于特定目的。
# {...}:消息表达式-用于国际化。
@ {...}:链接表达式–用于在应用程序中设置正确的网址/路径。
~ {...}:片段表达式–它们使您能够重用模板的一部分。
SSTI的典型测试表达式是$。这个表达也适用于百里香。
如果要实现远程代码执行,可以使用以下测试表达式之一:
斯普林格尔:
$
OGNL:
$ { # rt = @ Java . lang . Runtime @ GetRuntime,# rt.exec}
如果我们深入研究百里香叶模板引擎的文档,就会发现一个有趣的函数叫做表达式预处理。放在双下划线之间的表达式经过预处理,预处理结果在正常处理中用作表达式的一部分。这是百里香文档中的一个官方示例:
预处理$。将结果用作后面要计算的实数表达式的一部分。
服务器端模板注入是一个漏洞,允许攻击者将代码注入到这种服务器端模板中。简单地说,攻击者可以引入服务器端模板实际处理的代码。
3号
漏洞演示
使用百里香叶作为模板引擎的最简单的Spring应用程序:
文件结构:
HelloController.java:
使用@Controller和@GetMapping注释,将为URL的每个HTTP GET请求调用此方法,并将返回静态字符串“welcome”。
Spring框架将“welcome”解释为ViewName,并试图找到文件“resources/templates/welcome . html”。
如果找到它,它将从模板文件中呈现视图并将其返回给用户。如果您使用百里香叶视图引擎,模板可能如下所示
welcome.html:
百里香叶引擎支持文件布局。通过使用模板中指定的代码
,然后只从视图中请求以下代码:
第一种情况可能包含潜在的路径遍历漏洞,但是用户限制了“模板”文件夹,并且不能查看其外部的任何文件。
利用方法是尝试找到单个文件进行上传,并创建一个新的模板。
在从文件系统加载模板之前
类将模板名称解析为表达式:
因此,攻击不能通过路径遍历来利用,只能通过表达式语言注入来利用。
4号
攻击性剥削
通过添加__$__::。x到表达式,它是由百里香叶执行的。
每次传入的恶意数据到达控制器返回的视图名称时,都可能导致表达式语言注入,从而导致远程代码执行。
观察弹簧记录输出:
解析模板时出错,模板可能不存在或可能无法被任何已配置的模板解析器访问]的根本原因
参考:
https://www . acu netix . com/blog/web-security-zone/exploring-ssti-in-百里香叶/
注:本文由e安全整理报道。转载请注明原地址
https://www.easyaq.com