This page has been robot translated, sorry for typos if any. Original content here.

Durchführung von SQL-Injection in Oracle



  • [Einleitung]
  • [Eigenschaften Oracle]
  • [Auswahl Spalte]
  • [Definition printabelnyh Spalte]
  • [Gewinnung Informationen]
  • [Tabellen und Spalten]
  • [Kennwort]
  • [Gewinnung Informationen]



  • [Einleitung]


    Vor kurzem wurde die Studie von verschiedenen Web-Projekten für Verwundbarkeit auf SQL-Injection in Oracle stolpert. Obwohl heute selten die Nutzung dieser Datenbank in Web-Programmierung zu finden, aber immer noch passiert es. Alle Studie endet mit einer Entdeckung von Fehlern, was als nächstes war unklar, zu tun. Bei der Suche nach einem Artikel, eine gute Beschreibung der praktischen Aspekte der Ausnutzung dieser Sicherheitsanfälligkeit bei Oracle, wie Artikeln und Bargeld spyder, beschreibt Injektion in MSSQL und der PostgreSQL, konnte nicht gefunden werden.
    Als Ergebnis der Suche gefunden wurde, nur Serie von Artikeln k00p3r, die vollständig kopipastnutyh aus Drittquellen und einfache Übersetzung sind, Interpretation, die nicht eine klare Vorstellung von Holding Jaulen bei Oracle gegeben hat, seit Artikel in der Tat ein großes Volumen, ist in der Natur theoretisch und vor allem Wasser enthält.
    Am Ende hatte das Institut die Fähigkeiten der Zusammenarbeit mit Oracle und wieder las eine Reihe von verstreuten Informationen über das Internet zu erinnern. In diesem Artikel möchte ich mit Ihnen, wie die Tatsache teilen, die ich für die SQL-Injection in Oracle zu graben verwaltet und versuchen Sie es zu einem kombinieren.
    Nun, versuchen, die Lücke, und eine Reihe von Artikeln zu füllen Bargeld und spyder zu ergänzen.

    [Eigenschaften Oracle]


    Zuerst haben wir einige Eigenschaften geben, die berücksichtigt bei der Injektion in Oracle getroffen werden müssen. Nur möchte ich erwähnen, dass der Artikel mit der Durchführung von Injektionen in einer SELECT-Anweisung behandelt. Während Injektionen in INSERT Durchführung, UPDATE und DELETE, ist es auch möglich.
    Es ist auch wichtig, auch die Tatsache, dass die Artikel befasst sich mit der Injektion in SQL Oracle-Abfragen, aber nicht in PL / SQL Oracle-Prozeduren. in PL / SQL-Prozeduren, ist Injektionen signifikanter Unterschied die Fähigkeit Abfrage Separator zu verwenden - ein Semikolon „;“. Aber darüber IMHO müssen Sie mit einer Beschreibung der Auswirkungen einen eigenen Artikel schreiben. Vor allem, da der Autor glaubt, dass Web-Anwendungen sind am häufigsten Injektion ist in SQL-Abfragen (zumindest war ich nur mit solchen konfrontiert).
    Bei Oracle, sowie in MySQL und der PostgreSQL, wird die Injektion durch die Verwendung des UNION Operator durchgeführt, dh mit Zeichnung zwei Anfragen Kombination (- Unterabfrage Begriff im folgenden zum besseren Verständnis verwendet). Aber zusätzlich die Anzahl der Spalten in der Hauptabfrage übereinstimmen und die Unterabfrage muss berücksichtigt werden, dass Oracle nicht automatisch in einer Unterabfrage Typen werfen. Daher müssen die Auswahl der Spalten null zu ersetzen, im Gegensatz zum Beispiel MySQL.
    Es ist auch sehr wichtig ist, dass alle SELECT-Abfragen von einigen der Tabelle vorgenommen werden sollten, dh Abfragesyntax muss immer das Wort FROM und die Tabellennamen. Für einfache arithmetische oder andere Operationen, die in Oracle nicht reale Tabelle benötigen gibt es eine Pseudo-Tabelle SYS.DUAL.
    Ein wichtiges Merkmal ist das Fehlen einer LIMIT-Klausel.
    „-“ (zwei Striche) und „/ *“ (Schrägstrich und Sternchen) in SQL Oracle Um eine Abfrage mit Kommentarzeichen gestutzt. Die erste Art der Kommentare -odnostrochny. Der zweite Typ - multi.
    Keine Nutzung der Möglichkeiten für SQL mehr Anfragen Oracle den Separator mit „;“, im Gegensatz zu den Verfahren in PL / SQL.
    Wenn ein Fehler erkannt wird, kann man eindeutig die Oracle, ORA durch das Vorhandensein des Wortes im Text einer Fehlermeldung identifizieren, wie zum Beispiel:

    Macromedia][Oracle JDBC Driver][Oracle]ORA-00933: SQL command not properly ended

    Es ist nicht immer in dem Text des Fehlerwortes Oracle, zum Beispiel,

    Warning: OCIStmtExecute: ORA-01722: invalid number in

    [Auswahl Spalte]


    Lassen Sie den Fehler im Parameter-ID vorhanden ist:

    www.site.com/view.php?id=1'
    Die Bestimmung der Anzahl der Spalten in der Hauptabfrage ist das gleiche wie in MySQL. Da der UNION-Operator die gleiche Anzahl von Spalten in der Hauptabfrage und in der Unterabfrage erfordert, müssen wir die Zahl dieser Spalten bestimmen. Wenn Sie die falschen Spalten in der Unterabfrage Ausgang Standardfehlermeldung an:

    ORA-XXXXX: query block has incorrect number of result columns
    Für die Auswahl der Säule 2 ist ein Verfahren bekannt und auch in dem Artikel beschrieben spyder. Aber ich werde sie wieder bringen, so dass der Leser nicht unter läuft:

    1. Einfache Suche.
    Wir bilden die folgende Abfrage

    www.site.com/view.php?id=-1+union+select+null+from+sys.dual--

    Wenn ein Fehler aufgetreten ist, erhöhen Sie die Anzahl der Spalten auf einer
    www.site.com/view.php?id=-1+union+select+null, null+from+sys.dual--

    und so, bis es kein Fehler.

    2. Mit der ORDER BY - Klausel
    Die zweite Methode ist viel schneller und angenehmer, wenn die Anzahl der Spalten groß genug ist. Wir bilden die folgende Abfrage

    www.site.com/view.php?id=-1+order+by+1--
    wenn es keine Fehler, dann Spalten 1 oder mehr 1

    www.site.com/view.php?id=-1+order+by+99999--
    Wenn eine solche Anfrage sollte eine Fehlermeldung, 99999. Weitere kleiner als die Spalte ist, in der gleichen Weise verengen die ausgewählten Intervallgrenzen auf der linken und rechten Seite, und schließlich die tatsächliche Anzahl der Spalten in der Hauptabfrage bestimmen.

    [Definition printabelnyh Spalte]


    Angenommen, wir die genaue Anzahl der Spalten in der Hauptabfrage festgestellt haben, lassen Sie sie 4.

    www.site.com/view.php?id=-1+union+select+null, null, null, null+from+sys.dual--
    Jetzt müssen wir die Spalten bestimmen, die auf der Seite angezeigt werden. In der Regel in den Ausgabespalten sind mit Datentypen int, char und Daten beteiligt. Es wird genug printabilnyh Spalten mit Typen int, char, und sie werden suchen.
    Wie bereits erwähnt, hat Oracle nicht automatisch wirft eine Unterabfrage. Wenn Sie also in eine Spalte einzufügen versuchen oder den Wert vom falschen Typ, erhalten wir den folgenden Fehlertypenkonflikt

    ORA-XXXXX: expression must have same datatype as corresponding expression
    Als nächstes beginnen wir Anfragen zu machen, abwechselnd jede Spalte zu einem beliebigen Anzahl ersetzen

    www.site.com/view.php?id=-1+union+select+123, null, null, null+from+sys.dual--
    ....
    www.site.com/view.php?id=-1+union+select+null, 123, null, null+from+sys.dual--
    So werden wir printabelnye Spalten mit Typ int identifizieren. In diesem Fall, wenn wir einen Typenkonfliktfehler zu erhalten, können wir die Typkonvertierungsfunktionen to_char (), to_date () verwenden, und printabelnye Spalte Typen char und Daten identifizieren.

    www.site.com/view.php?id=-1+union+select+null, to_char(123), null, null+from+sys.dual--
    Damit bringen to_char function () Syntax:
    to_char (Wert, [format_mask], [NLS_LANGUAGE])

    [Gewinnung Informationen]


    Sobald wir die Anzahl der Spalten sind und welche printabelny kennen, können wir sicher gehen die notwendigen Informationen aus der Datenbank zu erhalten. Nun, wenn wir uns bewusst sind bestimmte Tabellen in den Spalten und in ihnen, während Informationen, die in den Keller zu empfangen. Zum Beispiel, wenn es eine Tabelle USERS mit Spalten ID, LOGIN und das Kennwort ein, die Anforderung für diese Daten wie folgt sein würde,

    www.site.com/view.php?id=-1+union+select+null, login, password, null+from+users+where+id=123--
    Wie auch in MySQL, für eine einfache Anzeige und verschiedene Probleme mit Codierungen überwinden kann die Funktionen concat () verwenden, to_char ().
    Um die Filterung Anführungszeichen oder andere wesentliche Zeichen zu überwinden, gibt es eine Funktion chr ().

    [Tabellen und Spalten]


    Wenn die Benutzertabellen uns unbekannt sind, dann können wir eine Vielzahl von Informationen aus den bekannten systemischen Oracle-Tabellen bekommen.
    Finden Sie den Benutzernamen, unter denen die Schnittstelle und daher Sie, Sie Benutzerfunktionen oder sys.login_user aufrufen

    www.site.com/view.php?id=-1+union+select+null, user, null, null+from+sys.dual--
    Hier finden Sie eine Liste der Sitzungen kann so aussehen: select * from V $ Session

    Von großem Interesse sind SYS.USER_TABLES Tisch und SYS.USER_TAB_COLUMNS, die alle Tabellen enthalten und deren Spalten stehen dem Anwender zur Verfügung. Wir nehmen die Tabellen- und Spaltennamen aus:

    www.site.com/view.php?id=-1+union+select+null, table_name, null, null+from+sys.user_tables--
    www.site.com/view.php?id=-1+union+select+null, column_name, null, null+from+sys.user_tab_columns--
    Also, meiner Meinung nach, zusätzlich zu SYS.USER_TABLES Tabelle table_name, von Interesse sind die folgenden Spalten: tablespace_name, num_rows, freelist_groups.
    Aber leider oben erstellten Abfragen werden uns nur mit einer führen - dem ersten Datensatz der gesamten Tabelle. Es ist ein überwältigender Wunsch Vorteil des Betreibers LIMITS zu nehmen, wie in MySQL oder PostgreSQL. Viel zu jeder Enttäuschung wird dieser Operator nicht an Oracle unterstützt, und darüber hinaus hat keine ordentlichen äquivalent in Form eines anderen Betreibers.
    „Alles ist verloren !!!“ - könnte man sagen.
    „NEIN !!!“ - Ich werde dir antworten.
    Suffer schlecht google, fand ich endlich die Möglichkeit, eine komplexe Abfrage zu machen irgendwie vage die Bedeutung LIMIT Operator Last realisiert. Leider konnten wir nicht seine Fähigkeit, in vollem Umfang wiederherzustellen.

    www.site.com/view.php?id=-1+union+select+null, table_name, null, null+from+sys.user_tables+where+rownum+<=+5--
    Somit können durch unterschiedliche Anzahl der Datensätze in der Probe gehen, können wir alle die Namen der Tabellen zu einem Zeitpunkt, sehen. Die gleiche Speicherstruktur können wir verwenden, wenn SYS.USER_TAB_COLUMNS Tabelle sehen, nach Erhalt aller Spaltennamen für den Benutzer verfügbar.
    Wie in Oracle gibt es ein Konzept des Objekts Präfix (Tabelle ist ein Objekt), die im Titel oder den Namen der Tabelle vorhanden ist:
    ALL_ - alle für den Benutzer verfügbar (der Besitzer kann nicht sein)
    USER_ - Objekte, deren Besitzer ist der Benutzer.
    Daher können wir Ihr Problem vereinfachen und die Namen werden nur die Tabellen erhalten, zu denen wir Zugang haben

    www.site.com/view.php?id=-1+union+select+null, table_name, null, null+from+sys.all_tables
    Interesse kann auch Informationen aus den folgenden Standardtabellen einreichen: SYS.USER_OBJECTS, SYS.USER_VIEWS, SYS.USER_VIEWS, SYS.USER_CATALOG, SYS.USER_TRIGGERS, SYS.TAB.

    [Kennwort]


    Wenn wir Glück und die Benutzer sind, unter denen wir mit der Datenbank arbeiten, hat das Recht sysdba, dann können wir die Hashes aller Datenbankbenutzer erhalten.
    Hauptort des Speicher Passwort-Hash (Hash) - Tabelle Wörterbuch Führung SYS.USER $. Oberhalb dieser Tabelle als Basis-Derivat konstruiert, SYS.DBA_USERS. Wenn das Benutzerprofil PASSWORD_REUSE_TIME aktiviert ist, wird Passwort-Hash auch in SYS.USER_HISTORY $ gespeichert. Holen Sie sich die Hashes und Benutzernamen können so sein

    www.site.com/view.php?id=-1+union+select+null, username, password, null+from+sys.dba_users
    Für Vollständigkeit der Informationen dargestellt ist auch ein Algorithmus für die Passwort-Hash-Berechnung in jedem Fall kann jemand kommen in praktisch:
    1. Für den Benutzernamen wird auf der rechten Seite Text Passwort angebracht.
    2. In der resultierenden Linie erhöht Buchstaben registrieren.
    3. Zeichenketten werden in Zwei-Byte-Format Komplement links Nullwert 0x00 (für ASCII-Zeichen) übersetzt, und die rechte Reihe angehängten Null-Bytes auf die Gesamtlänge 80.
    4. Die sich ergebende Zeichenfolge wird verschlüsselten DES-Algorithmus in dem Geheimtextblock-Verkettungsmodus (CBC) Schlüssel 0x0123456789ABCDEF.
    5. Aus dem letzten Block des Ergebnisses Paritätsbits und die resultierenden Zeichenfolge (56 Bits) entfernt wird, ist für die neue Verschlüsselungs Source-Leitung in der gleichen Art und Weise verwendet.
    6. Der letzte Block des Ergebnisses wird in Hexadezimal-Arithmetik Zeichen übersetzt und erklärt das Endergebnis - die Faltung.