CcolioneMedlem sedan juni 20014 421 inlägg Det var ett exempel, det som jag beskrev är inte det allvarligaste med SQL-injection, utan det är att du kan köra program som ligger på servern.
Du avlsutar exempelvis SQL-satsen med ' och sedan så kan du till exempel anropa CMD.exe med kommandon bakom...du kan exemeplvis starta om servern, eller ännu värre säga åt servern att ladda hem ett program som sedan körs på servern.
Så gör en funktion som ersätter ' (en enkelfnutt) med '' (två enkelfnuttar) på så sätt, slipper du fundera på om han kan köra en application/ta sig in utan lösen.
Läs gärna igenom den här: :)
http://www.nextgenss.com/papers/advanced_sql_injection.pdf
Den är ganska lång men det är bra läsning, du kommer kunna ganska mycket om Injection då.
Även den här (som dock inriktar sig mer på att manipulera forumkod) är bra:
http://www.wiretrip.net/rfp/txt/rfp2k01.txt
Det du ska göra är att se till att leta reda på och escapa/ta bort/ersätta eventuella ' i variabler du inte vet innehållet i.
Gör alltså gärna en funktion som du kör alla variabler som du inte själv sätter värdet på igenom.
Jjvc_manMedlem sedan okt. 2003165 inlägg Tack för svaret, jag skall kolla igenom dina två länkar, det bästa är nog att jag genererar att det är ett fel, dvs att de har angivet ett felaktigt tecken, dvs jag kan nog skapa en funktion som kontrollerar om det finns tecken i strängen som skiljer sig från alfabetet samt siffror.
Tack så mycket, mvh Björn
Jjvc_manMedlem sedan okt. 2003165 inlägg Hej, nu kommer jag igen med mina inlägg... =/
Detta är till: colione
Jag har läst igenom allt nu som fanns i dina länkar, intressant fakta faktiskt! Dock så måste jag erkänna att jag inte alls är så bra på att skriva egna funktioner i javascript /Jscript och sedan anropa dem och få fram värdet true eller false som jag skulle behöva få fram i detta fallet.
Jag kan göra som så (finns 3 funktioner på sida 23 i din första länk), att jag använder de tre funktionerna i mina asp-filer där jag brukar forumlär, kontrollerar allt som skrivs in, och om någon av de funktionerna genererar false så avslutar jag allt direkt, och genererar att ex. ett otillåtet tecken har angivits...
Men som sagt, jag får det ej att fungera, kan ej / vet ej hur jag skall göra med funktionerna, har skrivit av dem och försökt använda dem, men funkar ej...
Skulle ni möjligtvis vilja vara super schyst och hjälpa mig med det, ex. kopiera en av funktionerna och använd den i en liten sats, dvs göra en liten asp-kod som skulle funkat i ex. index.asp
så att jag kan testa samt förstå och fortsätta på egen hand,
Hoppas ni vill och kan hjälpa mig, i sådana fall evigt tacksam! =)
Mvh Björn
CcolioneMedlem sedan juni 20014 421 inlägg Jag tycker inte du ska rikta din fråga till mig, utan till alla, då detta är ett forum ;)
Om jag sedan ska vara helt ärlig så var det ett ganska bra tag sen jag satt och pillade med VBScript (är mer inne på JavaScript och Python nu), men en kopiering rakt av borde funka.
Vad är det för fel du har fått då/vad funkar inte?
En klientlösning med javascript är inte att rekomenderar då en hackare kan stänga av javascript i sin webbläsare....
Vi kan ju alltid hoppas att någon med mer VBscript kunskaper än jag förbarmar sig.. :)
Jjvc_manMedlem sedan okt. 2003165 inlägg Hej!
Okey, jag förstår dig, det jag har problem med är:
Vart jag skall placera funktionen, vilket script språk jag skall skriva ovan, hur jag skall anropa funktionen, hur jag får ut värden ur funktionen, dvs typ allt gällande detta med egna funktioner...
Skulle någon kunna vara vänlig och kolla in denna länken, sida 25:
http://www.nextgenss.com/papers/adv...l_injection.pdf
Sedan om någon känner på sig att de kan hjälpa mig att klura ut detta, dvs hur jag skall använda mig utav funktionen/funktionerna får mer än gärna skriva hur/ett inlägg!
OBS: Tack för hjälpen "colione"!
Mvh Björn
Jjvc_manMedlem sedan okt. 2003165 inlägg Är det ingen som vet något om hur man gör egna funktioner och använder dem som i denna länk: sida 25:
http://www.nextgenss.com/papers/adv...l_injection.pdf
Måste väl finnas någon som är bra på sql-injection...*hoppas*
Mvh Björn
CcolioneMedlem sedan juni 20014 421 inlägg Du kan placera den funktionen var du vill, som du antagligen ser är den skriven i VBScript, det bör vara att bara kopiera över den till dokumenten som du behöver använda den i...
Sedan för varje varabel du hämtar in till din sida.
T.ex Dim namn=Request.Form("namn")
Sedan skulle jag satsa på version 2 av de tre olika scripten.
Alltså bara att anropa med:
(Pseudokod)
OM validate_string(namn) inte lika med TRUE
Eller likannde
Tänk dessutom på att om du kör med Option Explicit att DIMma dina variabler.
Länken var bruten när jag skulle kika på den...
<%
Dim pwd, usr, SQL
pwd = "phew"
usr = "hopp'san"
Function FixInjection(StrTxt)
StrTxt = "" & StrTxt
StrTxt = Replace(StrTxt, Chr(34), Chr(34) & Chr(34))
StrTxt = Replace(StrTxt, Chr(39), Chr(39) & Chr(39))
FixInjection = StrTxt
End Function
SQL = "SELECT field1, field2 "&_
"FROM table "&_
"WHERE anvandarnamn = '"&Trim(FixInjection(usr))&"'" "&_
"AND losenord = '"&Trim(FixInjection(pwd))&"'"
' SQL = "SELECT field1, field2 "&_
' "FROM table "&_
' "WHERE anvandarnamn = '"&Trim(usr)&"'" "&_
' "AND losenord = '"&Trim(pwd)&"'"
%>
Nu har jag iofs inte testat koden men prova att köra de olika SQL-frågorna mot din databas och se vad som händer.
Jjvc_manMedlem sedan okt. 2003165 inlägg Tack för svaret och besväret, skall testa koden snarast, hoppas det funkar, dock ser det lovande ut ju! =)
Mvh Björn
Verkar vara mycket flummande och felaktiga uppgifter som skrivs här, så jag ska försöka klara upp lite.
Citattecken ( " ) behöver man inte escapa eftersom att de vanligtvis inte används i SQL.
Apostrofer ( ' ) bör man escapa med två apostrofer. ( '' )
För att vara extra säker kan man skriva så här:
sql = "SELECT * FROM tblUser WHERE UserName = '" & sUserName & "'"
'hämta rs
If rs("UserPassword") = sUserPassword Then
'inloggad
Else
'ej inloggad
End If
Högerklicksskydd och andra JavaScript förhindrar inte crackers utan förhindrar bara vanliga användare från att navigera sig runt på sidan.
Databasen bör ligga utanför web-roten som sagts tidigare.
Viktigt att web-hotellet har hög säkerhet. Brandvägg och sånt är viktigt.
Använd Session istället för Response.Cookies.
Glöm inte att kolla i Session på varje sida om man är inloggad eller inte.
Använd gärna en kryptering för lösenord. Helst envägskryptering.
SSL är viktigt vid inloggningsformulär.
Jjvc_manMedlem sedan okt. 2003165 inlägg Hej!
Tacl för era svar och er hjälpt, skall försöka bruka funktionerna som filtrerar bort " ' " m.m. och om något sånt tecken har angets så skall det genereras ett fel till användaren.
Jag använder självfallet Session och på varje sida kontrollerar jag om de är inloggade, dock endast de sidor som är för registrerade medlemar! ;)
Hur använder man kryptering för lösenord?
SSL?
Det webhotellet jag har är Citynetwork och de verkar ha bra säkerhet, dock återstår det att se!
Tack som sagt för alla svar, skall se över alla inlägg och alla kod samt fakta på måndag (är på Tattoo Expo mässan i Malmö nu som försäljare).
Mvh Björn M
Jjvc_manMedlem sedan okt. 2003165 inlägg Tack för all hjälp jag fått av er alla, mycket tacksam!
Har gjort flera funktioner som fixar till säkerheten lite i alla fall! =)
Mvh Björn
SSannyWMedlem sedan jan. 2003438 inlägg Nu var kanske alla mätta och glada över ämnet, men jag bifogar ändå lite kod.
Tycker det funkar ganska bra att man loggar de misslyckade inloggnings försöken så vet man vad som har gjorts.
koden kanske inte är 100%-ig, men den funkar och kan kanske vara till hjälp för någon.
Är det sedan någon som tycker att någon kan göras annorlunda för att förbättra så kom gärna med synpunkter.
<%
Function escape(input)
input = Replace(input, "'", "''")
escape = input
End Function
if Request.Form("user") = "" AND Request.Form("password") = "" then
Response.Redirect "login.asp"
End if
if Request.Form("user")<>"" OR Request.Form("password")<>"" then
Set MinCon = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.Recordset")
MinCon.Open Conn_String
SQL = "SELECT * From users WHERE anv = '" & escape(Request.Form("user")) & "'"
rs.Open SQL, MinCon, 1, 2
If rs.EOF Then
datum = now
action = "Someone tried to login with username: <b>" & escape(Request.Form("user")) & "</b> and password: " & escape(Request.Form("password")) & ""
ip = Request.ServerVariables("REMOTE_ADDR")
set conn1 = Server.CreateObject("ADODB.Connection")
conn1.open Conn_String
cmdSQLinsert2 = "insert into logging (datum, action, ip) values ('" & datum & "', '" & action & "', '" & ip & "')"
conn1.Execute cmdSQLinsert2
conn1.Close
set conn1 = nothing
Response.Redirect "login.asp"
End IF
If Not rs("pass")=Request.Form("password") Then
datum = now
action = "<b>" & escape(Request.Form("user")) & "</b> tried to log in with password: " & escape(Request.Form("password")) & ""
ip = Request.ServerVariables("REMOTE_ADDR")
set conn1 = Server.CreateObject("ADODB.Connection")
conn1.open Conn_String
cmdSQLinsert2 = "insert into logging (datum, action, ip) values ('" & datum & "', '" & action & "', '" & ip & "')"
conn1.Execute cmdSQLinsert2
conn1.Close
set conn1 = nothing
Response.Redirect "login.asp"
Else
Session("anvandarnamn")=rs("anv")
Session("losenord")=Request.Form("password")
Session("connected")=1
Session("lvl")=1
Session("id")=rs("id")
datum = now
action = "User: <b>" & Session("anvandarnamn") & "</b> logged in"
ip = Request.ServerVariables("REMOTE_ADDR")
set conn2 = Server.CreateObject("ADODB.Connection")
conn2.open Conn_String
cmdSQLinsert = "insert into logging (datum, action, ip) values ('" & datum & "', '" & action & "', '" & ip & "')"
conn2.Execute cmdSQLinsert
conn2.Close
set conn2 = nothing
End if
if session("connected")=1 then
Response.redirect "main.asp"
end if
%>
<%end if %>
Jjvc_manMedlem sedan okt. 2003165 inlägg Tjena!
Det känns lite onödigt att spara info om inloggningar (misslyckade), du kan ändå inte göra något, förutom typ spärra ip-numret, men flera anv. kan använda samma ipnummer...
Det bästa med min säkerhet på hemsidan förutom alla de funktioner jag gjort nu är att jag först hämtar all data från tabellen som har hand om kunder sedan jämför jag värdet som jag plockat ut med det som användaren skrev in, dock så har jag redan denna procedur kontrollerat det som anv. skrev in med funktionerna.
Många glada hälsningar!
Jjvc_manMedlem sedan okt. 2003165 inlägg Tjena igen!
Har dykt upp ett litet bekymmer =( *igen*
Man kan ju ladda ned databasen från databasmappen som finns på servern, enkelt sagt: man kan komma åt databasen enkelt...
Finns det något sätt att stoppa detta?
Databasen ligger självfallet utanför root, dock så finnes sökvägen till databasen i en inc-fil som behandlar kopplingen till databasen, och den kan man ju också komma åt...
Om man lösenordsskyddar databasen så finns lösenordet i asp-filen (eller finns det något annat sätt), och då kan man ju komma åt detta också...
Någon som har något bra tips om hur man skyddar databasen med lösenord samt hur man skall göra det svårt för någon att ladda hem databasen, anledningen till att de kan ladda hem den (enligt webhotellet) är för att databasen tillåter skrivning, och det måste den ju göra, för de inloggade medlemarna...
Mvh en åter förvirrad björn
NnikoMedlem sedan juni 20022 599 inlägg
Finns det något sätt att stoppa detta?
Man tar bort nerladdningsrättigheterna på databasen (eller mappen där den ligger).
Databasen ligger självfallet utanför root
Det gör den väl knappast om den går att ladda ner? Men annars finns det ingen anledning att lägga den utanför roten. Det ger bara krångel med hårdkodade absoluta sökvägar som inte följer med när man flyttar sajten.
anledningen till att de kan ladda hem den (enligt webhotellet) är för att databasen tillåter skrivning
Så får man väl ändå hoppas att de inte uttryckte sig. Läs-/skrivrättigheter hanteras av Windows. Ner-/uppladdningrättigheter hanteras av IIS:en. Det är helt olika saker.
Jjvc_manMedlem sedan okt. 2003165 inlägg Tjena!
Okey, skall se vad jag kan göra åt det, skall försöka ändra lite på deras kontrollpanel!
Mvh Björn
Jjvc_manMedlem sedan okt. 2003165 inlägg Det verkar inte gå att fixa...
Deras mail lyder:
____________________________________________________
Det går idag tyvärr inte att göra det.
Om du vill ha skrivrättigeter till din accessdatabas innebär detta även
att du kan ladda hem den.
Det du kan göra är att lösenordsskydda den eller alternativt uppgradera
ditt paket med MS SQL.
Idag erbjuder vi tyvärr inte det billiga enklare mySQL, dock är det
något vi tittar på.
____________________________________________________
Min fråga var hur man stoppar att databasen skall gå att ladda hem...
Försökte som sagt med inställningarna på databasmappen samt på databasen, hjälpte ej...
Vet ni hur man kan göra om man skall ha lösenordsskyddad databas och måste ha lösenordet i in-filen, då kan de få lösenordet också och det é ju inte bra...
OBS: Börjar bli trött på säkerhet, finns så många luckor som ploppar upp hela tiden!
Tacksam för svar och lösning! =)
Mvh
AaleborgMedlem sedan jan. 20013 341 inlägg Tycker att du ska kräva att få en mapp som ligger utanför www-rooten där du kan lägga databasen annars tycker jag att du ska fundera på att byta webbhotell, vet dom inte hur man ordnar nått sådant så kan man undra hur deras säkerhet är!
Jjvc_manMedlem sedan okt. 2003165 inlägg Hej!
Databasmappen ligger utan för wwwroot.
Men detta stoppar inte ex. mig när jag själv letar upp inc-filen i en mapp när hemsidan ligger på servern och därigenom får ut sökvägen till databasen, som jag sedan kan ladda ned...
Men hur funkar det med lösen m.m.
Tacksam för allt tips och trix (ler).
Mvh