Bài giảng DOT NET Security

SQL Injection

L'utente o un hacker che intercetta la comunicazione può devastare il db .

Select * from authors where au_lname like ' ' ; drop authors – '

Prima query

Seconda query

Scartato

SQL Injection
. usare i parameters!!! .

Usare i Parameters

exec sp_executesql N'Select * from authors

where au_lname like @au_lname',

N'@au_lname varchar(40)', @au_lname = ''' ; drop authors – '

Raddoppio apici

Gli apici non sono l'unico problema:
select * from titles where royalty = 0 ; drop authors

 

ppt39 trang | Chia sẻ: hienduc166 | Lượt xem: 539 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Bài giảng DOT NET Security, để xem tài liệu hoàn chỉnh bạn click vào nút TẢI VỀ ở trên
 input malizioso dell'utente e lancia l'eccezione HttpRequestValidationExceptionSe però voglio accettare una stringa html/script dall'utente?Opzione 1: validateRequest = false (vale per tutta la pagina)Opzione 2: criptare sul client, decrittarla sul server e validarla.Sul client (durante la onsubmit) si cripta il contenuto con encode di javascriptil contenuto criptato si mette dentro un sul server si usa HttpUtility.UrlDecode per decodificare la stringainfine ...si può usare Server.HtmlEncode per farlo apparire sulla paginasi può fare il parsing per eliminare i tag pericolosiSpesso viene usato un campo hidden per conservare i dati tra un postback e l'altroLa modifica (tampering) dei campi hidden è banale e, se non controllata adeguatamente, può comportare un duro attacco.Soluzione:Criptarli prima di mandarli al clientDecrittarli dentro un try/catch quando tornano al serverProtezione del ViewstateIl Viewstate contiene lo stato dei controlli sul lato serverSe non è criptato, è facilmente visibile: Mac = machine authentication check La chiave e il metodo di encryption sono specificati nel tag del machine.config (autogenerazione)Per crearne e specificarne di nuovi nel web.config: Q312906Salvarlo sul server: le risorseMolti file non devono poter essere scaricati via http dall'utenteNel machine.config Asp.net protegge di default alcuni tipi di file dal download (.cs, .config, ...)Soluzione 1: proteggere il file via NTFS (Windows auth.)Soluzione 2: proteggere con asp.netAssociare i file da proteggere in IIS all'Isapi di Asp.netProteggere (ad esempio) i file mdb nel web.config:	Meccanismi diAutenticazioneIISAnonimaBasicDigestCertificateWindowsAsp.netPassportFormsIIS mappa l'utente su IUSR_nomemacchinaAsp.net lo vede come ""Utente non viene riconosciuto anche se è in LanUsano lo store delle credenziali di WindowsRichiedono una CAL per ogni utenteCredenziali in chiaro (necessita SSL)La password non viaggia sulla reteWindows Authenticationstep-by-stepWeb.config di default è pronto:Impostare le autorizzazioniDisabilitare l'autenticazione anonima in IIS ... (prossime slide)L'utente autenticato è: (stringa vuota se anonimo)L'utente usato dal worker process è:	?	 utente anonimo*	 tutti gli utentiSystem.Security.Principal.WindowsIdentity.GetCurrent().NameHttpContext.Current.User.Identity.NameInternet Information ServerIIS5 (Windows 2000 / XP Pro)Internet Information ServerIIS6 (Windows 2003)IIS6 Application poolImpersonation(solo con Windows Authentication)Il token di security a livello di thread viene sostituito con quello dell'utente autenticato.Il token di processo rimane invariato.Se l'utente è anonimo, viene impersonato IUSR_NomePcSintassi (web.config): IIS5 non può eseguire più worker process sotto identità diverseSoluzione: impersonation di un utente specificoI problemi architetturali di ImpersonationMolti vogliono usare la security di Sql serverSe il db è in rete, ci vuole delegationSi perde il controllo centralizzato della security(accedere a Ntfs, Ldap, risorse in rete, DB)La security 'per righe' fatta con sql server è un incuboI problemi tecnologici di ImpersonationIl token dell'utente non può essere usato per accedere a risorse remote (per es. la webapp non può usarlo per accedere un db in rete)La soluzione viene con Delegation che è di default disabilitata (proprio perchè è pericolosa!)Impersonation implica contesti diversi per ciascun utente. Questo significa niente connection poolingProtezione limitata. Un eventuale buffer overrun può usare sia il token di thread (impersonato) che quello di processo (worker process) usando RevertToSelf.Se chiamo un componente COM che sta in un apartment diverso, COM non userà il token di impersonazione ma quello di processoForms Authenticationstep-by-stepAbilitare l'autenticazione anonima in IISImpostare l'autenticazione e i suoi parametriImpostare le autorizzazioniCreare la pagina di login controllare l'utente e autorizzarlo	 	if(UserDB.Check(txtUsername.Text, txtPassword.Text)){	FormsAuthentication.RedirectFromLoginPage(	txtUsername.Text, ckRemember.Checked);}?	 utente anonimo*	 tutti gli utentiForms Authenticationgestire i ruoliGestire l'evento Application_AuthenticateRequestImpostare le autorizzazioni per singole parti del sitoprotected void Application_AuthenticateRequest(Object sender, EventArgs e){	UserDB.AssignRoles();}	L'ordine di valutazione delle autorizzazioni è dal primo vero l'ultimo.Il primo 'match' vince.Forms AuthenticationGestione utenti e ruoliSi costruisce una piccola classe:public class UserDB{	public static bool CheckUser(string Username, string Password)	{	return (Username == Password);// Solo per la demo!!! ;-)	}	public static void AssignRoles()	{	IPrincipal CurrentUser = HttpContext.Current.User;	if(CurrentUser != null && CurrentUser.Identity.IsAuthenticated &&	CurrentUser.Identity.AuthenticationType == "Forms")	{	string User = CurrentUser.Identity.Name;	string [] roles = GetRolesForUser(User);	CurrentUser = new System.Security.Principal.GenericPrincipal	(CurrentUser.Identity, roles);	}	}	private static string[] GetRolesForUser(string User)	{	string[] roles = new string[2];	roles[0] = "Administrators";	roles[1] = "Users";	return roles;	// Solo per la demo!	}}Forms AuthenticationGestione utentiGli utenti si possono anche gestire nel web.config ma è sconsigliato:	EsempioForms AuthenticationForms AuthenticationTipDiciamo di avere due Web Application ...Prendiamo in considerazione:Nome del cookie della Forms authenticationPath del cookieIl tag nel web.config(vedi  sono identici, l'utente potrà navigare da una all'altra senza doversi ri-autenticareSe almeno un di questi è diverso, è necessario ri-autenticarsiAutenticazione mistaWindows / FormsIl problema:In Windows Authentication, l'header HTTP "LOGON_USER" contiene il nome utenteSe IIS è configurato come anonimo, NON viene passato il nome utente anche se siamo loggati sul dominio... Ma la Forms authentication richiede che IIS sia configurato come anonimo(altrimenti compare la dialog di autenticazione)Autenticazione mistaWindows / FormsLa soluzione:Due pagine di Login: Forms e WindowsWeb.config configurato per la FormsAutorizzazione a tutti per la pagina di Login WindowsIIS – WebApp: abilitare accesso anonimoIIS – LoginWin.aspx: togliere accesso anonimoLoginWin.aspx: Crea il ticket della Forms authenticaion a partire dalle credenziali Windows	EsempioAutenticazione mistaForms Authenticationcon LDAPLDAP è un protocollo per dialogare con Active DirectoryPosso chiedere con LDAP:di verificare le credenziali di un utente su ADdi darmi l'elenco dei gruppi a cui appartiene quell'utenteIl codice per fare queste due cose è qui: 1: Public Function IsAuthenticated(ByVal domain As String, ByVal username As String, ByVal pwd As String) As BooleanMetodo 2: Public Function GetGroups() As StringUn ottimo motivo per usarla è nelle WebApp con autenticazione mista Windows + FormsDove siamo?AutenticazioneAutorizzazioneControlloImperativoControllodichiarativoRaffaeleIISBasic, Win, ...Asp.netPassport, FormIISNTFSAsp.netPagina si/noAsp.netPrincipalPermission, etc.Codice si/noPrincipal e IdentityLa sicurezza basata sui ruoli secondo il frameworkIIdentity rappresenta l'identità di un utenteWindowsIdentity, FormsIdentity, PassportIdentity, GenericIdentityIPrincipal contiene l'Identity e i ruoliWindowsPrincipal, GenericPrincipalAuthenticationTypeIsAuthenticatedNameString. "Windows", "Forms", "Passport", ...Bool. Indica se l'utente è autenticatoString. Nome dell'utenteIdentityIsInRoleIIdentity.Bool. Indica se l'utente appartiene ad un certo ruolo (gruppo)Sicurezzaimperativa e dichiarativaGli attrezzi del mestiere:IPrincipal.IsInRole()	 Imperativa (bool)PrincipalPermission.Demand()	 Imperativa (SecurityException)PrincipalPermissionAttribute	 Dichiarativa (SecurityException)if(User.IsInRole("Admins")) { ... }PrincipalPermission perm = new PrincipalPermission(null, "Admins");perm.Demand();PrincipalPermissionAttribute[PrincipalPermission(SecurityAction.Demand, Role="Admins")]public void MyAdminMethod() {...}Esempio SecureHandlerRole Based AuthorizationAsp.net 2.0DEMOMai dare informazioni preziosedefault: Qualsiasi informazione sugli errori può essere sfruttata da un hacker.Gli errori custom (che nascondono i dettagliati):mode="Off"  mostrati a nessunomode="On"  mostrati a tuttimode="RemoteOnly"  solo in remotoQuesto meccanismo è poco elasticoPossiamo usare un HttpModule per migliorare la situazione ....CustomErrorHandler(esempio)Web.Config:.... 	 Due pagine di gestione errore:SoftError.aspx (per utenti) e HardError.aspx (per admin)Il Module redirige gli errori a seconda del ruolo dell'utenteIl Module gestisce gli errori Http e le Exception... vediamo il codice ...EsempioCustomErrorHandlerPromemoriaInstallate XP SP2 ovunque!Aggiornare sempre con Windows UpdateProteggere i dati sensibiliDPAPI per criptare (vedi Pattern & Practices sul sito MSDN)ASPnet_setreg.exe per salvare credenziali criptate nel registry (per esempio di sql). Vedi Q329290 per i dettagli.Eseguire logging e auditingUsare UrlScan.  UrlScan Monitor (Lorenzo Barbieri) IIS LockDown (solo IIS5)Secure Configuration Wizard (solo IIS6  W2K3 SP1)Q & AMappare una estensione in IISAffinchè asp.net (e quindi handlers e moduli) abbiano il controllo di un tipo di file (.jpg nell'esempio) è necessario configurare IISslide post-sessionePath dell'isapi di asp.net (copiarla da quella di .aspx)Asp.net authorization bugNei giorni del workshop è stato scoperto un bug sulla canonicalization degli URL in asp.netColpisce asp.net dietro ad IIS5 non protetto da UrlScan.IIS6 neutralizza l'attacco proteggendo così asp.net.Se l'url  viene accesso via  , allora viene dato l'accesso nonostante la pagina Reserved.aspx sia tra quelle protette nel web.config con il tag Rimedi: seguire le indicazioni di  un HttpModule che canonicalizzi gli url prima che asp.net autorizzi la richiestausare UrlScanMaggiori dettagli (e link): post-sessione

File đính kèm:

  • pptDOT NET Security.ppt