Avatar billede kimlarsen1978 Nybegynder
02. juni 2015 - 22:59 Der er 25 kommentarer og
1 løsning

SQL injection

Hej
Jeg har "forsøgt" at sikre mig mod QSL injection, men jeg forstår skutte ikke helt hvorfor dette ikke virker.

Jeg har

sLim = "" & trim(request.querystring("lim"))
'Tjek for SQL injection
strSQL = "SELECT * FROM matrix WHERE lim = ? limit 1"
objCommand.Prepared = true
objCommand.ActiveConnection = conn
objCommand.CommandText = strSQL
objCommand.Parameters.Append objCommand.CreateParameter("lim",200,1,50,sLim)
Set rs = objCommand.Execute() 

If (rs.eof) Then
    'ikke godt
    response.redirect "my error page"
end if

Men hvis jeg giver lim som fx "TIM OR 1=1" så accepterer den det. Hvordan får jeg det til at virker så den opfatter hele parameteren som direkte værdi til "lim"????

Tak :)
Avatar billede erikjacobsen Ekspert
02. juni 2015 - 23:10 #1
Classic ASP - det ser man ikke hver dag...

Men det er fint at den accepterer dit input som det står. Type 200 er en VARCHAR, så din strenge med dit giftige 1=1 indsættes som streng. Og det må det godt.

Det du gør svarer til at din SQL bliver:

  SELECT * FROM matrix WHERE lim = 'TIM OR 1=1' limit 1

hvilket ikke er en fejl, eller noget det ligner SQL-injection. Havde du konkateneret det direkte ind i strengen ville nogen med en eller flere '-ere kunnet have begyndt at hacke sig ind.
Avatar billede kimlarsen1978 Nybegynder
02. juni 2015 - 23:14 #2
Ja, men det underligere er at mit result set ikke er tomt når jeg giver den "TIM OR 1=1". Den passere altså if rs.eof then delen - og der findes ingen record i DB'en som indeholder "TIM OR 1=1" i "lim"?
Avatar billede kimlarsen1978 Nybegynder
02. juni 2015 - 23:16 #3
... siden går faktisk i endless loop og timer ud...
Avatar billede kimlarsen1978 Nybegynder
02. juni 2015 - 23:18 #4
jeg ville forvente at den ramte if delen og lavede en redirect til error siden
Avatar billede erikjacobsen Ekspert
02. juni 2015 - 23:23 #5
Så må du jo undersøge hvad dit rs indeholder. Hvad er typen på feltet 'lim' ?
Avatar billede kimlarsen1978 Nybegynder
02. juni 2015 - 23:33 #6
Det er en varchar(50). Jeg kan ikke rigtig undersøge mit rs, for siden timer ud og sender jeg sql direkte på db'en får jeg et tomt rs
Avatar billede kimlarsen1978 Nybegynder
02. juni 2015 - 23:35 #7
Direkte på BD'en:

SELECT * FROM matrix WHERE lim = 'TIM OR 1=1' limit 1

"MySQL returnerede ingen data (fx ingen rækker). (Forespørgsel tog 0.0008 sekunder.)"
Avatar billede kimlarsen1978 Nybegynder
03. juni 2015 - 00:00 #8
giver jeg den "TIM OR 1=2" så er rs tomt og den går til error siden???

Kan man lave en response.write og se den SQL den præcist sender i execute?
Avatar billede arne_v Ekspert
03. juni 2015 - 04:21 #9
Normalt vil SQL faktisk blive sendt til server med ? og parametre sendt separat.
Avatar billede arne_v Ekspert
03. juni 2015 - 04:23 #10
Bare for sjov saa proev:

objCommand.Parameters.Append objCommand.CreateParameter("lim",200,1,50,sLim)

->

objCommand.Parameters.Append objCommand.CreateParameter("@lim",200,1,50,sLim)
Avatar billede kimlarsen1978 Nybegynder
03. juni 2015 - 05:30 #11
Hej, det giver helt samme resultat... det er som om den fortsat konkateneret værdien ind selvom jeg bruger objCommand.Parameters... ???
Avatar billede softspot Forsker
03. juni 2015 - 09:23 #12
Kan man ikke sætte en profiler eller noget trace op på en MySQL. Så kunne du givetvis se, hvad der rent faktisk blev sendt til MySQL. Det er bedre end at gætte... :-)
Avatar billede softspot Forsker
03. juni 2015 - 09:27 #13
Jeg har ingen erfaring med at arbejde med MySQL, men en søgning på Google gav dog bla. et link til dette tool:

http://www.profilesql.com/...

måske det kan bruges?
Avatar billede MADOlsen Forsker
03. juni 2015 - 15:14 #14
Bør

SELECT * FROM matrix WHERE lim = 'TIM OR 1=1' limit 1

ikke være

SELECT * FROM matrix WHERE lim = 'TIM' OR 1=1 limit 1

(bemærk de røde ' )

?
Avatar billede kimlarsen1978 Nybegynder
08. juni 2015 - 18:30 #15
Hej
Nej, ideen med at indsende værdierne som parametre er jo netop at man undgår at SQL bliver bygget op, så man kan sende SQL kommandoer direkte ned i DB'en. Men det er satme underligt at det ikke virker - og det gør det fortsat ikke :(
Avatar billede keysersoze Guru
08. juni 2015 - 19:08 #16
Prøv - bare for spændingens skyld - at benytte navngivne parametre og en struktur som her; http://www.web-dev.dk/post/2008/07/14/SQL-injections-mere-end-bare-et-pling.aspx
Avatar billede kimlarsen1978 Nybegynder
11. juni 2015 - 21:52 #17
Hmmm... når jeg bytter ? ud med @parameternavn, så går den til error page på værdier der er OK, og den går stadig i selsving over OR 1=1

sLim = "" & trim(request.querystring("lim"))
'Tjek for SQL injection
strSQL = "SELECT * FROM matrix WHERE lim = @lim limit 1"
objCommand.Prepared = true
objCommand.ActiveConnection = conn
objCommand.CommandText = strSQL
objCommand.Parameters.Append(objCommand.CreateParameter("@lim", 200, 1, 50, sLim))
Set rs = objCommand.Execute()

If (rs.eof) Then
    'ikke godt
    response.redirect "my error page"
end if
Avatar billede softspot Forsker
11. juni 2015 - 22:12 #18
Prøv evt. at kalde databasen i det lidt forkortede format:

sLim = "" & trim(request.querystring("lim"))
'Tjek for SQL injection
strSQL = "SELECT * FROM matrix WHERE lim = ? limit 1"
objCommand.ActiveConnection = conn
objCommand.CommandText = strSQL
Set rs = objCommand.Execute(, Array(sLim))

If (rs.eof) Then
    'ikke godt
    response.redirect "my error page"
end if

Her sendes parameteren ind i et array der er parameter til Execute-metoden på command-objektet. Typen bestemmes automatisk af ADO, så du slipper for at forholde dig til den eksplicitte oprettelse af parameteren.

I SQL Server ville dette fungere, men jeg ved ikke om ADO-driveren til MySQL er bygget på samme måde og med de samme features, som den til SQL Server. Prøv det! :-)
Avatar billede kimlarsen1978 Nybegynder
11. juni 2015 - 22:26 #19
Det format accepterer den, men det samme fortsætter med at ske. lim=Tim giver 1 hit, lim=Tim jdfhkf giver 0 hits men lim=Tim OR 1=1 så går den i selvsving og timer ud :(
Avatar billede keysersoze Guru
11. juni 2015 - 22:45 #20
Nu er jeg lidt i tvivl - jeg troede det var et SQL Injection problem, men det lyder mere som om det er et timeout-problem? Hvis det er tilfældet kunne det mere lyde som om du får skabt et uendelig loop/redirect eller lignende?
Avatar billede softspot Forsker
11. juni 2015 - 22:49 #21
Det kunne måske være interessant, at se hvilken kode du har efter du har fået returneret rs. Kunne det være en løkke der gennemløber rs, hvor du har glemt at flytte frem i resultatet (rs.movenext)?
Avatar billede kimlarsen1978 Nybegynder
11. juni 2015 - 22:55 #22
Hej, der er ingen loops eller do while eller do until. Det er en helt simpel testside. Men det burde jo også være ligemeget for den skal jo opfatte "tim OR 1=1" som en streng og dermed returnere et tom rs, som bør gå i min IF og gå til error page. Den går jo fint til error page hvis jeg indtastet en hvilken som helst anden ugyldig tekst fx tim OR 1=2 eller tim julemanden er sød. Det er først når der kommer et sandt udtryk ind i billedet fx 1=1
Avatar billede kimlarsen1978 Nybegynder
11. juni 2015 - 22:56 #23
... og desuden er der jo LIMIT 1 på, så den burde under alle omstændigheder kun finde 1 række.
Avatar billede kimlarsen1978 Nybegynder
11. juni 2015 - 22:57 #24
keysersoze -> Jeg vil gerne undgå SQL injection. Derfor bruger jeg parametere i mit kald. Men den acceptere alligevel SQL udtryk som fx OR 1=1. Sådan ser det i hvert fald ud
Avatar billede keysersoze Guru
12. juni 2015 - 09:37 #25
så langt er jeg med og det er også den helt rigtige tilgang - men hvis du ender i en timeout ligger problemet med al sandsynlighed et andet sted.
Avatar billede kimlarsen1978 Nybegynder
15. september 2015 - 07:23 #26
Lukker, fandt aldrig årsagen. Lavede mindre fin løsning på problemet, hvor jeg øverst på siden tjekker efter en række tegn og treds i URL'en, går den ud SAND returnerer den til forsiden.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester