Velocity Parse()函数引发的本地文件包含漏洞及利用方法解析
一 背景及描述 Velocity是一款基于Java的模板引擎,其设计初衷是让模板设计者能够通过简洁的模板语言(VTL)调用Java对象,而无需直接编写Java代码。然而,功能越丰富的渲染层语言,往往越容易引入安全风险——这一点在PHP上已经得到了充分印证。 有些人认为,Velocity不能像JSP那
一 背景及描述
Velocity是一款基于Java的模板引擎,其设计初衷是让模板设计者能够通过简洁的模板语言(VTL)调用Java对象,而无需直接编写Java代码。然而,功能越丰富的渲染层语言,往往越容易引入安全风险——这一点在PHP上已经得到了充分印证。
有些人认为,Velocity不能像JSP那样直接编写Java代码,实现了严格的MVC分离,因此应该是安全的。事实果真如此吗?读完本文,你或许会改变看法。
二 什么是本地包含漏洞(LFI)
本地包含(LFI)是一种经典的Web攻击技术。攻击者的目标是将一个包含恶意代码的文件引入,并通过渲染层语言执行。由于语言本身提供了include、require这类函数,LFI在PHP中尤为常见。
三 Velocity Parse()函数
官方定义:#parse脚本元素允许模板设计者导入一个包含VTL的本地文件,Velocity会解析其中的VTL并渲染指定的模板。
简单来说,#parse()就是用来引入含有VTL的模板文件的。常见用法:
#parse( "me.vm" )
容易混淆的是#include()函数——注意,#include引入的文件内容不会经过模板引擎处理,只是单纯输出。常见用法:
#include( "one.txt" )
然而,在实际开发中,不少程序员会偷懒,直接将变量拼接到路径里,写出类似这样的代码(真实案例并不少见):
#parse("${path}.vm")
一旦path变量被用户控制,漏洞便随之而来。
四 利用条件
要利用这个漏洞,通常需要满足三个条件:
#parse()中的变量用户可控;- Velocity的模板读取路径不限于Web目录;
- 能够截断(比如使用%00空字节)。
后两个条件乍一看很苛刻,但仔细研究就会发现,不少架构师并不会把Velocity的模板目录死死限定在WEB-INF甚至webapp目录下——这为利用留下了空间。
例如,在velocity.properties中,类似下面的配置都是危险的:
resource.loader = file
file.resource.loader.class = org.apache.velocity.runtime.resource.loader.FileResourceLoader
file.resource.loader.path = /opt/templates
file.resource.loader.path = /home/myhome/other_root_path
五 利用方法
与传统LFI的利用思路大同小异,总结下来有三种典型手法:
- 文件跳转读取敏感信息
例如:http://test.com/index.php?page=../../../../../../../../../../etc/passwd%00 - 上传恶意文件再包含
在上传点上传一个含有恶意VTL代码的JPG文件,然后通过LFI将其“包含”进来,让原本是图片的文件被当作VM模板解析。 - 利用日志或环境变量
修改HTTP请求包,在URL或User-Agent中携带恶意VTL代码,再通过LFI包含访问日志或/proc/self/environ,让代码被执行。
下面进入实战环节,演示其中一种经典用法:
Step1 在图片文件中插入以下VTL代码:
#set ($exec = "thanks")$exec.class.forName("java.lang.Runtime").getRuntime().exec("calc")
Step2 将这张图片上传到服务器。
Step3 通过本地包含漏洞点,进行目录跳转并用%00截断。

六 防御方法
要避免此类漏洞,可以从两方面入手:
- 限定模板目录:在
velocity.properties中做类似配置,将模板加载限制在Web应用目录内:
resource.loader = webapp
webapp.resource.loader.class = org.apache.velocity.tools.view.servlet.WebappLoader
webapp.resource.loader.path=/WEB-INF/vm/
- 过滤用户输入:对用户提交的路径参数进行
../等目录遍历字符的过滤。
七 小结
国内在Java安全研究方面起步相对较晚,一个典型的例子就是Struts漏洞——常年无人问津,直到前段时间出了利用工具,才在国内火起来。
安全,说到底还是思路问题。漏洞从来不会只光顾PHP,Java世界里同样暗流涌动。希望这篇文章能给你带来一些启发。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
DDoS攻击的三大主要形式:原理、特征与防御重点
DDoS攻击主要分为基于流量(Volume)、基于应用层(Application)和基于协议(Protocol)三种形式。流量型攻击通过海量数据淹没带宽;应用层攻击利用Web漏洞耗尽服务器资源;协议层攻击则利用TCP握手缺陷导致系统挂起。了解这些原理是制定针对性防御策略的基础。
如何有效预防和缓解DDoS攻击:5大核心策略详解
面对DDoS攻击,单纯增加带宽已非长久之计。本文详解5大核心防护策略:优化网络硬件配置、建立DNS冗余机制、部署透明缓解技术、引入负载平衡器及专用Anti-DDoS模块。通过合理组合这些技术手段,可有效抵御SYN泛洪、Slowloris等常见攻击,保障业务连续性与网站可用性。
DDoS防护四大误区:CDN、防火墙与黑名单的局限性解析
许多企业误以为CDN、防火墙或黑名单能完全抵御DDoS攻击。本文深入解析四大常见误区:CDN仅提供部分缓解、静态黑名单易失效、防火墙算力有限且可能成为目标、阈值警报仅具滞后性。了解这些局限性,有助于构建更立体的防御体系,避免在攻击发生时措手不及。
常见DDoS攻击类型详解:原理、特征与防御策略
本文详细解析四种常见DDoS攻击类型:SYN Flood利用TCP三次握手缺陷耗尽资源;UDP Flood通过海量数据包造成带宽拥塞;ICMP Flood利用Ping请求消耗系统算力;应用层Flood针对Web脚本进行高频请求。了解其原理是制定有效防御策略的基础。
如何有效抵御DDOS攻击:4种核心防护方案解析
面对DDOS攻击,企业需构建多层防护体系。本文详解四大核心策略:利用反向路由器查询进行流量清洗,通过GCDN智能分配节点隐藏源站IP,部署负载均衡硬件分担压力,以及接入高防机房抵御数百G恶意流量。掌握这些技术,可最大程度保障业务连续性。
- 热门数据榜
相关攻略
2026-08-31 11:56
2026-08-31 11:56
2026-08-31 11:55
2026-08-31 11:55
2026-08-31 11:54
2026-08-31 11:53
2026-08-31 11:53
2026-08-31 11:53
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程

