Es ist nicht neu – und auch nicht schwer – eine SQL–Injektion im Prinzip durchzuführen. Es war nur eine Frage der Zeit bis das auch vollautomatisch und kostenfrei mit einem Tool funktioniert. Hier z.B. Havij in der Version 1.5 macht soetwas – ganz illegal. Dazu muss man nur einmal die Ziel-URL eingeben, der Rest funktioniert fast von selbst…
Im Protokoll des Servers sieht das dann ungefähr so aus:
GET /kontakte.php?open=anzeige&id=999999.9+union+all+select+0x31303235343830303536-- HTTP/1.1" 200 14022 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) Havij"
GET /kontakte.php?open=anzeige&id=999999.9+union+all+select+0x31303235343830303536%2C0x31303235343830303536%2C0x31303235343830303536-- HTTP/1.1" 200 14013 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) Havij"
Zur Abwehr würde ich Parameter in die SQL-Statements setzten und ordentlich Prüfen. Für den Notfall um schnelle Abhilfe zu schaffen würde ich dem Angreifer global auf die Pelle rücken:
Zum Glück gibt sich der User – Agent zu erkennen mit “Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) Havij”. “Havij” lässt sich ja Abfangen.
Es lässt sich auch in PHP der Get-String des HTTP-Requests mit $_GET abfragen, in dort kann mal auf verdächtige Textteile Prüfen, z.B. auf “union” oder “0x313032” oder “concat”.
Zum Glück gibt sich der User – Agent zu erkennen mit “Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) Havij”. “Havij” lässt sich ja Abfangen.
Es lässt sich auch in PHP der Get-String des HTTP-Requests mit $_GET abfragen, in dort kann mal auf verdächtige Textteile Prüfen, z.B. auf “union” oder “0x313032” oder “concat”.
Im Quellcode sieht der Abwehr – Hack dann ungefähr so aus:
$isHavij=0;
foreach (getallheaders() as $name => $value) {
// echo "$name: $value\n";
if (strpos($value,'Havij') !== false) {
$isHavij=1;
}
}
foreach ($_GET as $name => $value)
{
//echo "$name: $value\n";
if (strpos($value,'0x31303235343830303536') !== false) {
$isHavij=1;
}
if (strpos($value,'CONCAT(0x7e,0x27,') !== false) {
$isHavij=1;
}
}
if ($isHavij>0)
sleep(10000); // Warten 10000 Sekunden > 2 Stunden
}
Um dem lästigen Besucher den Spaß zu verderben würde ich ein sleep(10000) einfügen, und mir vorher eine Mail mit dem kompletten Request und Context zusenden. Der Angreifer bricht meist ab, mehr als 2 Stunden für einen Request sind dann doch zu viel des Guten
Keine Kommentare:
Kommentar veröffentlichen