2016-04-27 1 views
1

Ich habe einen Webhook geschrieben, um in den Chat (slack/mattrestampi) zu integrieren.Wie man böswillige Injektion in Argument zu PHP "exec" verhindert (Webhook -> Bash-Skript)

Der einfachste Weg, um es zu bekommen und läuft war ein schneller PHP-Skript, das wie folgt aussieht:

<?php 
$token = $_POST["token"]; 
$arg = $_POST["text"]; 

$output = exec("./webhook_script.sh {$token} {$arg}"); 

Wie es aussieht, wird das Skript funktioniert gut, aber ich mache mir Sorgen, dass jemand böswillig eine tun kann http POST, wo der Abfrageparameter text (Skript: $arg) eine Art Injektion Angriff hat.

Beispiel: http://myserver/webhook.php?token=abc&text=123;rm -rf *

So $arg wird 123; rm -rf und die exec Befehle ausführen ein böswilligen rm -rf *

Dies ist ähnlich in der Natur „SQL-Injection“, die ich kenne, mit, aber ich bin nicht sicher, wie um ein Bash-Skript sicher zu machen ...

Ist es eine einfache Sache, die Argumente irgendwie zu zitieren, oder vielleicht mit einem regex, um gegen die Skriptparameter zu überprüfen?

+2

Wenn ich sagen darf, das ist ein schrecklicher Ansatz für eine Produktionsmaschine. Wenn Sie wirklich exec() mit vom Benutzer bereitgestellten Argumenten aufrufen müssen, schlage ich vor, dass Sie eine Whitelist und keine Blacklist anwenden. Welche Argumente erwarten Sie? – Calchas

+0

Das Argument ist eine interne URL. Ich könnte eine Regex auf das Muster anwenden? – vikingsteve

+0

@Calchas oder können Sie eine bessere Möglichkeit vorschlagen, auf einen Web-Hook zu reagieren und ein Bash-Skript zu starten. Die php-Lösung scheint schnell und einfach zu sein, und Michaels Antwort unten zeigt Schritte, um es sicher zu machen. – vikingsteve

Antwort

5

Sie müssen escapeshellarg() für jedes Shell-Argument aufrufen, bevor Sie sie an exec() übergeben. Dadurch wird jedes Argument in einfache Anführungszeichen eingeschlossen und es werden alle vorhandenen einfachen Anführungszeichen entfernt, die solche Angriffe vereiteln.

$token = escapeshellarg($_POST["token"]); 
$arg = escapeshellarg($_POST["text"]);