[PYTHON] Vielleicht habe ich die Auswirkungen von Shell Shock auf CGI überschätzt

Aufgrund einer Bash-Sicherheitsanfälligkeit (CVE-2014-6271 usw.) werden die vom Browser gesendeten Daten wie UserAgent bei Verwendung einer Programmiersprachenfunktion, die Betriebssystembefehle wie die Systemfunktion von Perl oder Ruby CGI ausführt, zu einer Umgebungsvariablen. Es wurde darüber gesprochen, dass Bash im gespeicherten Zustand beginnt und ShellShock auftritt. Ist das wirklich der Fall?

Experiment

Experimente wurden mit dem folgenden Verarbeitungssystem durchgeführt.

Code

CGI, das nur den Betriebssystembefehl "env" aufruft und anzeigt.

Perl

#!/usr/bin/env perl

print "Content-Type: text/html;\n\n";
print system('env');

Ruby

#!/usr/bin/env ruby

print "Content-Type: text/html;\n\n"
print system('env')

PHP

#!/usr/bin/env php

<?php
	print system('env');
?>

Python3

#!/usr/bin/env python3

import subprocess

print("Content-Type: text/html;\n")
print(subprocess.check_output('env'))

Anfrage

Anfrage generiert von curl. -A ist eine Option zur Angabe von UserAgent.

$ curl -A '() { :; }; echo Hello!' localhost/index_xxx.cgi

Ergebnis

Alle haben UserAgent als Umgebungsvariable übergeben, aber nur PHP hat "echo Hello!" Ausgeführt.

$ curl -A '() { :; }; echo Hello!' localhost/index_php.cgi
Hello!
SERVER_SIGNATURE=
SERVER_PORT=80
HTTP_HOST=localhost
DOCUMENT_ROOT=/Library/WebServer/Documents
SCRIPT_FILENAME=/Library/WebServer/Documents/index_php.cgi
REQUEST_URI=/index_php.cgi
SCRIPT_NAME=/index_php.cgi
__CF_USER_TEXT_ENCODING=0x46:0:0
REMOTE_PORT=50129
PATH=************
PWD=/Library/WebServer/Documents
[email protected]
HTTP_ACCEPT=*/*
REMOTE_ADDR=::1
SHLVL=1
SERVER_NAME=localhost
SERVER_SOFTWARE=Apache/2.2.26 (Unix) DAV/2 mod_ssl/2.2.26 OpenSSL/0.9.8za
QUERY_STRING=
SERVER_ADDR=::1
GATEWAY_INTERFACE=CGI/1.1
SERVER_PROTOCOL=HTTP/1.1
REQUEST_METHOD=GET
HTTP_USER_AGENT=() {  :
}
_=/usr/bin/env
_=/usr/bin/env%

Warum

Zunächst führen Perl und Ruby Befehle mithilfe von Systemaufrufen aus, ohne die Shell zu durchlaufen, wenn der Befehl keine Shell-Metazeichen enthält. Für Python wird die Shell erst gestartet, wenn shell = True hinzugefügt wurde. Da die Shell nicht gestartet wird, ist sie von ShellShock nicht betroffen.

PHP scheint die Shell wie gewohnt zu starten.

Fazit

Selbst wenn Sie für andere Programme als PHP eine Funktion verwenden, die Betriebssystembefehle wie "system" ausführt, wird die Shell anscheinend nicht immer aufgerufen. Selbst wenn Sie eine Funktion wie "System" verwenden, ist sie meiner Meinung nach nicht immer von ShellShock betroffen.

Recommended Posts

Vielleicht habe ich die Auswirkungen von Shell Shock auf CGI überschätzt
[Python] Ich habe die Route des Taifuns mit Folium auf die Karte geschrieben
Ich habe den Mechanismus der Flaschenanmeldung untersucht!
Ich habe mit Kaggle Start Book basierend auf Kaggle studiert [Teil 1]
Ich habe das Bild der Science University auf Twitter mit Word2Vec überprüft.
Ich habe versucht, die Wartezeit der Ausführungswarteschlange eines Prozesses unter Linux zu messen
Ich habe den Inhalt des Docker-Volumes überprüft
Ich habe den asynchronen Server von Django 3.0 ausprobiert
Ich habe die Optionen von copyMakeBorder von OpenCV überprüft
Untersuchen Sie die Auswirkung von Ausreißern auf die Korrelation
Die Ordnerstruktur von Flask ist zusammengefasst
Ich bin auf die Hatena Keyword API gestoßen
Veröffentlichen Sie das Thema Google Mail auf Twitter
Ich kannte die Grundlagen von Python nicht
Zeigen Sie das Diagramm von tensorBoard auf jupyter an
Die Python-Projektvorlage, an die ich denke.
Ändern Sie die Reihenfolge von PostgreSQL in Heroku
Ich möchte Python in der Umgebung von pyenv + pipenv unter Windows 10 verwenden
Ich habe Pygame mit Python 3.5.1 in der Umgebung von pyenv unter OS X installiert
Ich habe Ruina von RPG Tsukuru 2000 ~ Die Geschichte der verlassenen Stadt ~ auf Raspberry Pi gespielt
Ich habe versucht, Objekte mit YOLO v3 (TensorFlow 2.1) auf der GPU von Windows zu erkennen!
Ich habe versucht, die Daten des Laptops durch Booten unter Ubuntu zu retten
Ich habe versucht, den Grad der Koronavirusinfektion auf der Seekarten-Wärmekarte anzuzeigen
Ich habe die Pivot-Table-Funktion von Pandas ausprobiert
Ich habe versucht, die Wetterkarte einer Clusteranalyse zu unterziehen
Ich habe die Implementierung von range gelesen (Objects / rangeobject.c)
Ich habe das tiefste Problem von Hiroshi Yuki gelöst.
Das Verhalten von signal () hängt von der Kompilierungsoption ab
[2020Juli] Überprüfen Sie die UDID des iPad unter Linux
Verwenden Sie die neueste Version von PyCharm unter Ubuntu
Ich habe die Liste der Tastenkombinationen von Jupyter überprüft
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Probieren Sie Progate Free Edition [Python I]
Ich habe die Sitzungsaufbewahrungsdauer von Django überprüft
Ich habe die Verarbeitungsgeschwindigkeit der numpy eindimensionalisierung überprüft
Ich habe einige der neuen Funktionen von Python 3.8 touched angesprochen
Berechnen Sie die Wahrscheinlichkeit von Ausreißern auf den Box-Whiskern
Ich habe das neuronale Netzwerk auf dem eigentlichen FPGA betrieben
Zum Zeitpunkt des Python-Updates mit Ubuntu
Ändern Sie die Auflösung von Ubuntu, das auf VirtualBox ausgeführt wird
Ich habe die Varianten von UKR gelesen und implementiert
Ich möchte das Erscheinungsbild von zabbix anpassen
Ich habe versucht, den Bildfilter von OpenCV zu verwenden
Ich habe versucht, mit tkinter mit dem Taschenrechner zu spielen
[AWS S3] Bestätigung des Vorhandenseins von Ordnern in S3
Ich habe ein wenig über die Klasse recherchiert
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
[Beispiel für eine Python-Verbesserung] In 2 Wochen wurden die Grundlagen von Python auf einer kostenlosen Website erlernt
Ich habe die Oberfläche des Krankenhaus-Dashboards erstellt, die klinische Daten auf der Webseite anzeigt.
Ich möchte die Standortinformationen von GTFS Realtime auf Jupyter zeichnen! (Mit Ballon)
Ich möchte einen Screenshot der Site in Docker mit einer beliebigen Schriftart erstellen
Ich habe versucht, es einfach zu machen, die Einstellung des authentifizierten Proxys auf Jupyter zu ändern