Jag har en community kåd i ASP som av en eller annan anledning finns det säkerhetshål!
En kille reggade sig som test o sen hadde jag ett mail där han skrev att han lyckades komma åt min databas som är MySQL o byta lösenordet på admin kontot.
Så nu undrar jag hur får man reda på väg kan han ha kommit in.
Du kan ha osäker kod så att man kan manipulera strängar och dylikt, och på så vis "lura" databaskopplingen att hämta annan data. Tecknet ' är väl det som brukar sabba för de flesta.
Jag kan ta ett exempel där jag tror att det är värst om jag har förståt det rätt!
<%
DT = Now()
myArray = Conn.Execute("Select U.status,A.active_check,U.userid From sidan_users U, sidan_active A Where A.userID=U.userId").GetRows()
For i = 0 To ubound(myArray,2)
'If myArray(0,i) = 1 AND Isnull(myArray(1,i)) Or myArray(1,i)="" Then
' Conn.Execute("Update sidan_users Set status=0,humor=0 Where userid=" & FixaTecken(myArray(2,i)))
' Conn.Execute("Update hellas_active Set status_var='Ej inloggad' Where userid=" & FixaTecken(myArray(2,i)))
'End If
If myArray(0,i) = 1 AND DateDiff("n", myArray(1,i), DT) > 45 Then
Conn.Execute("Update sidan_users Set status=0,humor=0 Where userid=" & FixaTecken(myArray(2,i)))
Conn.Execute("Update sidan_active Set status_var='Ej inloggad' Where userid=" & FixaTecken(myArray(2,i)))
End If
Next
Response.Cookies("sidanUser") = Trim(Request.Form("anvnamn"))
Response.Cookies("sidanUser").Expires = date + 365
Set IPBlock=Conn.Execute("Select IPnr From sidan_ipblock Where IPnr='" & FixaTecken(Request.Servervariables("REMOTE_ADDR")) & "'")
If IPBlock.EOF Then
Set RecSet=Conn.Execute("Select active,userId,anvnamn,pass From sidan_users where anvnamn='" & FixaTecken(Request.Form("anvnamn")) & "'")
If Not RecSet.EOF Then
Set Block=Conn.Execute("Select slutdatum,user From sidan_comblock Where slutdatum > '" & FixaTecken(DT) & "' And user=" & FixaTecken(RecSet(1)))
If Block.EOF Then
If Request.Form("pass") = RecSet(3) Then
If RecSet(0)=1 Then
Conn.Execute("Update hellas_users Set senast=current_timestamp,status=1,inloggningar=inloggningar+1 Where userID=" & FixaTecken(RecSet(1)))
Conn.Execute("Update sidan_active Set active_check=current_timestamp Where userID=" & FixaTecken(RecSet(1)))
Conn.Execute("Insert Into sidan_inloggningar(user,date,ip) Values(" & FixaTecken(RecSet(1)) & ",current_timestamp,'" & FixaTecken(Request.Servervariables("REMOTE_ADDR")) & "')")
Session("sidan_session") = Secure
Session("aktivTime") = Now()
Session("user_id") = RecSet(1)
Session("anvnamn") = RecSet(2)
Session("cUsername") = RecSet(2)
Session("min") = now()
Session.TimeOut = 500
Block.Close:Set Block=Nothing
RecSet.Close:Set RecSet=Nothing
IPBlock.Close:Set IPBlock=Nothing
Conn.Close:Set Conn=Nothing
Response.Write "<script language=Javascript>"
Response.Write "top.location.href='default.asp';"
Response.Write "</script>"
Else
Block.Close:Set Block=Nothing
RecSet.Close:Set RecSet=Nothing
IPBlock.Close:Set IPBlock=Nothing
Call AlertUserAndRedirect("Kontot är inte aktiverat genom länken du \nfick i mailet när du blev medlem!","default.asp")
End If
Else
Block.Close:Set Block=Nothing
RecSet.Close:Set RecSet=Nothing
IPBlock.Close:Set IPBlock=Nothing
Conn.Close:Set Conn=Nothing
Response.Write "<script language=Javascript>"
Response.Write "alert('Du skrev fel lösenord!');"
Response.Write "self.location.href='default.asp';"
Response.Write "</script>"
End If
Else
Block.Close:Set Block=Nothing
RecSet.Close:Set RecSet=Nothing
IPBlock.Close:Set IPBlock=Nothing
Call AlertUserAndRedirect("Du är blockad från sidan t.o.m " & Block(0) & "!","default.asp")
End If
Else
RecSet.Close:Set RecSet=Nothing
IPBlock.Close:Set IPBlock=Nothing
Call AlertUserAndRedirect("Anvnamnet finns inte! Kanske har \ndu inte loggat in på 2 månader?","default.asp")
End If
Else
IPBlock.Close:Set IPBlock=Nothing
Call AlertUserAndRedirect("Ditt IP-nummer " & Request.Servervariables("REMOTE_ADDR") & " är blockat!","default.asp")
End If
%>
Så vad ska ändras o finns det en lucka här? Om inte var kan man hitta den?
GAOH!
Snälla, inneslut din kod inom [kod]-taggarna när du postar kod. Det blir så väldigt mycket enklare att läsa då.
På flera ställen anropar du funktionen FixaTecken(), hur ser den ut? Det låter som den gör precis det som det tipsats om i tråden, dvs "fixar" till tecknet ' så att det blir ofarligt.
GAOH!
Snälla, inneslut din kod inom [kod]-taggarna när du postar kod. Det blir så väldigt mycket enklare att läsa då.
På flera ställen anropar du funktionen FixaTecken(), hur ser den ut? Det låter som den gör precis det som det tipsats om i tråden, dvs "fixar" till tecknet ' så att det blir ofarligt.
Jag sökte nu med min notepad o fann en massa hmmm
en av raderna va
viewfile.asp (64): Conn.Execute("Update sidan_galleri_besok Set datum=current_timestamp,antal=antal+1 Where bildId=" & Int(FixaTecken(Request.QueryString("id"))) & " And besokar_id=" & FixaTecken(Session("user_id")))
Jag har kollat o kan fortfarande inte fatta vad jag ska leta efter o vad jag ska göra åt det!
Hittade det som beskrevs här ovan "FixaTecken" o det fanns en massa sådarna ställen!
Men vad ska jag kolla i samband med det o göra vad sen?
Function FixaTecken(ByVal sString)
FixaTecken = Replace(Replace(trim(sString), "'", "''"),"\","/")
End Function
Conn.Execute("Update sidan_galleri_besok Set datum=current_timestamp,antal=antal+1 Where bildId=" & FixaTecken(Request.QueryString("id")) & " And besokar_id=" & Session("user_id")),,128
<%
'## -- DB METHODS --
Function GetDbRows(query)
If Len("" & query) = 0 Then Exit Function
Dim rstTemp
Set rstTemp = CONN.Execute(query)
If Not rstTemp.EOF Then GetDbRows = rstTemp.GetRows()
rstTemp.Close
Set rstTemp = Nothing
End Function
Function ExecuteScalar(query)
If Len("" & query) = 0 Then Exit Function
Dim rstTemp
Set rstTemp = CONN.Execute(query)
If Not rstTemp.EOF Then ExecuteScalar = rstTemp(0)
rstTemp.Close
Set rstTemp = Nothing
End Function
Function CountMembersBySex(sex)
Dim queryCount
queryCount = "Select Count(*) From astro_users Where active=1 and kon=" & sex
CountMembersBySex = CONN.Execute(queryCount).Fields(0)
End Function
Public Function CountMemberAgeRange(startYear, endYear, sex)
CountMemberAgeRange = CONN.Execute("Select count(*) From astro_users Where kon= " & sex & " And ar Between " & startYear & " And " & endYear).Fields(0)
End Function
Sub ForumBlock()
CONN.Execute("Update astro_active Set active_check=current_timestamp Where userid=" & Session("user_id"))
End Sub
Sub SetUserLastActivityTime()
CONN.Execute("Update astro_active Set active_check=current_timestamp Where userid=" & Session("user_id"))
End Sub
Sub SetMemberLocation(location)
CONN.Execute("Update astro_active Set status_var='" & location & "' Where userid=" & Session("user_id"))
End Sub
'## -- END DB METHODS --
detta är halva funktion om ens det!
Jag har blivit blind tror jag på att glo o söka efter fel men ser ni nån säkerhetshål i denna???
Om det ät Tecknet ' som är boven i det hela, vad skall jag ersätta den med?
Ett exempel som finns är att i början av en kod så finns dena tecken '
'## -- DB METHODS --
Function GetDbRows(query)
If Len("" & query) = 0 Then Exit Function
Dim rstTemp
Set rstTemp = CONN.Execute(query)
If Not rstTemp.EOF Then GetDbRows = rstTemp.GetRows()
rstTemp.Close
Set rstTemp = Nothing
End Function bla bla bla
är den betydelsefull eller är det dem tecken i själva skriptet?
' (även kallad fnutt) i början av en rad betyder att det är en kommentar i vb-script.
Klargörande:
Du SKA ha funktionen FixaTecken, det är INTE den som är problemet, det är lösningen!
Den används så att på varje ställe där du tar emot data som användaren kan lägga till via tex formulär, lägger du den runt värdet, precis som du gjort, för att plocka bort eventuellt skadlig kod.
Du behandlar även en del data från sessioner i bifogade funktioner, och jag vet inte om man kan komma åt att ändra dessa.
269 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849