2017-01-08 4 views
0

Ich bemerkte, dass PHP Imagick die IDAT-Chunks bei der Verarbeitung von PNGs ändert. Wie genau wird das gemacht? Gibt es eine Möglichkeit, IDAT-Chunks zu erstellen, die unverändert bleiben? Ist es möglich, das Ergebnis von Imagick vorherzusagen?PHP Imagick Neuinterpretation von PNG IDAT Chunks

Hintergrundinformationen auf diese Fragen: fragte ich mich, ob der Code folgenden (Teil eines PHP-Datei-Upload) kann versteckt PHP-Code verhindern (zB webshells) in PNGs:

$image = new Imagick('uploaded_file.png'); 
$image->stripImage(); 
$image->writeImage('secure_file.png'); 

Kommentare entkleidet aus Die einzige Möglichkeit, diesen Filter zu umgehen, ist das Verbergen der PHP-Nutzdaten in den IDAT-Blöcken. Wie beschrieben here, ist es theoretisch möglich, aber Imagick interpretiert diese Bilddaten irgendwie neu, selbst wenn ich Compression und CompressionQuality auf die Werte setze, die ich verwendet habe, um das PNG zu erstellen. Es ist mir auch gelungen, ein PNG zu erstellen, dessen ZLIB-Header von Imagick unverändert geblieben ist, aber die rohen komprimierten Bilddaten nicht. Die einzigen PNGs, bei denen ich identische Ein- und Ausgaben habe, sind diejenigen, die vorher Imagick durchlaufen haben. Ich habe auch versucht, den Grund dafür in der source code zu finden, konnte es aber nicht finden.

Ich bin mir der Tatsache bewusst, dass andere Überprüfungen notwendig sind, um sicherzustellen, dass die hochgeladene Datei tatsächlich ein PNG usw. ist und PHP-Code in PNGs kein Problem ist, wenn der Server richtig konfiguriert ist, aber jetzt bin ich nur interessiert in dieser Angelegenheit.

Antwort

1

IDAT-Chunks können variieren und trotzdem ein identisches Bild erzeugen. Die PNG-Spezifikation zwingt die IDAT-Chunks unglücklicherweise dazu, einen einzigen kontinuierlichen Datenstrom zu bilden. Das bedeutet, dass die Daten unterschiedlich gruppiert/chunked werden können, aber wenn sie zu einem einzelnen Stream zusammengefügt werden, sind sie identisch. Sind die tatsächlichen Daten unterschiedlich oder wird nur das "Chunking" geändert? Wenn später, warum ist es wichtig, ob das Bild identisch ist? PNG ist eine verlustfreie Art der Komprimierung, wobei die Metadaten entfernt werden und sogar das Dekomprimieren + erneute Komprimieren eines Bilds sollte keine Pixelwerte ändern.

Wenn Sie die komprimierten Daten vergleichen und erwarten, dass sie identisch sind, kann es sich unterscheiden und trotzdem ein identisches Bild ergeben. Dies liegt daran, dass die FLATE-Komprimierung einen iterativen Prozess verwendet, um die besten Übereinstimmungen in früheren Daten zu finden. Je höher die von Ihnen angegebene "Qualitäts" -Nummer ist, desto mehr wird nach Übereinstimmungen gesucht und die Ausgabedatengröße verkleinert. Mit zlib dauert eine Deflate-Anforderung der Ebene 9 viel länger als die Standardeinstellung und führt zu einer etwas kleineren Ausgabedatengröße.

So, beantworten Sie bitte die folgenden Fragen:

1) Versuchen Sie, die komprimierten Daten vor/nach dem Streifen Betrieb zu sehen, ob irgendwie das Bild geändert zu vergleichen? Wenn das der Fall ist, dann ist das Betrachten der komprimierten Daten nicht der richtige Weg.

2) Wenn Sie Metadaten entfernen möchten, ohne dass sich ein anderer Aspekt der Bilddatei ändert, müssen Sie das Werkzeug selbst schreiben. Es ist eigentlich trivial, durch PNG-Chunks zu gehen und eine neue Datei zusammenzufügen, während die Chunks übersprungen werden, die Sie entfernen möchten.

meine Fragen beantworten, und ich werde meine Antwort mit mehr Details ...

+0

Danke für Ihre Antwort. 1) Die Strip-Operation selbst ändert die IDAT-Chunks nicht, sondern entfernt nur TEXT-Chunks usw. Es ist der Imagick-Konstruktor, der die Eingabedatei korrekt faltet (da die tatsächlichen Pixeldaten unverändert bleiben), aber andere Parameter verwendet, um sie wieder zu entlüften (um die Ausgabedatei zu schreiben). Ich wollte wissen, welche Parameter hier verwendet werden (z. B. welche Komprimierungsstufe, welcher Protokollpuffer (oder Fenstergröße) und welche Komprimierungsstrategie), um ein PNG zu generieren, das genau die gleichen binären Daten (zumindest in dem IDAT-Chunk) hat behandelt von Imagick. – user7390973

+0

Wenn ImageMagick zum Erstellen der Originaldatei verwendet wurde, haben Sie möglicherweise eine Chance. Wenn ein anderes Tool verwendet wurde, können Sie möglicherweise keine identische PNG-Datei erstellen. Wenn Sie nur die Metadaten entfernen, ist das Dekomprimieren und erneute Komprimieren des Abbilds eine schreckliche Verschwendung von CPU-Zeit. Noch schlimmer ist, dass ImageMagick im Allgemeinen eine sehr langsame Reihe von Funktionen hat. Es gibt keine Möglichkeit, auf alle diese Parameter zuzugreifen. IM verwendet zlib und einen einzelnen Parameter (Komprimierungsstufe), um seine Flate-Daten zu generieren. – BitBank

+0

2) Es ist nicht meine Absicht, ein Werkzeug zu finden (oder zu schreiben), das das kann, eigentlich suche ich das Gegenteil. Ich habe genau das gleiche mit GD gemacht, also weiß ich, dass es in diesem Punkt nicht "sicher" ist (obwohl es andere Schwachstellen geben muss, um ein solches PNG in einem Exploit zu verwenden). Aber nur die Tatsache, dass ich mit Imagick nicht dasselbe machen konnte, beweist nicht, dass es unmöglich ist. Also habe ich diese Frage gestellt, um zu klären, ob es theoretisch möglich ist oder nicht. – user7390973

0

ich, ob der Code folgenden gewundert aktualisieren (Teil einer Upload-PHP-Datei) versteckt PHP-Code verhindern (zB webshells) in PNGs

Sie sollten nie darüber nachdenken müssen. Wenn Sie sich Sorgen machen, dass Personen Webshells in einer Datei verstecken, die auf Ihren Server hochgeladen wird, tun Sie etwas falsch.

Zum Beispiel die Bereitstellung dieser Dateien über den PHP-Parser .... auf diese Weise könnte eine Webshell aufgerufen werden, um einen Server anzugreifen.

Von der Imagick Readme-Datei:

5) dienen nie direkt alle Dateien, die von den Benutzern direkt über PHP hochgeladen wurden, anstatt entweder dienen sie durch den Webserver, ohne PHP aufruft, oder ReadFile- verwenden zu dienen sie in PHP.

readfile nicht ausgeführt die Datei, sendet es nur an den Endverbraucher ohne es aufgerufen wird, und so verhindert vollständig die Art des Angriffs Sie scheinen zu besorgt zu sein.

+0

Ja, ich stimme Ihnen vollkommen zu. Das wollte ich mit meinem letzten Absatz implizieren. Dennoch habe ich ein theoretisches Interesse an diesem Thema (praktische Anwendungen könnten CTFs und Sicherheitstests sein). – user7390973