techday: hackers vs. developers - le sql injection - simone onofri

57
Hackers vs Developers Le SQL Injec4on Simone Onofri Techub S.p.A. v0.1

Upload: codemotion

Post on 15-Jul-2015

334 views

Category:

Technology


4 download

TRANSCRIPT

Page 1: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Hackers  vs  Developers  Le  SQL  Injec4onSimone  Onofri  -­‐  Techub  S.p.A.

v0.1

Page 2: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Introduzione

Page 3: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri
Page 4: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

h;p://onofri.org/u/hvdsqli

Page 5: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Agenda

• Introduzione  • Breve  Storia  della  SQL  Injec4on  • Come  a;accare  • Come  difendersi  • Q&A  e  Conclusioni

Page 6: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Breve  storia  della  SQL  Injec4on

Page 7: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Web  e  SQL  Injec4on

Tecnicamente  le  prime  SQL  InjecBon  hanno  cominciato  ad  essere  presenB  sul  web  da  

quando  i  vari  interpreB  hanno  permesso  alle  pagine  web  di  mostrare  daB  collegandosi  ai  

database  e  quindi  mostrarne  i  daB.  Pensiamo  a  PHP  (1995)  e  ad  ASP  (1996).

Page 8: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

La  prima  famosa  SQL  Injec4on

Risale  al  1998  da  un  arBcolo  firmato  da  Rain  Forest  Puppy  su  Phrack  “NT  Web  Technology  

VulnerabiliBes”  che  conBene  diverse  vulnerabilità  che  dipendono  dalle  tecnologie  

Web.   SELECT * FROM table WHERE x=1 SELECT * FROM table WHERE y=5

Page 9: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

La  risposta  alla  prima  famosa  SQL  Injec4on

“Secondo  loro  (il  vendor)  quello  di  cui  sBamo  per  parlare  non  è  un  problema”  

—  Rain  Forest  Puppy  -­‐  Phrack  Issue  #54

Page 10: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

La  famosa  raccomandazione

“Non  date  per  scontato  che  l’input  dell’utente  sia  ok  quando  (lo  inserite)  in  query  SQL”  

—  Rain  Forest  Puppy  -­‐  Phrack  Issue  #54

Page 11: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

2003/2004  (a;acks)

2007  (vulnerabili4es)

2010  (risks)

2013  (risks)

Unvalidated  Input Cross  Site  Scrip4ng  (XSS) Injec4on Injec4on

Broken  Access  Control Injec4on  Flaws Cross-­‐Site  Scrip4ng  (XSS) Broken  Authen4ca4on  and  Session  Management

Broken  Authen4ca4on  and  Session  Management

Malicious  File  Execu4on Broken  Authen4ca4on  and  Session  Management Cross-­‐Site  Scrip4ng  (XSS)

Cross  Site  Scrip4ng  (XSS)  Flaws

Insecure  Direct  Object  Reference

Insecure  Direct  Object  References

Insecure  Direct  Object  References

Buffer  Overflows Cross  Site  Request  Forgery  (CSRF)*

Cross-­‐Site  Request  Forgery  (CSRF) Security  Misconfigura4on

Injec4on  Flaws Informa4on  Leakage  and  Improper  Error  Handling Security  Misconfigura4on Sensi4ve  Data  Exposure

Improper  Error  Handling Broken  Authen4ca4on  and  Session  Management

Insecure  Cryptographic  Storage

Missing  Func4on  Level  Access  Control

Insecure  Storage Insecure  Cryptographic  Storage

Failure  to  Restrict  URL  Access

Cross-­‐Site  Request  Forgery  (CSRF)

Denial  of  Service Insecure  Communica4ons Insufficient  Transport  Layer  Protec4on

Using  Known  Vulnerable  Components

Insecure  Configura4on  Management

Failure  to  Restrict  URL  Access

Unvalidated  Redirects  and  Forwards

Unvalidated  Redirects  and  Forwards

Page 12: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

morale?

Page 13: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

E’  stata  compromessa  (almeno  per  la  terza  volta  

negli  ulBmi  anni)  l’azienda  di  Telecomunicazioni  Pakistana,  

controllata  dallo  stato,  tramite  una  SQL  Injec4on  

Page 14: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Cosa  dicono  i  trend  sulla  sicurezza?

“gli  aZaccanB  tendono  a  sfruZare  vulnerabilità  che  sono  presenB  a  causa  di  pra4che  di  

sicurezza  basilari  inadeguate”  —  Rapporto  Melani

Page 15: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Database  e  interrogazioni

Page 16: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Cosa  sono  i  database  relazionali?

I  database  o  basi  di  daB  sono  degli  archivi  organizzaB  tramite  delle  relazioni.  I  daB  sono  contenuB  all’interno  di  alcune  tabelle  che  hanno  delle  intestazioni  (campi)  in  cui  i  daB  sono  organizzaB  in  delle  righe  (o  record).

Page 17: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Cos’è  SQL?

SQL  (Structured  Query  Language)  è  un  linguaggio  struZurato  per  eseguire  

interrogazioni  a  un  database  relazionale.  Possiamo  avere  una  serie  di  query  esempio  per  richiedere  dei  daB  (SELECT),  inserirli  (INSERT),  aggiornarli  (UPDATE)  e  cancellarli  (DELETE).  

Altri  4pi  di  query  servono  per  creare  o  cancellare  database,  utenB,  tabelle  o  sono  comandi  come  es.  per  spegnere  il  database.

Page 18: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Logica  booleana

Le  query  si  basano  sulla  logica  booleana,  ripassiamo  brevemente  l’OR  e  l’AND:

Page 19: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Perchè  devo  sapere  queste  cose?

Per  eseguire  delle  SQL  InjecBon  è  necessaria  una  conoscenza  approfondita  di  SQL,  dei  

database  e  più  nello  specifico  del  linguaggio  supportato  dal  database  uBlizzato  

dall’applicazione  che  sBamo  aZaccando.

Page 20: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Come  a;accare  con  le  SQL  Injec4on

Page 21: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Authen4ca4on  bypass

Page 22: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Authen4ca4on  Bypass  by  SQL  Injec4on

• E’  un  Bpico  aZacco  “vecchio  sBle”.  • Non  è  ovviamente  sempre  possibile,  dipende  da  come  è  scriZa  la  query  che  verifica  l’autenBcazione.  

• L’impaZo  è  estremamente  criBco,  è  infa`  possibile  personificare  gli  utenB.

Page 23: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Come  funziona?

• AnzituZo  è  fondamentale  capire  la  query  che  è  “dietro”  la  richiesta.  

• Tipicamente  la  pagina  di  login  è  qualche  cosa  come:  • SELECT  *  FROM  users  WHERE  use_name  =  ‘simone’  AND  use_password  =  “pwd”;  

• Che  cerca  una  corrispondenza  tra  il  nome  utente  e  la  password  inserita  tramite  GET/POST.  

• Se  inseriamo  quindi  come  username:  • simone’—  

• La  query  sarà:  • SELECT  *  FROM  users  WHERE  use_name  =  ‘simone’—  ‘AND  use_password  =  “pwd”  

• Quindi  viene  verificato  solo  se  l’utente  esiste  o  meno.

Page 24: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Come  funziona?

• Se  però  non  conosciamo  lo  username,  al  neZo  di  quelli  Bpici  come  “admin”,  “administrator”,  o  se  si  uBlizza  un  CMS  basta  andare  a  cercare  la  documentazione,  come  fare?  

• E’  possibile  usare  ‘  OR  1=1—  o  comunque  generare  una  condizione  logica  che  sia  sempre  vera.  

• Cosa  succede  quindi?  il  database  seleziona  tuZo  il  contenuto  della  tabella  users  trovando  sicuramente  almeno  una  corrispondenza.

Page 25: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Avvertenze

• A;enzione:  quando  fate  le  prove  con  OR  1=1,  se  ci  sono  molB  record  nella  tabella  è  possibile  che  il  server  impieghi  molto  tempo  a  rispondere,  oppure  potrebbe  andare  in  Bmeout,  è  consigliabile  uBlizzare  una  strategia  del  Bpo  AND  1=1  e  AND  1=0  quindi  condizioni  logiche  sempre  vere  o  sempre  false  che  però  fanno  tornare  meno  record.  

• Nota:  nell’esempio  precedente  abbiamo  visto  come  -­‐  probabilmente  -­‐  la  password  sia  in  chiaro  (MALE),  quando  si  cerca  il  bypass  infa`  è  più  probabile  trovare  una  SQL  InjecBon  nello  username.  

• Perché  tuZo  questo  probabile?  Ogni  applicazione  è  diversa.

Page 26: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Probing

Page 27: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Quando  si  verificano  le  SQL  Injec4on

Le  vulnerabilità  di  Bpo  InjecBon  si  verificano  quando  da4  non  valida4  vengono  inviaB  come  parte  di  una  richiesta  verso  un  interprete,  permeZendo  di  eseguire  richieste  o  comandi  

normalmente  non  previsB  dall’applicazione.    L’impaZo  di  queste  vulnerabilità  è  spesso  alto  e  permeZe  di  

compromeZere  il  sistema  o  i  daB.

Page 28: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Consigli  sulle  SQL  Injec4on

•Fai  il  reverse  engineering  della  query  •Capisci  il  linguaggio  dell’interprete  •Comprendi  la  logica  •Sii  creaBvo/a

Page 29: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Passo  dopo  passo  (come  ispirazione)

1.Verifica  il  Bpo  di  dato  che  l’applicazione  si  aspeZa  (es.  numero,  stringa,  data,  uuid  ecc..).  2.Cerca  di  capire  e  “rompere”  la  query  uBlizzando  caraZeri  Bpici  dei  delimitatori  (es.  ‘,  ’’,  “),  numeri  posiBvi  e  negaBvi,  aZenzione  ai  LIKE  e  alle  date.  3.IdenBfica  le  differenze  nelle  risposte  (es.  daB  caricaB,  errori,  pagine  bianche).

Page 30: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Esempio

•Applicazione  che  visualizza  le  noBzie:  •hZp://www.example.com/news.php?id=123  

•Solitamente  le  query  in  questo  caso  sono:  •SELECT  *  FROM  news  WHERE  new_id  =  $param  AND  new_published  =  1  

•Un  primo  test  può  essere:  •OR  1=1—,  ma  aZenzione  ai  DoS  •AND  1=1—  e  AND  1=0—  valutando  la  differenza  nelle  risposte  

•Dato  che  è  un  numero  supponiamo  non  siano  necessarie  delle  parentesi,  ma  dobbiamo  considerare  che  se  la  query  è  complessa  possiamo  lasciare  aperte  es.  delle  parentesi.

Page 31: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Fingerprin4ng/Reverse  

Engineering

Page 32: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Fingerprin4ng  e  Reverse  Engineering

Una  volta  idenBficata  la  presenza  potenziale  di  una  SQL  InjecBon  è  necessario  verificarla  e  quindi  sfruZarla.  E’  di  cruciale  importanza  capire  almeno:  •Il  4po  di  dato  che  sBamo  manipolando  •Il  4po  di  query  dove  siamo  dentro  •Dove  siamo  nella  query  •Il  Bpo  di  database

Page 33: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Capire  il  4po  di  dato

•Lo  possiamo  valutare  navigando  nell’applicazione  e  vedendo  quali  sono  i  daB  che  normalmente  l’applicazione  si  aspeZa,  Bpicamente:  

•Numeri  •Stringhe  •Date  •IdenBficaBvi

Page 34: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Capire  il  4po  di  query

Anche  in  questo  caso  il  contesto  applicaBvo  è  importante.  SBamo:  •Visualizzando  dei  daB?  >  SELECT  •Modificando/Aggiornando  dei  daB?  >  UPDATE  •Cancellando  dei  daB?  >  DELETE  A"enzione  a  query  mul0ple  eseguite  dalla  stessa  pagina

Page 35: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Capire  dove  siamo  nella  query

Consideriamo  sempre  che  possiamo  essere  in  più  punB  della  query,  quindi  la  nostra  manipolazione  può  avere  effe`  

differenB.  

SELECT  *  FROM  tabella  WHERE  campo  =  valore  ORDER  BY  campo

Page 36: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Capire  il  4po  di  database

Passo  non  poco  difficile  è  capire  il  Bpo  di  database  (es.  Microsow,  Oracle,  Postgre,  DB2…)  e  la  sua  versione  specifica,  in  quanto  alcune  funzionalità  sono  previste  solo  per  determinate  versioni.  Un  piccolo  cheatsheet:  • Concatenare  le  stringhe:  

• Oracle:    ‘||’FOO  • MsSQL:  ‘+’FOO  • MySQL:  ‘  ‘FOO  

• Calcoli  sui  numeri:  • Oracle:  BITAND(1,1)-­‐BITAND(1,1)  • MS-­‐SQL:  @@PACK_RECEIVED-­‐@@PACK_RECEIVED  • MySQL:  CONNECTION_ID()-­‐CONNECTION_ID()  

• Commen4  di  MySQL:  • Se  MySQL  trova  questo  commento    /*!32302  and  1=0*/  lo  eseguirà  solo  se  la  sua  versione  è  maggiore  o  uguale  alla  3.23.02

Page 37: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Exploi4ng

Page 38: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Come  sfru;are  le  vulnerabilità

Una  volta  oZenute  le  informazioni  sulla  query  e  sul  database  possiamo  procedere  con  lo  sfruZamento.  E’  possibile  uBlizzare  differenB  tecniche  secondo  il  contesto:  In  alcuni  casi  l’errore  SQL  è  visibile,  il  che  semplifica  molto  il  lavoro.  In  altri  casi  dobbiamo  capire  l’esito  delle  nostre  richieste  capendo  quando  l’applicazione:  •Esegue  il  nostro  codice,  inserendo  delle  condizioni  di  vero  o  falso  (seleziona  solo  alcuni  daB)  •La  query  non  è  correZa  (es.  WSOD)

Page 39: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Errori  4pici

•ORA-­‐01756:  quoted  string  not  properly  terminated  •You  have  an  error  in  your  SQL  syntax;  check  the  manual  that  corresponds  to  your  MariaDB  server  version  for  the  right  syntax  to  use  near  ‘'  •Error:  You  have  an  error  in  your  SQL  syntax;  check  the  manual  that  corresponds  to  your  MySQL  server  version  for  the  right  syntax  to  use  near  '''  at  line  •Unclosed  quotaBon  mark  awer  the  character  string  ''.

Page 40: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

La  tecnica  UNION

•La  UNION  è  una  delle  tecniche  più  comuni  per  l’estrazione  di  daB.  •L’operatore  UNION  è  uBlizzato  per  combinare  i  risultaB  di  più  query:  la  prima  è  quella  inclusa  dall’applicazione,  la  seconda  è  quella  da  cui  vogliamo  estrarre  i  daB.  •Quando  facciamo  una  UNION  dobbiamo  considerare  che:  

•Le  due  query  devono  avere  lo  stesso  numero  di  colonne  (es.  ORA-­‐01789:  query  block  has  incorrect  number  of  result  columns)  •Le  colonne  nella  stessa  posizione  devono  essere  dello  stesso  Bpo  o  uno  compaBbile.  (es.  ORA-­‐01790:  expression  must  have  same  datatype  as  corresponding  expression).  NULL  è  spesso  nostro  amico  •Dobbiamo  conoscere  almeno  il  nome  di  una  tabella  (ecco  anche  perchè  facciamo  il  fingerprinBng).

Page 41: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Come  fare?

•Trova  il  nome  di  una  tabella  che  esiste  e  cui  hai  accesso  (es.  DUAL  in  Oracle  o  anche  nulla  in  MS-­‐SQL)  •Capisci  il  numero  di  colonne:  

•‘  UNION  SELECT  NULL—  •‘  UNION  SELECT  NULL,  NULL—  •‘  UNION  SELECT  NULL,  NULL,  NULL—  

•Trova  almeno  un  Bpo  di  dato  come  stringa  •‘  UNION  SELECT  ‘a’,  NULL,  NULL—  

•Estrai  le  informazioni  •UNION  SELECT  banner,  NULL,  NULL  from  v$version

Page 42: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Tool  automa4ci

Page 43: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Strumen4  automa4ci

•Esistono  numerosi  strumenB  automaBci  tramite  i  quali  è  possibile  idenBficare  e  sfruZare  le  SQL  InjecBon.  •E’  bene  comunque  imparare  a  sfruZarle  a  mano!  •Non  sempre  gli  strumenB  automaBci  sono  di  aiuto:  

•In  quel  caso  è  possibile  modificare  lo  strumento  se  è  open  source.  •Oppure  farsi  una  propria  serie  di  script  nel  proprio  linguaggio  preferito  per  sfruZare  la  vulnerabilità.  

Page 44: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Sqlmap

•Sqlmap  è  uno  dei  più  potenB  strumenB  per  le  SQL  InjecBon,  consideriamo  il  nostro  target  testasp.  •Scaricare:  hZp://sqlmap.org/  •Lanciare:  

•python  sqlmap.py  -­‐u  “hBp://testasp.vulnweb.com/showthread.asp?id=1"  •python  sqlmap.py  -­‐u  "hBp://testasp.vulnweb.com/showthread.asp?id=1"  -­‐-­‐users  •python  sqlmap.py  -­‐u  "hBp://testasp.vulnweb.com/showthread.asp?id=1"  -­‐-­‐passwords    •python  sqlmap.py  -­‐u  "hBp://testasp.vulnweb.com/showthread.asp?id=1"  -­‐-­‐dbs

Page 45: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Difendersi  dalle  SQL  Injec4on

Page 46: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

A;acco

Page 47: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Vulnerabilità

<?php

// parameters

$author = $_GET['author'];

$sql_inline = "SELECT * FROM blogs_table WHERE blogger_name = '$author'";

$res = $dbh->query($sql_inline);

?>

Page 48: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Contromisura

<?php

// parameters

$author = $_GET['author'];

$sql_prep = "SELECT * FROM blogs_table WHERE blogger_name = ?";

$res = $dbh->prepare($sql_prep);

$res->bindParam(1, $author, PDO::PARAM_STR, 16);

$res->execute();

?>

Page 49: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Suggerimen4

E’  possibile  miBgare  questa  vulnerabilità  uBlizzando  API  parametriche  per  interfacciarsi  agli  interpreB  oppure  regole  di  validazione  a  whitelist  per  verificare  il  dato.  Inoltre,  prima  della  validazione,  bisogna  eseguire  una  normalizzazione  (canonicalizaBon)  e  codificare  correZamente  il  dato  (encoding),  quindi  applicare  le  regole  specifiche  dell’interprete  per  gesBre  i  cara;eri  speciali  (escaping),  come  ad  esempio:  

•CaraZeri  per  la  delimitazione  delle  stringhe  (es.  ‘  “  )  

•CaraZeri  o  sequenze  intepretate  (es.  %  -­‐-­‐  #  /*)  •Operatori  o  funzioni  (es.  AND  OR  NOT  SLEEP  ||  CHR  +)

Page 50: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri
Page 51: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

FAQ

Page 52: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Frequently  Asked  Ques4ons

• I  database  NoSQL  sono  vulnerabili? Si  

• Esistono  altri  Bpi  di  InjecBon? Si  es.  LDAP,  ORM,  XML  InjecRon,  XXE,  SSI,  XPath,  XQuery,  SPARQL,  IMAP/SMTP,  Code,  Command  

• Se  uso  il  framework  X  sono  invulnerabile? No,  dipende  da  come  si  usa  

• Come  posso  prevenire? Query  parametriche*,  validazione  whitelist/blacklist*  

• Un  Web  ApplicaBon  Firewall  mi  protegge? Ni*  

• Su  una  Web  App  HTML5  posso  avere  SQL  InjecBon? Si,  se  si  usano  i  Web  Database  

• Come  si  fa  la  SQL  InjecBon  sul  database  X?  (dove  X  è  il  tuo  database)Leggi  il  manuale  e  trova  le  funzioni  del  database  (e  versione)  specifica

Page 53: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Q&A  e  Conclusioni

Page 54: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Mobile App

Page 55: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri
Page 56: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

GRAZIE!

;-­‐)http://onofri.org/ http://twitter.com/simoneonofri http://it.linkedin.com/simoneonofri http://slideshare.net/simoneonofri

Page 57: TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

DOMANDE

?http://onofri.org/ http://twitter.com/simoneonofri http://it.linkedin.com/simoneonofri http://slideshare.net/simoneonofri