Avatar billede morticuz Nybegynder
10. august 2009 - 09:37 Der er 15 kommentarer og
1 løsning

Min ASP side er blevet hacket

Hej eksperter.

Jeg har lavet en hjemmeside i ASP med tilhørende CMS system.

Nu er der lige pludselig sket det at forsiden har fået ny baggrund og der er kommet musik på siden, og title er blevet til:

(¯°·._.·( aB0 m0h4mM3d OwNz j00! .. Peace! )·._.·°¯) - Saudi Arabia Rules !

Har faktisk ikke tænkt alt for meget i sikkerhed, men har da lavet replace(request.form("username"),"'","''") når man logger ind, men ved faktisk ikke hvad jeg ellers kan gøre?!

Kan han bare ha gættet bruger og pass?! Eller har han hacket sig ind på andre måder? Når man logger ind i CMS'et så har han også sat en side op der hvor der står at man er blevet hacket af ham?!

Det vil jo egentlig sige at han har kunnet skrive til selve filen, så selvom at han har gættet koden til CMSet så kan man jo ikke ændre i selve filerne i cms systemet.

Nogle der har nogle bud?

Peter
Avatar billede kgkg Nybegynder
10. august 2009 - 09:44 #1
Hvor er din side hosted?
Avatar billede morticuz Nybegynder
10. august 2009 - 09:54 #2
Den er hostet hos frontdata i Århus.

Har dog fundet ud af hvordan han har lavet den her forside. Han har åbenbart lavet et embedtag som ligger i et input text felt. Så det er den måde han har fået lavet hele siden om. Og tror det er samme embeddet fil som ligger som baggrund på siden.

Så indtil videre har han vidst bare fået skrevet nogle embed tags ind i databasen, og det er det som er skyld i det hele.
Avatar billede fennec Nybegynder
10. august 2009 - 09:55 #3
Det er ikke nok kun at tjekke din login side. ALLE værdier du sender til databasen skal verificeres.

Da det er et CMS gå jeg ud fra du tilgår dine sider med noget ala:
index.asp?id=123

Hvad nu hvis en bruger ændre det til:
index.asp?id=123;drop table pages;

Med mindre du verificere data når du selecter siden, bliver din sql til:
"select * from pages where id=123;drop table pages;"

Hvilket bliver til at "pages" tabellen bliver slette. Nu er det ikke sikkert din tabel hedder det, men det er nok et sigende navn, så det er ikke svært at gætte.

Det kan dog også være en meget simpler problem du står over for. Det kan være hackeren bare har fået uploaded en "default.htm" fil, og hvis iis'en er sat op til at den kommer før index.asp, så er det hans side du ser på forsiden.
Avatar billede morticuz Nybegynder
10. august 2009 - 09:58 #4
Det han har skrevet til den felt i databasen er følgende:

<embed src="http://greencall.co.kr/.p/we_will_not_go_down.swf" autostart="true" hidden="true" width="10" height="10" align="left"></font></span></p><style type="text/css">BODY{SCROLLBAR-FACE-COLOR:#000000;SCROLLBAR-HIGHLIGHT-COLOR:#000000;SCROLLBAR-SHADOW-COLOR:darkgray;SCROLLBAR-3DLIGHT-COLOR:#eeeeee;SCROLLBAR-ARROW-COLOR:#000000;SCROLLBAR-TRACK-COLOR:gray;SCROLLBAR-DARKSHADOW-COLOR:#000000}A:link{COLOR:darkblue;TEXT-DECORATION:none}A:visited{COLOR:#000088;TEXT-DECORATION:none}A:hover{COLOR:#000000}body,td,th{color:#000000}table,p,td,tr{visibility:hidden}body{background-color:#000000;background-image:url('http://greencall.co.kr/.m/ab-danish.gif');background-repeat:no-repeat;background-position:top}
</style>

Så det er nok det som ødelægger hele siden ku man forestille sig. Han har ikke skrevet direkte i filerne kan jeg se på ftp'en. Kun i databasen har han været og kun det her title felt hvor han har skrevet linien fra første indlæg, og så et adresseliniefelt hvor han har skrevet den her embed linie.
Avatar billede morticuz Nybegynder
10. august 2009 - 10:02 #5
Det er lige præcis den måde jeg gør det på. Altså med id=25 osv. Til gengæld hedder den default, så det er min side han har ændret i cms'et i.

Men hvordan gør man så med de id'er? Er det bare at assigne den som en int(id) i tabellen, så den vil lave en fejl hvis der er andet end tal i?

Er der andre ting det kan være? Jeg tror faktisk også at jeg har sat apostrof testeren på alle strings der skrives til databasen, men skal selvfølgelig lige have tjekket det igennem :)
Avatar billede fennec Nybegynder
10. august 2009 - 10:34 #7
morticuz >>
Som jeg skrev skal ALLE værdier du sender til databasen tjekkes. Dvs. tekst, tal og datoer.

En måde at gøre det på er via det parametre (som keysersoze har givet dig link til). En anden måde er at lave funktioner som tjekker data, også bruge dem hver gang du bygger en sql.

Så ja. En hurtig løsning er at smide cInt() omkring din querystring. Det kunne f.eks. laves som en funktion:

function DBInt(fVal)
  DbInt = cInt(fVal&"")
end function

også din sql:
sql = "select * from pages where id="& DBInt(request.querystring("ID"))
Avatar billede morticuz Nybegynder
10. august 2009 - 10:45 #8
Men det er vel kun nødvendigt de steder hvor den trækker fra foreksempel querystring eller en form eller sådan noget. Altså hvor brugeren har mulighed for at lave en ændring i SQL'en?

Men så er det simpelthen det jeg skal dobbelttjekke siden for!?!

Kan der være andre ting? Eller er vi bare sikre på at det er det her han har benyttet sig af?! :)
Avatar billede keysersoze Guru
10. august 2009 - 10:56 #9
Det vil være rigtig god kodestil at gøre de samme ting alle steder - på den måde sikrer du dig også at ting der måske engang blev lavet til at udføre skjulte operationer og derfor ikke indeholder sikkerhed nu skal køre offentligt og ikke bliver tilrettet med ny sikkerhed.

Det vil formentlig være en større gennemgang men væn dig til at benytte parametre så du helt slipper for at vurdere fra gang til gang du skriver SQL. Parametre sikre mig alt på selve forespørgselsfronten - men der kan selvfølgelig stadig ligge sikkerhedsissues på selve databasen eller, hvis brugerne kan give input, XSS.
Avatar billede fennec Nybegynder
10. august 2009 - 11:02 #10
Realt ja. Så er det kun bruger data du skal tjekke, men her vil jeg kraftig anbefale at du tjekker alle data. Uanset hvor de kommer fra.

1. Selv programmøre kan overse et potientelt problem.
2. Tjekket kommer ind på din rygrad tilsidst, så du ikke kommer til at glemme det.
3. En ændring af koden, hvor brugeren lige pludselig kan ændre data, som var hardcoded før, skaber ikke problemer.

Det er en af de sikkerheds ting man ikke må gå meget på kompromi med, da det kan lægge hele systemer ned. Bruger du f.eks. MS-SQL som database, kan man lukke hele database serveren ned med en enkelt kommando. Altså ALLE databaser på serveren. Ikke kun den ene som du bruger.

Parametre løsningen, som keysersoze linkede til, er helt klart den sikreste metode, men jeg kan personlig ikke arbejde på den måde (der er vi alle forskellige), hvorfor jeg bruger funktioner. Du skal derfor selv bestemme hvordan du arbejder, men prøv parametre løsningen. Det skader jo ikke at lære noget nyt :)
Avatar billede morticuz Nybegynder
10. august 2009 - 11:22 #11
Okay, så må jeg få kigget på parametre. Men har du en god side til det? Kan ikke lige finde ud af hvad jeg skal søge på for at finde det rigtige. Fordi at jeg ved ikke lige hvilke tal osv jeg skal skrive i de parametre linier der?! Er vel ret væsentlig at lære :)

Lige nu har jeg det sådan at den kun bruger id rundt omkring på siden og den har jeg bare defineret i toppen af siden med:

id = cint(request.querystring("id"))

Og det eneste sted på siden som har noget tekstinput til databasen er admin login siden og den er også beskyttet mod plings.

Så skal jeg nok prøve at kigge på parametre på næste side jeg laver :)

Mht Cross Sites Scripting, hvad kan jeg så gøre der? Og hvad er det helt nøjagtigt? Synes når jeg læser om det minder det mest om javascript injection og om at smide html direkte i formfelterne eller i querystring?!
Avatar billede hnteknik Novice
10. august 2009 - 11:58 #12
>morticuz

Sig til, hvis du har brug for at få løbet koden igennem:

http://www.eksperten.dk/spm/847728#reply_7221914

Henrik
Avatar billede hifi4all Nybegynder
23. august 2009 - 16:14 #13
Du kan undersøge dine request (querystring og forms) ved at lave et simpelt "filter", og evt. anvende det som en inkluderet fil på de sider der er behov for det. Ønskes der flere regler end i de viste, tilføjes de som det passer dig.

Eksempler:

<%
'Dette er vores filter
Private Function formaterInput(ByVal strInputEntry)

    strInputEntry = Replace(strInputEntry, "[", "&#091;", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "]", "&#093;", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "<", "&lt;", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, ">", "&gt;", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "\'", "&#092;'", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "'", "", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "=", "&#061;", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "select", "sel&#101;ct", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "join", "jo&#105;n", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "union", "un&#105;on", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "where", "wh&#101;re", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "insert", "ins&#101;rt", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "delete", "del&#101;te", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "update", "up&#100;ate", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "like", "lik&#101;", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "drop", "dro&#112;", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "create", "cr&#101;ate", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "modify", "mod&#105;fy", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "rename", "ren&#097;me", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "alter", "alt&#101;r", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "cast", "ca&#115;t", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "convert", "conv&#101rt", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "sysobjects", "sysobject&#115;", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "db_name", "db_n&#097;me", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "^", "", 1, -1, 0)
    strInputEntry = Replace(strInputEntry, "declare", "d&#101;clare", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "set", "s&#101;t", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "exec", "ex&#101;c", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "values", "valu&#101;s", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "where", "wher&#101;", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "view", "vi&#101;ew", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "merge", "m&#101;rge", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "truncate", "truncat&#101;", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "trigger", "trigg&#101;r", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "script", "", 1, -1, 1)

formaterInput = strInputEntry
End Function

'--------------------------------------------------------

'Her henter vi noget fra en QueryString og laver den til en varibel...

Dim MinStreng
MinStreng = Request.Querystring("MinStreng")
MinStreng = formaterInput(MinStreng)

'Udskriv strengen
Response.Write("Dette er min variabel/streng:" & MinStreng)

'--------------------------------------------------------

'Formular eksempel (samme princip blot med Request.Form)
Dim MinFormStreng
MinFormStreng = Request.Form("MinFormStreng")
MinFormStreng = formaterInput(MinFormStreng)

'Udskriv formdata
Response.Write("Dette er min variabel/streng fra formularen:" & MinFormStreng)

'--------------------------------------------------------

'Laves der opslag i en database via et nummerisk ID, kan der med fordel checkes for nummeriske data og lige trimme data i samme moment!

'Hent data (som eksempel øverst via querystring)
Dim ID
'Trimmer id´et og begrænser antallet af tegn til max 10
ID = Trim(Mid(Request.Querystring("id"), 1, 10))

'Checker input for "SQL-grimme" input
ID = formaterInput(ID)

'Undersøg om input indeholder data efter vi har ryddet ud i koden og ligeledes om input består af nummeriske data
If ID <> "" AND IsNumeric(ID) Then
Response.Write("ID er OK og lig med:" & ID)
else
Response.Write("Id er ikke gyldigt - yderligere handlingere afbrydes...")
Response.End
Response.Flush
End If
%>

Håber det kan bruges! :O)
Avatar billede keysersoze Guru
23. august 2009 - 20:48 #14
et filter kan være en god idé (selvom det dog i bund og grund er irrelevant eftersom der findes færdige ting til det i forvejen (parametre)) - det kræver bare at man ved hvad der kan gå galt og håndterer det på den korrekte måde, en korrekt måde benytter i mine øjne bare ikke html-entiteter eller lignende eftersom det dels låser ens data til web og manipulerer unødvendigt med brugerens input.
Avatar billede hifi4all Nybegynder
24. august 2009 - 07:41 #15
Jeg er enig, parametre er vejen frem, men de kan være svære at forstå, så filteret var blot et eksempel på en anden tilgang! :)
Avatar billede keysersoze Guru
29. december 2009 - 11:11 #16
lukketid?
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