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.
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
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
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