|
| Undgå SQL injections? Fra : John |
Dato : 13-06-08 17:58 |
|
Det er så småt ved at gå op for mig, at jeg sikkert ikke har tænkt nok over
dette på min webside, men jeg er heller ikke sikker på i hvor stort et
omfang det er et problem for mig.
Kan man lave SQL injections i et VARCHAR MySQL felt eller er det kun
nummériske felter der er sårbare?
F.eks. kan jeg ikke se problemet i, at en hacker skriver "username; drop
table users" som login navn i en login form. Selvfølgelig kunne jeg kigge på
om der er specialtegn i loginnavnet, men hvorfor skulle jeg? Det ville
naturligvis være meget smart, at validére alle input således, at de manks
kan være f.eks. 100 tegn lang (lidt substr), så man ikke nemt kan lave noget
overflow.
Og hvad gør man i de tilfælde, hvor man har et MySQL text felt, hvor der kan
stå alt muligt i - hvordan validéres det?
| |
Stig Johansen (13-06-2008)
| Kommentar Fra : Stig Johansen |
Dato : 13-06-08 19:07 |
|
John wrote:
> F.eks. kan jeg ikke se problemet i, at en hacker skriver "username; drop
> table users" som login navn i en login form.
Den dag du skifter DB, eller mySQL understøtter det, kan du muligvis få et
problem.
Generelt bør man altid bruge paramaterized, eller prepared queries, som det
også kaldes, så er dén ged barberet.
Uden at kende særlig meget til PHP, tror jeg nok man kalder det
'placeholders' der.
--
Med venlig hilsen
Stig Johansen
| |
John (13-06-2008)
| Kommentar Fra : John |
Dato : 13-06-08 20:45 |
|
>> F.eks. kan jeg ikke se problemet i, at en hacker skriver "username; drop
>> table users" som login navn i en login form.
>
> Den dag du skifter DB, eller mySQL understøtter det, kan du muligvis få et
> problem.
Det anser jeg nu ikke som et problem på min lille webside, da jeg (hvis jeg
skifter DB) helt sikkert også vil skulle genskrive min kode. Det er så
selvfølgelig pga. dårlig genbrugbar kode fra min side men mon ikke det er
sådan de fleste gør det? På et stort firma site er det naturligvis en anden
sag, hvor man nok godt kan finde på at skifte DB.
> Generelt bør man altid bruge paramaterized, eller prepared queries, som
> det
> også kaldes, så er dén ged barberet.
> Uden at kende særlig meget til PHP, tror jeg nok man kalder det
> 'placeholders' der.
Ikke helt forstået - hvad går det ud på?
| |
Christen Fihl (13-06-2008)
| Kommentar Fra : Christen Fihl |
Dato : 13-06-08 22:46 |
|
Et eksempel
Antag du validerer login med
select * from Users where Name=" <fld1> " and password=" <fld2> "
hvor <fld1> og <fld2> kommer fra formen
Hvis jeg nu skriver
<fld1> som Kurt" or 1=1 --
<fld2> som xxx
så får du et udtryk der nu er
select * from Users where Name="Kurt" or 1=1 --" and password="xxx"
og det giver ret så mange rækker når -- (en kommentar) fjerner en del af
betingelserne
Hvis du som Stig skriver pakker det pænt ind, da bliver " lavet om til
"" og andet godt
select * from Users where Name="Kurt"" or 1=1 --" and password="xxx"
Så nu er navnet alt herefter på linien: Kurt"" or 1=1 --
Christen Fihl
| |
John (13-06-2008)
| Kommentar Fra : John |
Dato : 13-06-08 23:32 |
|
> Antag du validerer login med
> select * from Users where Name=" <fld1> " and password=" <fld2> "
> hvor <fld1> og <fld2> kommer fra formen
>
> Hvis jeg nu skriver
> <fld1> som Kurt" or 1=1 --
> <fld2> som xxx
>
> så får du et udtryk der nu er
> select * from Users where Name="Kurt" or 1=1 --" and password="xxx"
> og det giver ret så mange rækker når -- (en kommentar) fjerner en del af
> betingelserne
Det får jeg det nu ikke helt til, da din <fld1> stadigt vil blive pakket ind
i ", hvilket skulle give dette resultat:
select * from Users where Name="Kurt" or 1=1 --" and password="xxx"
Selv uden " bliver det til:
select * from Users where Name="Kurt or 1=1 --" and password="xxx"
... hvilket heller ikke giver et uønsket resultat, da det netop altid
afsluttes med ".
> Hvis du som Stig skriver pakker det pænt ind, da bliver " lavet om til ""
> og andet godt
> select * from Users where Name="Kurt"" or 1=1 --" and password="xxx"
> Så nu er navnet alt herefter på linien: Kurt"" or 1=1 --
Det forstår jeg ikke?
| |
Bertel Lund Hansen (13-06-2008)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 13-06-08 23:37 |
|
John skrev:
> Det får jeg det nu ikke helt til, da din <fld1> stadigt vil blive pakket ind
> i ", hvilket skulle give dette resultat:
> select * from Users where Name="Kurt" or 1=1 --" and password="xxx"
Ja, men du ser ikke rigtigt hvad der står.
select * from Users where <én betingelse> or <altid sand>
og efterfølgense står der det tegn der betyder "comment" så
resten af linjen ignoreres - inklusive det anførselstegn der
burde have været det normale sluttegn, men ikke bliver det fordi
man i navnet har inkluderet en anførselstegn.
Der selectes altså alle usere overhovedet.
--
Bertel
http://bertel.lundhansen.dk/ FIDUSO: http://fiduso.dk/
| |
John (14-06-2008)
| Kommentar Fra : John |
Dato : 14-06-08 00:30 |
|
>> Det får jeg det nu ikke helt til, da din <fld1> stadigt vil blive pakket
>> ind
>> i ", hvilket skulle give dette resultat:
>> select * from Users where Name="Kurt" or 1=1 --" and password="xxx"
>
> Ja, men du ser ikke rigtigt hvad der står.
> select * from Users where <én betingelse> or <altid sand>
>
> og efterfølgense står der det tegn der betyder "comment" så
> resten af linjen ignoreres - inklusive det anførselstegn der
> burde have været det normale sluttegn, men ikke bliver det fordi
> man i navnet har inkluderet en anførselstegn.
>
> Der selectes altså alle usere overhovedet.
Jeg forstår skam godt hvad der står og burde ske, men det fungere ikke:
Hvis jeg har følgende SQL fra min db:
SELECT * FROM users WHERE login='kurt' or 1=1 --' AND psw='xxx'
får jeg denne fejl:
#1064 - You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near
'xxx'' at line 1
ERROR: Unclosed quote @ 73
STR: '
| |
Bertel Lund Hansen (14-06-2008)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 14-06-08 00:44 |
|
John skrev:
> Hvis jeg har følgende SQL fra min db:
> SELECT * FROM users WHERE login='kurt' or 1=1 --' AND psw='xxx'
> får jeg denne fejl:
Okay. Er -- da ikke tegnet for en kommentar? Eller tjekker
systemet syntaks også i kommentarer?
--
Bertel
http://bertel.lundhansen.dk/ FIDUSO: http://fiduso.dk/
| |
Stig Johansen (14-06-2008)
| Kommentar Fra : Stig Johansen |
Dato : 14-06-08 06:41 |
|
Bertel Lund Hansen wrote:
> John skrev:
>
>> Hvis jeg har følgende SQL fra min db:
>> SELECT * FROM users WHERE login='kurt' or 1=1 --' AND psw='xxx'
>
>> får jeg denne fejl:
>
> Okay. Er -- da ikke tegnet for en kommentar?
Det er det i MS SQLServer, og der er ';' line terminator, så der bruger
"man" ;--.
Jeg faldt i øvrigt over dette skriv
< http://www.net-security.org/dl/articles/IntegrigyIntrotoSQLInjectionAttacks.pdf>
som efter min mening giver et rimeligt generelt overblik.
--
Med venlig hilsen
Stig Johansen
| |
John (14-06-2008)
| Kommentar Fra : John |
Dato : 14-06-08 17:29 |
|
>>> Hvis jeg har følgende SQL fra min db:
>>> SELECT * FROM users WHERE login='kurt' or 1=1 --' AND psw='xxx'
>>
>>> får jeg denne fejl:
>>
>> Okay. Er -- da ikke tegnet for en kommentar?
>
> Det er det i MS SQLServer, og der er ';' line terminator, så der bruger
> "man" ;--.
>
> Jeg faldt i øvrigt over dette skriv
> < http://www.net-security.org/dl/articles/IntegrigyIntrotoSQLInjectionAttacks.pdf>
> som efter min mening giver et rimeligt generelt overblik.
Så tilbage til mit spørgsmål - hvad er faren i det med et text felt i MySQL?
| |
Stig Johansen (14-06-2008)
| Kommentar Fra : Stig Johansen |
Dato : 14-06-08 18:35 |
| | |
|
|