Pour ceux qui avaient commencé le challenge pointé par Nicob[1] (et pour les
autres) il y un message sur bugtraq qui est interressant.
Désolé je suis trop limité en temps pour traduire le message que je reprends
dans son intégralité ci dessous.
Basiquement SQL Serveur quote différement de MySQL ce qui permet du SQL
injection plus facilement quand le programmeur n'a pas fait gaffe.
Petit rappel au passage pour éviter le gag : évitez de trop faire confiance
aux sécurités "intégrées" dans php, perl etc. et effectuez vous même un
parsing des entrées utilisateurs. En plus une fois écrite la fonction est
réutilisable, alors à quoi bon s'en priver?
Eric.
[1] Grrr j'ai bloqué comme un andouille au niveau 3 et j'ai plus des masses
de temps la :)
----- Original Message -----
From: "Martin Sarsale (runa@sytes)" <runa@runa.sytes.net>
To: <bugtraq@securityfocus.com>
Sent: Thursday, December 04, 2003 8:39 PM
Subject: Intresting case of SQL Injection
> Yesterday, we found an interesting case of SQL Injection.
>
> The application was developed under PHP 4.2.1, Apache and MSSQL.
>
> We started our tests by adding a ' (single quote) to the POST info.
>
> Since PHP escapes ' and " , turning the ' into a \' but SQL Server uses 2
> single quotes ('') to escape a quote (') we were allowed to execute our
> code:
>
> select * from users where username='\'; sql code to execute here;--
>
> Then, we wanted to insert a record on the "users" table (fields username
> and password, both varchar).
>
> We found that the application used md5 to store the user passwords but
> there was a problem: since PHP was auto escaping quotes, we couldn't set
> the md5 password as a string because sending:
>
> insert into users values ('username','password');
>
> would be escaped into
>
> insert into users values (\'username\',\'password\');
>
> resulting in a sql error.
>
> So, we had to figure out how to insert the username and password as
> numeric values. Since both fields are varchar, when inserting a number SQL
> server will cast the number into a string.
>
> This is:
> inserting 123 (numeric) into a varchar field is the same as inserting
> '123' (string).
>
> The username part is easy, we could insert '12345' as the username (any
> number will work here), but we found a problem with the password: We need
> a known string which it's md5 hash is ALL NUMERIC.
>
> Then, we coded a simple PHP script and found that md5(1518375) =
> 93240121540327474319550261818423
>
> After that, we sent to the app:
>
> '; insert into users (username,password) values
> (12345,93240121540327474319550261818423);--
>
> which escaped became into:
>
> \'; insert into users (username,password) values
> (12345,93240121540327474319550261818423);--
>
> (valid SQL)
>
> Finally, we logged into the webapp using '12345' as username and '1518375'
> as password.
>
> The main problem here was that developers where trusting in PHP auto
> escaping which worked in MySQL (and probably PostgreSQL) but not in MSSQL.
>
> Alejandro Pomeraniec (apomeraniec at buenosaires.gov.ar)
> Martin Sarsale (msarsale at buenosaires.gov.ar)
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Emmanuel Florac
Dans article <3fd1867f$0$17124$, disait...
Petit rappel au passage pour éviter le gag : évitez de trop faire confiance aux sécurités "intégrées" dans php, perl etc. et effectuez vous même un parsing des entrées utilisateurs. En plus une fois écrite la fonction est réutilisable, alors à quoi bon s'en priver?
Pourquoi? Fondamentalement, qu'est ce que les fonctions intégrées font de plus ou de moins que des trucs genre s/// qui feraient qu'on ne doit pas s'appuyer dessus?
-- Quis, quid, ubi, quibus auxiliis, cur, quomodo, quando?
Dans article <3fd1867f$0$17124$626a54ce@news.free.fr>, news_01@razny.net
disait...
Petit rappel au passage pour éviter le gag : évitez de trop faire confiance
aux sécurités "intégrées" dans php, perl etc. et effectuez vous même un
parsing des entrées utilisateurs. En plus une fois écrite la fonction est
réutilisable, alors à quoi bon s'en priver?
Pourquoi? Fondamentalement, qu'est ce que les fonctions intégrées font de
plus ou de moins que des trucs genre s//\/ qui feraient qu'on ne doit
pas s'appuyer dessus?
--
Quis, quid, ubi, quibus auxiliis, cur, quomodo, quando?
Petit rappel au passage pour éviter le gag : évitez de trop faire confiance aux sécurités "intégrées" dans php, perl etc. et effectuez vous même un parsing des entrées utilisateurs. En plus une fois écrite la fonction est réutilisable, alors à quoi bon s'en priver?
Pourquoi? Fondamentalement, qu'est ce que les fonctions intégrées font de plus ou de moins que des trucs genre s/// qui feraient qu'on ne doit pas s'appuyer dessus?
-- Quis, quid, ubi, quibus auxiliis, cur, quomodo, quando?
Thierry Thomas
Samedi 06 décembre 2003 à 16:52 GMT, Eric Razny a écrit :
Basiquement SQL Serveur quote différement de MySQL ce qui permet du SQL injection plus facilement quand le programmeur n'a pas fait gaffe.
Un autre truc marrant à tester, que MS Sql Serveur a hérité de Sybase, c'est qu'il accepte que plusieurs instructions SQL se suivent sans séparateur.
Ex.: si on a un simple 'Select toto from titi where tata=0', on peut le transformer en 'Select toto from titi where tata=0 delete from titi'. -- Th. Thomas.
Samedi 06 décembre 2003 à 16:52 GMT, Eric Razny a écrit :
Basiquement SQL Serveur quote différement de MySQL ce qui permet du SQL
injection plus facilement quand le programmeur n'a pas fait gaffe.
Un autre truc marrant à tester, que MS Sql Serveur a hérité de Sybase,
c'est qu'il accepte que plusieurs instructions SQL se suivent sans
séparateur.
Ex.: si on a un simple 'Select toto from titi where tata=0', on peut le
transformer en 'Select toto from titi where tata=0 delete from titi'.
--
Th. Thomas.
Samedi 06 décembre 2003 à 16:52 GMT, Eric Razny a écrit :
Basiquement SQL Serveur quote différement de MySQL ce qui permet du SQL injection plus facilement quand le programmeur n'a pas fait gaffe.
Un autre truc marrant à tester, que MS Sql Serveur a hérité de Sybase, c'est qu'il accepte que plusieurs instructions SQL se suivent sans séparateur.
Ex.: si on a un simple 'Select toto from titi where tata=0', on peut le transformer en 'Select toto from titi where tata=0 delete from titi'. -- Th. Thomas.
Eric Razny
"Emmanuel Florac" a écrit dans le message de news:
Dans article <3fd1867f$0$17124$, disait...
Petit rappel au passage pour éviter le gag : évitez de trop faire confiance
aux sécurités "intégrées" dans php, perl etc. et effectuez vous même un parsing des entrées utilisateurs. En plus une fois écrite la fonction est
réutilisable, alors à quoi bon s'en priver?
Pourquoi? Fondamentalement, qu'est ce que les fonctions intégrées font de plus ou de moins que des trucs genre s/// qui feraient qu'on ne doit pas s'appuyer dessus?
Tout simplement parce que certains programmeurs utilisent des "combinaisons de protection" (dans le cas présent php+mysql) qui ne marchent pas quand on change un des composant (et le programmeur ne pense pas que mySQL va devenir PostgreSQL, Oracle, etc. alors que l'utilisation de SQL a justement comme avantage une certaine portabilité -hum, je sais, triggers, tout ça... !- ).
Je suis OK avec toi si on utilise les fonctions du langage dans lequel on écrit pour parser les entrées. J'affirme juste qu'il est plus prudent de le faire complètement que de s'appuyer sur des paramétrages généraux qui peuvent, de plus, virer suite à une (vraiment mauvaise, dans tous les sens du terme) manip.
Et autant produire du code SQL propre avant de le balancer que de se dire que monMachin va finir le nettoyage, non?
Eric.
"Emmanuel Florac" <eflorac@verisign.com> a écrit dans le message de
news:MPG.1a3c836ac1a986a198d25e@news.free.fr...
Dans article <3fd1867f$0$17124$626a54ce@news.free.fr>, news_01@razny.net
disait...
Petit rappel au passage pour éviter le gag : évitez de trop faire
confiance
aux sécurités "intégrées" dans php, perl etc. et effectuez vous même un
parsing des entrées utilisateurs. En plus une fois écrite la fonction
est
réutilisable, alors à quoi bon s'en priver?
Pourquoi? Fondamentalement, qu'est ce que les fonctions intégrées font de
plus ou de moins que des trucs genre s//\/ qui feraient qu'on ne doit
pas s'appuyer dessus?
Tout simplement parce que certains programmeurs utilisent des "combinaisons
de protection" (dans le cas présent php+mysql) qui ne marchent pas quand on
change un des composant (et le programmeur ne pense pas que mySQL va devenir
PostgreSQL, Oracle, etc. alors que l'utilisation de SQL a justement comme
avantage une certaine portabilité -hum, je sais, triggers, tout ça... !- ).
Je suis OK avec toi si on utilise les fonctions du langage dans lequel on
écrit pour parser les entrées. J'affirme juste qu'il est plus prudent de le
faire complètement que de s'appuyer sur des paramétrages généraux qui
peuvent, de plus, virer suite à une (vraiment mauvaise, dans tous les sens
du terme) manip.
Et autant produire du code SQL propre avant de le balancer que de se dire
que monMachin va finir le nettoyage, non?
"Emmanuel Florac" a écrit dans le message de news:
Dans article <3fd1867f$0$17124$, disait...
Petit rappel au passage pour éviter le gag : évitez de trop faire confiance
aux sécurités "intégrées" dans php, perl etc. et effectuez vous même un parsing des entrées utilisateurs. En plus une fois écrite la fonction est
réutilisable, alors à quoi bon s'en priver?
Pourquoi? Fondamentalement, qu'est ce que les fonctions intégrées font de plus ou de moins que des trucs genre s/// qui feraient qu'on ne doit pas s'appuyer dessus?
Tout simplement parce que certains programmeurs utilisent des "combinaisons de protection" (dans le cas présent php+mysql) qui ne marchent pas quand on change un des composant (et le programmeur ne pense pas que mySQL va devenir PostgreSQL, Oracle, etc. alors que l'utilisation de SQL a justement comme avantage une certaine portabilité -hum, je sais, triggers, tout ça... !- ).
Je suis OK avec toi si on utilise les fonctions du langage dans lequel on écrit pour parser les entrées. J'affirme juste qu'il est plus prudent de le faire complètement que de s'appuyer sur des paramétrages généraux qui peuvent, de plus, virer suite à une (vraiment mauvaise, dans tous les sens du terme) manip.
Et autant produire du code SQL propre avant de le balancer que de se dire que monMachin va finir le nettoyage, non?
Eric.
Christophe Garault
Dans le message , Thierry Thomas écrivit...
Ex.: si on a un simple 'Select toto from titi where tata=0', on peut le transformer en 'Select toto from titi where tata=0 delete from titi'.
On pourrait donc exécuter un xp_cmdshell aussi si on a les
droits? Quand on connait le nombre d'applis asp qui utilisent le compte 'sa' j'imagine les dégats que ça pourrait causer! J m'en va tester ça.
-- "Savez-vous à quelle vitesse vous rouliez?" demanda le policier ébahi. "Non," répondit Heisenberg, "mais je sais exactement où je suis!"
Dans le message <slrnbt5nsk.nqs.tthomas@graf.pompo.net>,
Thierry Thomas écrivit...
Ex.: si on a un simple 'Select toto from titi where tata=0', on peut le
transformer en 'Select toto from titi where tata=0 delete from titi'.
On pourrait donc exécuter un xp_cmdshell aussi si on a les
droits? Quand on connait le nombre d'applis asp qui utilisent le compte
'sa' j'imagine les dégats que ça pourrait causer!
J m'en va tester ça.
--
"Savez-vous à quelle vitesse vous rouliez?" demanda le policier ébahi.
"Non," répondit Heisenberg, "mais je sais exactement où je suis!"
Ex.: si on a un simple 'Select toto from titi where tata=0', on peut le transformer en 'Select toto from titi where tata=0 delete from titi'.
On pourrait donc exécuter un xp_cmdshell aussi si on a les
droits? Quand on connait le nombre d'applis asp qui utilisent le compte 'sa' j'imagine les dégats que ça pourrait causer! J m'en va tester ça.
-- "Savez-vous à quelle vitesse vous rouliez?" demanda le policier ébahi. "Non," répondit Heisenberg, "mais je sais exactement où je suis!"
Nicob
On Wed, 10 Dec 2003 18:04:19 +0000, Christophe Garault wrote:
Ex.: si on a un simple 'Select toto from titi where tata=0', on peut le transformer en 'Select toto from titi where tata=0 delete from titi'.
On pourrait donc exécuter un xp_cmdshell aussi si on a les
droits? Quand on connait le nombre d'applis asp qui utilisent le compte 'sa' j'imagine les dégats que ça pourrait causer! J m'en va tester ça.
Je confirme, ça marche même avec un xp_cmdshell, tant que l'appli a les droits suffisants. J'utilise d'ailleurs lors de mes tests d'intrusion un truc comme :
Bien évidemment le "bla'" peut être remplacé par "52", selon les besoins de l'appli sous-jacente. C'est d'ailleurs marrant de rooter des serveurs SQL situés dans leur propre DMZ, injoignables en direct et ne pouvant sortir qu'en UDP/53 :)
Nicob
On Wed, 10 Dec 2003 18:04:19 +0000, Christophe Garault wrote:
Ex.: si on a un simple 'Select toto from titi where tata=0', on peut le
transformer en 'Select toto from titi where tata=0 delete from titi'.
On pourrait donc exécuter un xp_cmdshell aussi si on a les
droits? Quand on connait le nombre d'applis asp qui utilisent le compte
'sa' j'imagine les dégats que ça pourrait causer! J m'en va tester ça.
Je confirme, ça marche même avec un xp_cmdshell, tant que l'appli a les
droits suffisants. J'utilise d'ailleurs lors de mes tests d'intrusion un
truc comme :
Bien évidemment le "bla'" peut être remplacé par "52", selon les
besoins de l'appli sous-jacente. C'est d'ailleurs marrant de rooter des
serveurs SQL situés dans leur propre DMZ, injoignables en direct et ne
pouvant sortir qu'en UDP/53 :)
On Wed, 10 Dec 2003 18:04:19 +0000, Christophe Garault wrote:
Ex.: si on a un simple 'Select toto from titi where tata=0', on peut le transformer en 'Select toto from titi where tata=0 delete from titi'.
On pourrait donc exécuter un xp_cmdshell aussi si on a les
droits? Quand on connait le nombre d'applis asp qui utilisent le compte 'sa' j'imagine les dégats que ça pourrait causer! J m'en va tester ça.
Je confirme, ça marche même avec un xp_cmdshell, tant que l'appli a les droits suffisants. J'utilise d'ailleurs lors de mes tests d'intrusion un truc comme :
Bien évidemment le "bla'" peut être remplacé par "52", selon les besoins de l'appli sous-jacente. C'est d'ailleurs marrant de rooter des serveurs SQL situés dans leur propre DMZ, injoignables en direct et ne pouvant sortir qu'en UDP/53 :)
Nicob
Nicob
On Sat, 06 Dec 2003 16:52:11 +0000, Eric Razny wrote:
Pour ceux qui avaient commencé le challenge pointé par Nicob[1]
J'ai (enfin) mis en ligne une petite doc sur le concours :
http://nicob.net/warsql/
Nicob
On Sat, 06 Dec 2003 16:52:11 +0000, Eric Razny wrote:
Pour ceux qui avaient commencé le challenge pointé par Nicob[1]
J'ai (enfin) mis en ligne une petite doc sur le concours :