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
SC3010-Computer-Security — Utilisation de Struts2 et PowerShell pour recréer la vulnérabilité d'injection OGNL CVE-2017-5638. | Kitploit
Outils/GitHubGitHub/aipeacs/sc3010-computer-security
Analyse StatiqueAnalyse des VulnérabilitésAnalyse de CodeExploitationExploitation d'Applications WebTests d'IntrusionApprentissage et ÉducationDéveloppement de Charges UtilesLabs et PratiqueArchived
GitHubaipeacs/sc3010-computer-security

SC3010-Computer-Security

il y a 3 moisPas 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

Utilisation de Struts2 et PowerShell pour recréer la vulnérabilité d'injection OGNL CVE-2017-5638.

Voir le dépôt

SC3010-Computer-Security — Recréation de l'attaque CVE-2017-5638

Ce dépôt fait partie du projet du cours de sécurité informatique SC3010.
Il recrée CVE-2017-5638, une vulnérabilité critique d'exécution de code à distance dans Apache Struts 2 (versions 2.3.5–2.3.31 et 2.5–2.5.10), tristement célèbre pour avoir été exploitée lors de la violation de données Equifax en 2017 pour exfiltrer les données personnelles d'environ 147 millions de personnes.

La vulnérabilité provient d'un unique défaut de conception : lorsque Apache Struts échoue à analyser une requête de téléversement multipart/form-data, il construit un message d'erreur en intégrant l'en-tête Content-Type brut — sans le nettoyer — dans une chaîne qui est ensuite passée à l'évaluateur d'expressions OGNL. Un attaquant qui place une expression OGNL dans l'en-tête Content-Type la fait donc exécuter côté serveur en tant qu'utilisateur du processus Tomcat.

Ce dépôt contient :

  • Un serveur Java/Maven vulnérable fonctionnel (Struts2 2.3.28) avec un point de terminaison de téléversement de fichiers.
  • Un script d'exploitation PowerShell qui démontre la chaîne complète d'injection → RCE.
  • Des fichiers source de référence annotés d'Apache Struts 2.3.28 cartographiant chaque étape de la chaîne d'appels.

Connaissances de base

  • Comment fonctionne l'injection OGNL ?

Structure du dépôt

root@kitploit:~
SC3010-Computer-Security/
├── simulation/
│   ├── backend/          # Vulnerable Apache Struts2 2.3.28 server (Java/Maven)
│   └── attack-script/    # Exploit script for CVE-2017-5638
│       └── exploit_cve_2017_5638.ps1   # PowerShell (cross-platform)
├── struts-src-code/          # Apache Struts2 reference source + legal notices
│   ├── licenses/             # LICENSE, NOTICE, and component licenses
│   └── src/
│       ├── struts2-core/     # Request pipeline classes + vulnerable JakartaMultiPartRequest
│       ├── xwork2/           # ActionContext.java, OgnlUtil.java
│       └── ognl/             # OgnlContext.java
├── diagrams/                 # State-machine + sequence diagrams, annotated OGNL payload
└── _notes/                   # Background reading

Simulation d'exploitation

  • Voir simulation/README.md pour les instructions d'installation et d'utilisation.

Diagramme de machine d'état de l'attaque

Le diagramme ci-dessous montre chaque branche de décision dans le pipeline de requêtes Struts2. Le chemin rouge est celui que l'attaquant force ; les branches grises → ... sont des chemins sûrs qui ne s'appliquent pas lors de l'exploitation.

root@kitploit:~
flowchart TD
    Start([Attacker sends HTTP POST /upload.action<br/>Content-Type: &#37;&#123;OGNL_PAYLOAD&#125;.multipart/form-data])
    Start --> PIPE

    PIPE["<b>Struts2 filter → wrap → parse pipeline</b><br/>doFilter() → PrepareOperations.wrapRequest()<br/>→ Dispatcher.wrapRequest() → new MultiPartRequestWrapper()"]
    PIPE --> D_CT{"Content-Type contains<br/>&quot;multipart/form-data&quot;?"}
    D_CT -- "No → normal request ..." --> OUT_NORM([non-upload path ...])
    D_CT -- "Yes (attacker appends<br/>.multipart/form-data to payload)" --> PARSE

    PARSE[/"<b>JakartaMultiPartRequest.parse()</b><br/>→ Commons FileUpload.parseRequest()"/]
    PARSE --> D_VALID{"FileUpload can parse<br/>Content-Type?"}
    D_VALID -- "Yes → normal file upload ..." --> OUT_OK([files extracted, action executes ...])
    D_VALID -- "No — malformed Content-Type<br/>throws InvalidContentTypeException<br/>(message = raw Content-Type string)" --> CATCH

    CATCH["parse() catch block<br/>calls buildErrorMessage(e, &#123;&#125;)"]
    CATCH --> FIND

    FIND[/"<b>buildErrorMessage()</b><br/>→ LocalizedTextUtil.findText(class, errorKey, locale, e.getMessage(), args)"/]
    FIND --> D_KEY{"Resource bundle has key<br/>struts.messages.upload.error.*?"}
    D_KEY -- "Yes → safe localised message ..." --> OUT_SAFE([error displayed safely ...])
    D_KEY -- "No — falls back to<br/>e.getMessage() as the default<br/>(attacker's raw Content-Type)" --> TRANSLATE

    TRANSLATE["TextParseUtil.translateVariables()<br/>scans string for &#37;&#123;...&#125; expressions"]
    TRANSLATE --> D_OGNL{"String contains<br/>&#37;&#123;...&#125; OGNL expression?"}
    D_OGNL -- "No → plain error string ..." --> OUT_PLAIN([safe error message ...])
    D_OGNL -- "Yes — evaluates OGNL<br/>inside attacker content" --> SANDBOX

    SANDBOX[/"<b>OGNL sandbox bypass</b><br/>#ognlUtil.getExcludedClasses().clear()<br/>#ognlUtil.getExcludedPackageNames().clear()"/]
    SANDBOX --> ACCESS

    ACCESS[/"<b>Unrestricted reflection</b><br/>#context.setMemberAccess(DEFAULT_MEMBER_ACCESS)"/]
    ACCESS --> RCE

    RCE[/"<b>RCE</b><br/>Runtime.getRuntime().exec(cmd)"/]
    RCE --> Done([Command executed as Tomcat process user])

    style Start fill:#d32f2f,color:#fff
    style Done fill:#d32f2f,color:#fff
    style OUT_NORM fill:#9e9e9e,color:#fff
    style OUT_OK fill:#9e9e9e,color:#fff
    style OUT_SAFE fill:#9e9e9e,color:#fff
    style OUT_PLAIN fill:#9e9e9e,color:#fff
    style SANDBOX fill:#b71c1c,color:#fff
    style ACCESS fill:#b71c1c,color:#fff
    style RCE fill:#b71c1c,color:#fff
    style CATCH fill:#e65100,color:#fff
    style TRANSLATE fill:#e65100,color:#fff

Pour la machine d'état complète avec les explications des branches, voir diagrams/cve-2017-5638-state-machine.md.
Pour une vue en diagramme de séquence et une analyse annotée de la charge utile OGNL, voir diagrams/cve-2017-5638-attack-chain.md.


Avis sur les logiciels tiers

Ce dépôt reproduit des parties du code source d'Apache Struts 2.3.28 à des fins de recherche académique en sécurité.

Apache Struts est Copyright © 2000–2016 The Apache Software Foundation.
Sous licence Apache License, Version 2.0.
Une copie de la licence est disponible à struts-src-code/licenses/LICENSE.txt.
L'avis d'attribution complet requis par la licence Apache se trouve dans struts-src-code/licenses/NOTICE.txt.

Apache Struts 2 intègre des composants tiers supplémentaires, chacun régi par sa propre licence :

ComposantFichier de licence

Références sources :

  • apache/struts @ STRUTS_2_3_28 — Cœur de Struts2 et XWork
  • jkuhnert/ognl — OGNL 3.0.x
  • Gemini — Consultation sur les langages OGNL généraux.
Télécharger l’outil
OGNL (Bibliothèque de navigation dans les graphes d'objets)struts-src-code/licenses/OGNL-LICENSE.txt
XWorkstruts-src-code/licenses/XWORK-LICENSE.txt
FreeMarkerstruts-src-code/licenses/FREEMARKER-LICENSE.txt