Java安全之Velocity模版注入

本文深入探讨了Apache Velocity模版引擎的安全问题,特别是模版注入的概念。Velocity提供了一种模板语言,允许在Java代码中引用对象。文章详细介绍了基本语法,包括语句标识符、变量、声明、注释、逻辑运算、条件语句等,并解释了如何通过`!`和`{}`等特殊标识符来处理变量。文章还展示了如何利用模版注入的POC,并分析了漏洞利用过程,包括模板解析和渲染的步骤,强调了模板内容可控性在触发模版注入中的关键作用。
摘要由CSDN通过智能技术生成

Java安全之Velocity模版注入

Apache Velocity

Apache Velocity是一个基于Java的模板引擎,它提供了一个模板语言去引用由Java代码定义的对象。它允许web 页面设计者引用JAVA代码预定义的方法

Pom.xml

<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity</artifactId>
    <version>1.7</version>
</dependency>

相关文档

基本语法

语句标识符

# 用来标识Velocity的脚本语句,包括 #set 、 #if 、 #else 、 #end 、 #foreach 、 #end 、 #include 、 #parse 、 #macro 等语句。

变量

$ 用来标识一个变量,比如模板文件中为 Hello $a ,可以获取通过上下文传递的 $a

声明

set 用于声明Velocity脚本变量,变量可以在脚本中声明

#set($a ="velocity")
#set($b=1)
#set($arrayName=["1","2"])
注释

单行注释为 ## ,多行注释为成对出现的 #* ............. *#

逻辑运算
== && || !
条件语句

以 if/else 为例:

#if($foo<10)
    <strong>1</strong>
#elseif($foo==10)
    <strong>2</strong>
#elseif($bar==6)
    <strong>3</strong>
#else
    <strong>4</strong>
#end
单双引号

单引号不解析引用内容,双引号解析引用内容,与PHP有几分相似

#set ($var="aaaaa")
'$var'  ## 结果为:$var
"$var"  ## 结果为:aaaaa
属性

通过 . 操作符使用变量的内容,比如获取并调用 getClass()

#set($e="e")
$e.getClass()
转义字符

如果 $a 已经被定义,但是又需要原样输出 $a ,可以试用 \ 转义作为关键的 $

{} 标识符

"{}"用来明确标识Velocity变量;

比如在页面中,页面中有一个 s o m e o n e n a m e ,此时, V e l o c i t y 将把 s

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值