Avatar billede anielsen Nybegynder
13. januar 2004 - 10:06 Der er 16 kommentarer

Sikkerhedshul i ASP login

Jeg har lavet en login side til min hjemmeside, hvor jeg har fundet ud af at der er et sikkerhedshul i. Problemet er at når man skriver 'or '1'='1 i brugernavn og password feltet så bliver man logget ind på admin siden. Hvad skal jeg gøre. Jeg sidder i programmet ultraDev 4 og her er noget af koden som jeg går udfra at der skal rettes i.

Håber i kan hjælpe

Her er koden:
<%
' *** Validate request to log in to this site.
MM_LoginAction = Request.ServerVariables("URL")
If Request.QueryString<>"" Then MM_LoginAction = MM_LoginAction + "?" + Request.QueryString
MM_valUsername=CStr(Request.Form("Brugernavn"))
If MM_valUsername <> "" Then
  MM_fldUserAuthorization=""
  MM_redirectLoginSuccess="loggedin.asp"
  MM_redirectLoginFailed="nologin.asp"
  MM_flag="ADODB.Recordset"
  set MM_rsUser = Server.CreateObject(MM_flag)
  MM_rsUser.ActiveConnection = MM_ConAnielsen_STRING
  MM_rsUser.Source = "SELECT brugernavn, password"
  If MM_fldUserAuthorization <> "" Then MM_rsUser.Source = MM_rsUser.Source & "," & MM_fldUserAuthorization
  MM_rsUser.Source = MM_rsUser.Source & " FROM login WHERE brugernavn='" & MM_valUsername &"' AND password='" & CStr(Request.Form("Password")) & "'"
  MM_rsUser.CursorType = 0
  MM_rsUser.CursorLocation = 2
  MM_rsUser.LockType = 3
  MM_rsUser.Open
  If Not MM_rsUser.EOF Or Not MM_rsUser.BOF Then
    ' username and password match - this is a valid user
    Session("MM_Username") = MM_valUsername
    If (MM_fldUserAuthorization <> "") Then
      Session("MM_UserAuthorization") = CStr(MM_rsUser.Fields.Item(MM_fldUserAuthorization).Value)
    Else
      Session("MM_UserAuthorization") = ""
    End If
    if CStr(Request.QueryString("accessdenied")) <> "" And false Then
      MM_redirectLoginSuccess = Request.QueryString("accessdenied")
    End If
    MM_rsUser.Close
    Response.Redirect(MM_redirectLoginSuccess)
  End If
  MM_rsUser.Close
  Response.Redirect(MM_redirectLoginFailed)
End If
%>


Hvor skal jeg rette i koden for at hullet er lukket?
Avatar billede Slettet bruger
13. januar 2004 - 10:12 #1
brug denne funktion

Function FixSQL(strSource)
        strSource = Replace(strSource,"'","''")
        FixSQL= strSource
End Function
Avatar billede Slettet bruger
13. januar 2004 - 10:14 #2
udskift

  If MM_fldUserAuthorization <> "" Then MM_rsUser.Source = MM_rsUser.Source & "," & MM_fldUserAuthorization
  MM_rsUser.Source = MM_rsUser.Source & " FROM login WHERE brugernavn='" & MM_valUsername &"' AND password='" & CStr(Request.Form("Password")) & "'"


med

  If MM_fldUserAuthorization <> "" Then MM_rsUser.Source = MM_rsUser.Source & "," & MM_fldUserAuthorization
  MM_rsUser.Source = MM_rsUser.Source & " FROM login WHERE brugernavn='" & FixSQL(MM_valUsername) &"' AND password='" & FixSQL(CStr(Request.Form("Password"))) & "'"

forudsat at du har indsat den funktion jeg skrev før, i dit dokument.
Avatar billede trumf Nybegynder
13. januar 2004 - 10:41 #3
anielsen> Det beskrevne sikkerhedshul eksisterer kun hvis der også er et felt i databasen der hedder 1. Hele tricket ligger i plingerne ' det er dem der adskiller, men det ved du jo, så plinger skal erstattes.

Hvis nu der er en der har valgt at have plinger og anførselstegn i sit password, eller hvis man vil kryptere data (hvilket klart kan anbefales) så skal plinger oversættes til deres respektive selv, bare i et andet sprog, i stedet for at fjernes eller laves om til et andet lovligt tegn.
replace(request.form("Password"), "'", "&#39;") skal bruges både når en bruger oprettes og når denne logger ind.
Avatar billede trumf Nybegynder
13. januar 2004 - 10:43 #4
Det bliver faktisk først rigtigt sjovt hvis jeg i brugernavn skriver
' and brugernavn IN (Delete...)
Avatar billede anielsen Nybegynder
13. januar 2004 - 10:58 #5
Hvor skal jeg indsætte dette i koden:

Function FixSQL(strSource)
        strSource = Replace(strSource,"'","''")
        FixSQL= strSource
End Function
Avatar billede trumf Nybegynder
13. januar 2004 - 11:04 #6
Bare indsæt den i starten af din kode, men brug den replace jeg skriver i stedet.

Function FixSQL(strSource)
        strSource = replace(strSource, "'", "&#39;")
        FixSQL= strSource
End Function
Avatar billede mm12010 Nybegynder
13. januar 2004 - 11:06 #7
Avatar billede anielsen Nybegynder
13. januar 2004 - 11:37 #8
Jeg får denne fejlmeddelelse:

Microsoft VBScript compilation error '800a0408'

Invalid character

/admin/index.asp, line 15

        strSource = Replace(strSource,"'","&#39;")
^

Her er koden jeg har sat det nye ind i:
<%
Function FixSQL(strSource)
        strSource = Replace(strSource,"'","&#39;")
        FixSQL= strSource
End Function
' *** Validate request to log in to this site.
MM_LoginAction = Request.ServerVariables("URL")
If Request.QueryString<>"" Then MM_LoginAction = MM_LoginAction + "?" + Request.QueryString
MM_valUsername=CStr(Request.Form("Brugernavn"))
If MM_valUsername <> "" Then
  MM_fldUserAuthorization=""
  MM_redirectLoginSuccess="loggedin.asp"
  MM_redirectLoginFailed="nologin.asp"
  MM_flag="ADODB.Recordset"
  set MM_rsUser = Server.CreateObject(MM_flag)
  MM_rsUser.ActiveConnection = MM_ConAnielsen_STRING
  MM_rsUser.Source = "SELECT brugernavn, password"
  If MM_fldUserAuthorization <> "" Then MM_rsUser.Source = MM_rsUser.Source & "," & MM_fldUserAuthorization
  MM_rsUser.Source = MM_rsUser.Source & " FROM login WHERE brugernavn='" & FixSQL(MM_valUsername) &"' AND password='" & FixSQL(CStr(Request.Form("Password"))) & "'"
  MM_rsUser.CursorType = 0
  MM_rsUser.CursorLocation = 2
  MM_rsUser.LockType = 3
  MM_rsUser.Open
  If Not MM_rsUser.EOF Or Not MM_rsUser.BOF Then
    ' username and password match - this is a valid user
    Session("MM_Username") = MM_valUsername
    If (MM_fldUserAuthorization <> "") Then
      Session("MM_UserAuthorization") = CStr(MM_rsUser.Fields.Item(MM_fldUserAuthorization).Value)
    Else
      Session("MM_UserAuthorization") = ""
    End If
    if CStr(Request.QueryString("accessdenied")) <> "" And false Then
      MM_redirectLoginSuccess = Request.QueryString("accessdenied")
    End If
    MM_rsUser.Close
    Response.Redirect(MM_redirectLoginSuccess)
  End If
  MM_rsUser.Close
  Response.Redirect(MM_redirectLoginFailed)
End If
%>
Avatar billede rbl Praktikant
13. januar 2004 - 21:56 #9
Det sker nogen gange når man kopierer fra en webside, at mellemrum bliver opfattet som en character.

Prøv at fjerne alle mellemrum før strSource og FixSQL.
Avatar billede anielsen Nybegynder
14. januar 2004 - 08:11 #10
rbl> Jeg har nu fjernet de mellemrum du har snakket om men nu kommer denne fejlmeddelelse:
Microsoft VBScript compilation error '800a0408'

Invalid character

/admin/index.asp, line 31

  MM_rsUser.Source = MM_rsUser.Source & " FROM login WHERE brugernavn='" & FixSQL(MM_valUsername) &"' AND password='" & FixSQL(CStr(Request.Form("Password"))) & "'"

Kan du / I se hvad der er galt?
Avatar billede rbl Praktikant
14. januar 2004 - 17:21 #11
Det er jo også noget du har kopiret ind her fra siden. Prøv at se om der skulle ske at være mellemrum før og efter linien
Avatar billede anielsen Nybegynder
15. januar 2004 - 13:57 #12
Min ftp er nede lige nu, så jeg skal nok lige skrive tilbage, når jeg har afprøvet det.
Avatar billede anielsen Nybegynder
16. januar 2004 - 10:43 #13
Tak for hjælpen.
Da rbl hjalp mig med at fjerne mellemrummene vil jeg give rbl pointene.
Avatar billede anielsen Nybegynder
16. januar 2004 - 10:44 #14
Lukket
Avatar billede anielsen Nybegynder
16. januar 2004 - 11:00 #15
Hvordan giver jeg rbl pointene?
Avatar billede rbl Praktikant
16. januar 2004 - 22:50 #16
Jeg synes nu også at du skal give til ezolu, da det var ham der hjalp med det oprindelige problem :-)
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