webForumDet fria alternativet

Mime-typ vid upload.

ASP

13 svar · 657 visningar · startad av SlewME

Medlem sedan jan. 20069 inlägg
Frågan#1

Tjenare.
Jag använder ASPupload som komponent och det har nu visat sig att det går att utnyttja detta till att bli admin. Killen sade att han laddade upp ASP eller PHP-kod för att manipulera sig själv och bli admin. Har nu letat som ingen annan efter en lösning på problemet - utan resultat.

Det jag vill göra är att alltså ENDAST tillåta .gif och .jpg-mime för att förhindra att detta sker. Sidan ligger tillfälligt uppe på IIS5 då min andra server krashade och IIS5 är nästan oanvändbart.

Hur gör jag detta i ASPupload-koden?
Tacksam för svar. // SlewME

Medlem sedan dec. 19996 721 inlägg
#2

Låt helt enkelt bli att spara filer med andra filslut än .gif, .jpg och .jpeg.

Medlem sedan jan. 20069 inlägg
#3

emission skrev:

Låt helt enkelt bli att spara filer med andra filslut än .gif, .jpg och .jpeg.

Visste att jag skulle varit tydligare i min tråd. Det har inte med saken att göra, självklart har jag sett till att andra filer än dessa inte ska sparas. MEN ASPupload läser av filers mime-typ och lägger upp filen på servern samt tar bort den om det är fel filtyp.

Detta skrev han på MSN till mig;
"Spoofad MIME-typ + extension med ASP eller PHP == exekvera kod på servern"
"Problemet är att scriptet litar på MIME-typen"
"Finns två lösningar, enkla och svåra. Typ."
"Enkla är att neka servern att servera allt som slutar på .asp eller .php ifrån katalogen som filer uppladdas till."
"Svåra är att kolla direkt i scriptet."

Vill alltså få ett SVAR på hur jag löser detta? Dvs. antingen neka .asp/.php eller att bara acceptera en viss mime-typ.

Medlem sedan dec. 19996 721 inlägg
#4

SlewME skrev:

självklart har jag sett till att andra filer än dessa inte ska sparas.

Då är det ju löst. Så länge filslutet inte är något annat än de nämnda så har du inget problem. Filens mime-typ är ointressant.

SlewME skrev:

"Enkla är att neka servern att servera allt som slutar på .asp eller .php ifrån katalogen som filer uppladdas till."

Det kan du förvisso göra som en extra åtgärd. Det smidigaste sättet är att sätta Execute Permission till None på just den mappen.

Medlem sedan jan. 20069 inlägg
#5

emission skrev:

Då är det ju löst. Så länge filslutet inte är något annat än de nämnda så har du inget problem. Filens mime-typ är ointressant.

Tror inte att du hänger med? Eller så är jag kass på att förklara.
Allt är som det ska vara MEN han kan ändå ladda upp .asp eller .php-filer. Dvs. det går att gå runt, vilket jag har försökt att komma fram till många gånger i mina tidigare trådar.

Vill därför spärra detta.

Medlem sedan dec. 19996 721 inlägg
#6

Då får du allt visa lite kod.

Medlem sedan jan. 20069 inlägg
#7

emission skrev:

Då får du allt visa lite kod.

Visar hela. ;)

<% 
If Request.Querystring("do") = "bild" Then

Set connect = Server.CreateObject("ADODB.Connection")
connect.open "driver={MySQL ODBC 3.51 Driver};server=localhost;uid=***;pwd=***;database=***"
Set ObjRS = Server.CreateObject("adodb.recordset")

strSQL = "SELECT * From bildkey Where userid = "&CLng(session("id"))
Set ObjRS = Connect.Execute(strSQL)

Set Upload = Server.CreateObject("Persits.Upload.1")

On Error Resume Next
Upload.SetMaxSize 614400, True
Upload.OverwriteFiles = True

Upload.Save "C:\Inetpub\wwwroot\***\***\bilder\"

NewName = ObjRS("key")

If Err.Number = 8 Then
Session("message") = "Tyvärr så är bilden är större än tillåtet, max 600kb!"
Response.Redirect "index.asp?s=laddaupp&id=" &Request.Querystring("id")
Else
If Err <> 0 Then
Session("message") = "Ett fel uppstod, var god försök igen."
Response.Redirect "index.asp?s=laddaupp&id=" &Request.Querystring("id")
Else
Session("message") = "Din bild är uppladdad"
End If
End If

Set File = Upload.Files("File")

For Each File In Upload.Files
If File.ImageType <> "GIF" and File.ImageType <> "JPG" Then
Session("message") = "Du kan bara ladda upp .jpg och .gif-filer"
File.Delete
Response.End
END IF
File.Copy "C:\Inetpub\wwwroot\***\***\bilder\" & NewName & File.ext
File.Delete

strSQL = "UPDATE members Set bild = 'bilder/"&NewName&File.ext&"', confirm = '0' where id ="&CLng(Request.Querystring("ID"))
Connect.Execute(strSQL)

Session("message") = "Din bild är uppladdad"
Response.Redirect "index.asp?s=laddaupp&id="&session("id")
Next
End IF
%>
Medlem sedan dec. 19996 721 inlägg
#8

1. På raden med Upload.Save(....) sparas alla uppladdade filer på disken. Spara i minnet (genom att inte ange en sökväg) eller på en icke-webbåtkomlig plats i stället, annars kan filer bli kvar om något går snett i ett senare skede.
2. Använd "File.ext" för att kontrollera filtypen
3. Om formuläret (kanske ett spoofat formulär) tillåter flera filer så kommer alla utom den första felaktiga att ligga kvar, eftersom Response.End avslutar loopen

Medlem sedan okt. 2004502 inlägg
#9

Du tittar på mime-typen. Den är inte intressant. Det är filnamnet som är intressant.

Även om en asp eller php fil laddas upp som bild.gif så exekveras den inte på servern och du är safe.

Medlem sedan jan. 20069 inlägg
#10

jonnyz skrev:

Du tittar på mime-typen. Den är inte intressant. Det är filnamnet som är intressant.

Även om en asp eller php fil laddas upp som bild.gif så exekveras den inte på servern och du är safe.

Vilket han lyckades med genom koden jag visade? Hur kommer det sig?

Medlem sedan juni 200032 967 inlägg
#11

Läs vad emission skriver. Du börjar ju med att spara alla uppladdade filer på disken. Spara inte filen på disk förrän du kontrollerat att filen är av rätt typ.

Medlem sedan jan. 20069 inlägg
#12

@nders skrev:

Läs vad emission skriver. Du börjar ju med att spara alla uppladdade filer på disken. Spara inte filen på disk förrän du kontrollerat att filen är av rätt typ.

Läste det. Har gjort så nu,

<% 
IF Request.Querystring("do") = "bild" THEN

Set connect = Server.CreateObject("ADODB.Connection")
connect.open "driver={MySQL ODBC 3.51 Driver};server=localhost;uid=***;pwd=***;database=***"
Set ObjRS = Server.CreateObject("adodb.recordset")
strSQL = "SELECT * From bildkey Where userid = "&CLng(session("id"))
Set ObjRS = Connect.Execute(strSQL)

Set Upload = Server.CreateObject("Persits.Upload.1")

On Error Resume Next
Upload.SetMaxSize 614400, True
Upload.OverwriteFiles = True

Upload.Save

NewName = ObjRS("key")

if Err.Number = 8 Then
Session("message") = "Tyvärr så är bilden är större än tillåtet, max 600kb!"
Response.Redirect("index.asp?s=laddaupp")
Else
If Err <> 0 Then
Session("message") = "Ett fel uppstod, var god försök igen."
Response.Redirect("index.asp?s=laddaupp")
Else
Session("message") = "Din bild är uppladdad"
End If
End If

Set File = Upload.Files("File")

For Each File In Upload.Files
If File.ImageType <> "GIF" and File.ImageType <> "JPG" Then
Session("message") = "Du kan bara ladda upp .jpg eller .gif bilder"
Response.Redirect("index.asp?s=laddaupp")
File.Delete
Response.End
END IF
File.SaveAs "C:\Inetpub\wwwroot\***\inne\bilder\" & NewName & File.ext

strSQL = "UPDATE members Set bild = 'bilder/"&NewName&File.ext&"', confirm = '0' where id ="&CLng(session("ID"))
Connect.Execute(strSQL)

Session("message") = "Din bild är uppladdad"
Response.Redirect("index.asp?s=laddaupp")
Next
End IF
%>

Bör alltså inte gå att göra som han gjorde tidigare nu ?

Medlem sedan dec. 19996 721 inlägg
#13

Viktigast av allt är..

emission skrev:

2. Använd "File.ext" för att kontrollera filtypen

Medlem sedan okt. 2004502 inlägg
#14

Precis. Titta på vad filen heter och inte på MIME-typen. Ditt script tittar på MIME-typen:

If File.ImageType <> "GIF" and File.ImageType <> "JPG" Then
262 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)