SlideShare una empresa de Scribd logo
1 de 57
Descargar para leer sin conexión
Hackers	
  vs	
  Developers	
  
Le	
  SQL	
  Injec4on
Simone	
  Onofri	
  -­‐	
  Techub	
  S.p.A.
v0.1
Introduzione
h;p://onofri.org/u/hvdsqli
Agenda
• Introduzione	
  
• Breve	
  Storia	
  della	
  SQL	
  Injec4on	
  
• Come	
  a;accare	
  
• Come	
  difendersi	
  
• Q&A	
  e	
  Conclusioni
Breve	
  storia	
  della	
  SQL	
  Injec4on
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).
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
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
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
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
morale?
E’	
  stata	
  compromessa	
  
(almeno	
  per	
  la	
  terza	
  volta	
  
negli	
  ulBmi	
  anni)	
  l’azienda	
  di	
  
Telecomunicazioni	
  Pakistana,	
  
controllata	
  dallo	
  stato,	
  
tramite	
  una	
  SQL	
  Injec4on	
  
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
Database	
  e	
  interrogazioni
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).
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.
Logica	
  booleana
Le	
  query	
  si	
  basano	
  sulla	
  logica	
  booleana,	
  
ripassiamo	
  brevemente	
  l’OR	
  e	
  l’AND:
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.
Come	
  a;accare	
  con	
  le	
  SQL	
  Injec4on
Authen4ca4on	
  
bypass
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.
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.
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.
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.
Probing
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.
Consigli	
  sulle	
  SQL	
  Injec4on
•Fai	
  il	
  reverse	
  engineering	
  della	
  query	
  
•Capisci	
  il	
  linguaggio	
  dell’interprete	
  
•Comprendi	
  la	
  logica	
  
•Sii	
  creaBvo/a
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).
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.
Fingerprin4ng/
Reverse	
  
Engineering
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
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
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
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
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
Exploi4ng
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)
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	
  ''.
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).
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
Tool	
  automa4ci
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à.	
  
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
Difendersi	
  dalle	
  SQL	
  Injec4on
A;acco
Vulnerabilità
<?php
// parameters
$author = $_GET['author'];
$sql_inline = "SELECT * FROM blogs_table WHERE
blogger_name = '$author'";
$res = $dbh->query($sql_inline);
?>
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();
?>
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	
  +)
FAQ
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
Q&A	
  e	
  Conclusioni
Mobile App
GRAZIE!
;-­‐)http://onofri.org/
http://twitter.com/simoneonofri
http://it.linkedin.com/simoneonofri
http://slideshare.net/simoneonofri
DOMANDE
?http://onofri.org/
http://twitter.com/simoneonofri
http://it.linkedin.com/simoneonofri
http://slideshare.net/simoneonofri

Más contenido relacionado

Similar a TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri

Web Application Security: Bug Hunting e Code Review
Web Application Security: Bug Hunting e Code ReviewWeb Application Security: Bug Hunting e Code Review
Web Application Security: Bug Hunting e Code ReviewAntonio Parata
 
Portofino 4: Creare Webapp da Database Esistenti in 30 Secondi
Portofino 4: Creare Webapp da Database Esistenti in 30 SecondiPortofino 4: Creare Webapp da Database Esistenti in 30 Secondi
Portofino 4: Creare Webapp da Database Esistenti in 30 SecondiPaolo Predonzani
 
05 sicurezza delle applicazioni per le aziende nel settore della pubblica uti...
05 sicurezza delle applicazioni per le aziende nel settore della pubblica uti...05 sicurezza delle applicazioni per le aziende nel settore della pubblica uti...
05 sicurezza delle applicazioni per le aziende nel settore della pubblica uti...IBM Italia Web Team
 
Sicurezza delle applicazioni web
Sicurezza delle applicazioni webSicurezza delle applicazioni web
Sicurezza delle applicazioni webAdvenias
 
CQRS ed Event Sourcing su Windows Azure: Applicazioni Distribuite, Scalabilit...
CQRS ed Event Sourcing su Windows Azure: Applicazioni Distribuite, Scalabilit...CQRS ed Event Sourcing su Windows Azure: Applicazioni Distribuite, Scalabilit...
CQRS ed Event Sourcing su Windows Azure: Applicazioni Distribuite, Scalabilit...DotNetMarche
 
Oracle Application Server 10g
Oracle Application Server 10gOracle Application Server 10g
Oracle Application Server 10gPaolo Campegiani
 
Linux Day 2018 Roma - Web Application Penetration Test (WAPT) con Linux
Linux Day 2018 Roma - Web Application Penetration Test (WAPT) con LinuxLinux Day 2018 Roma - Web Application Penetration Test (WAPT) con Linux
Linux Day 2018 Roma - Web Application Penetration Test (WAPT) con LinuxSimone Onofri
 
Dal requisito all'implementazione @ CD2010
Dal requisito all'implementazione @ CD2010Dal requisito all'implementazione @ CD2010
Dal requisito all'implementazione @ CD2010Mauro Servienti
 
Presentazione Cama_Primiceri_Atro
Presentazione Cama_Primiceri_AtroPresentazione Cama_Primiceri_Atro
Presentazione Cama_Primiceri_AtroBernadetteCama
 
2015-06 Roberto Boselli, Dal dato non strutturato alle ontologie
2015-06 Roberto Boselli, Dal dato non strutturato alle ontologie2015-06 Roberto Boselli, Dal dato non strutturato alle ontologie
2015-06 Roberto Boselli, Dal dato non strutturato alle ontologieAndrea Rossetti
 
Summary of: “Tracing Your Roots: Exploring the TLS Trust Anchor Ecosystem”
Summary of: “Tracing Your Roots: Exploring the TLS Trust Anchor Ecosystem”Summary of: “Tracing Your Roots: Exploring the TLS Trust Anchor Ecosystem”
Summary of: “Tracing Your Roots: Exploring the TLS Trust Anchor Ecosystem”Alessio Manià
 

Similar a TechDay: Hackers vs. Developers - Le SQL Injection - Simone Onofri (20)

Owasp parte1-rel1.1
Owasp parte1-rel1.1Owasp parte1-rel1.1
Owasp parte1-rel1.1
 
Web Application Security: Bug Hunting e Code Review
Web Application Security: Bug Hunting e Code ReviewWeb Application Security: Bug Hunting e Code Review
Web Application Security: Bug Hunting e Code Review
 
Portofino 4: Creare Webapp da Database Esistenti in 30 Secondi
Portofino 4: Creare Webapp da Database Esistenti in 30 SecondiPortofino 4: Creare Webapp da Database Esistenti in 30 Secondi
Portofino 4: Creare Webapp da Database Esistenti in 30 Secondi
 
Spring - Ecosistema
Spring - EcosistemaSpring - Ecosistema
Spring - Ecosistema
 
05 sicurezza delle applicazioni per le aziende nel settore della pubblica uti...
05 sicurezza delle applicazioni per le aziende nel settore della pubblica uti...05 sicurezza delle applicazioni per le aziende nel settore della pubblica uti...
05 sicurezza delle applicazioni per le aziende nel settore della pubblica uti...
 
Sicurezza delle applicazioni web
Sicurezza delle applicazioni webSicurezza delle applicazioni web
Sicurezza delle applicazioni web
 
CQRS ed Event Sourcing su Windows Azure: Applicazioni Distribuite, Scalabilit...
CQRS ed Event Sourcing su Windows Azure: Applicazioni Distribuite, Scalabilit...CQRS ed Event Sourcing su Windows Azure: Applicazioni Distribuite, Scalabilit...
CQRS ed Event Sourcing su Windows Azure: Applicazioni Distribuite, Scalabilit...
 
Oracle Application Server 10g
Oracle Application Server 10gOracle Application Server 10g
Oracle Application Server 10g
 
Linux Day 2018 Roma - Web Application Penetration Test (WAPT) con Linux
Linux Day 2018 Roma - Web Application Penetration Test (WAPT) con LinuxLinux Day 2018 Roma - Web Application Penetration Test (WAPT) con Linux
Linux Day 2018 Roma - Web Application Penetration Test (WAPT) con Linux
 
Dal requisito all'implementazione @ CD2010
Dal requisito all'implementazione @ CD2010Dal requisito all'implementazione @ CD2010
Dal requisito all'implementazione @ CD2010
 
ORM - Introduzione
ORM - IntroduzioneORM - Introduzione
ORM - Introduzione
 
Presentazione Cama_Primiceri_Atro
Presentazione Cama_Primiceri_AtroPresentazione Cama_Primiceri_Atro
Presentazione Cama_Primiceri_Atro
 
Semantic Search Engine
Semantic Search EngineSemantic Search Engine
Semantic Search Engine
 
Infosecurity 2008
Infosecurity 2008Infosecurity 2008
Infosecurity 2008
 
Sql injection - intro
Sql injection - introSql injection - intro
Sql injection - intro
 
Linux Day2005
Linux Day2005Linux Day2005
Linux Day2005
 
2015-06 Roberto Boselli, Dal dato non strutturato alle ontologie
2015-06 Roberto Boselli, Dal dato non strutturato alle ontologie2015-06 Roberto Boselli, Dal dato non strutturato alle ontologie
2015-06 Roberto Boselli, Dal dato non strutturato alle ontologie
 
AAI
AAI AAI
AAI
 
Owasp parte3
Owasp parte3Owasp parte3
Owasp parte3
 
Summary of: “Tracing Your Roots: Exploring the TLS Trust Anchor Ecosystem”
Summary of: “Tracing Your Roots: Exploring the TLS Trust Anchor Ecosystem”Summary of: “Tracing Your Roots: Exploring the TLS Trust Anchor Ecosystem”
Summary of: “Tracing Your Roots: Exploring the TLS Trust Anchor Ecosystem”
 

Más de Codemotion

Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...Codemotion
 
Pompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending storyPompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending storyCodemotion
 
Pastore - Commodore 65 - La storia
Pastore - Commodore 65 - La storiaPastore - Commodore 65 - La storia
Pastore - Commodore 65 - La storiaCodemotion
 
Pennisi - Essere Richard Altwasser
Pennisi - Essere Richard AltwasserPennisi - Essere Richard Altwasser
Pennisi - Essere Richard AltwasserCodemotion
 
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...Codemotion
 
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019Codemotion
 
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019Codemotion
 
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 - Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 - Codemotion
 
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...Codemotion
 
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...Codemotion
 
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...Codemotion
 
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...Codemotion
 
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019Codemotion
 
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019Codemotion
 
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019Codemotion
 
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...Codemotion
 
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...Codemotion
 
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019Codemotion
 
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019Codemotion
 
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019Codemotion
 

Más de Codemotion (20)

Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
 
Pompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending storyPompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending story
 
Pastore - Commodore 65 - La storia
Pastore - Commodore 65 - La storiaPastore - Commodore 65 - La storia
Pastore - Commodore 65 - La storia
 
Pennisi - Essere Richard Altwasser
Pennisi - Essere Richard AltwasserPennisi - Essere Richard Altwasser
Pennisi - Essere Richard Altwasser
 
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
 
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
 
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
 
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 - Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
 
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
 
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
 
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
 
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
 
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
 
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
 
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
 
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
 
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
 
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
 
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
 
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
 

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

  • 1. Hackers  vs  Developers   Le  SQL  Injec4on Simone  Onofri  -­‐  Techub  S.p.A. v0.1
  • 3.
  • 5. Agenda • Introduzione   • Breve  Storia  della  SQL  Injec4on   • Come  a;accare   • Come  difendersi   • Q&A  e  Conclusioni
  • 6. Breve  storia  della  SQL  Injec4on
  • 7. 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).
  • 8. 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
  • 9. 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
  • 10. 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
  • 11. 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
  • 13. E’  stata  compromessa   (almeno  per  la  terza  volta   negli  ulBmi  anni)  l’azienda  di   Telecomunicazioni  Pakistana,   controllata  dallo  stato,   tramite  una  SQL  Injec4on  
  • 14. 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
  • 16. 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).
  • 17. 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.
  • 18. Logica  booleana Le  query  si  basano  sulla  logica  booleana,   ripassiamo  brevemente  l’OR  e  l’AND:
  • 19. 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.
  • 20. Come  a;accare  con  le  SQL  Injec4on
  • 22. 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.
  • 23. 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.
  • 24. 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.
  • 25. 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.
  • 27. 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.
  • 28. Consigli  sulle  SQL  Injec4on •Fai  il  reverse  engineering  della  query   •Capisci  il  linguaggio  dell’interprete   •Comprendi  la  logica   •Sii  creaBvo/a
  • 29. 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).
  • 30. 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.
  • 32. 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
  • 33. 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
  • 34. 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
  • 35. 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
  • 36. 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
  • 38. 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)
  • 39. 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  ''.
  • 40. 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).
  • 41. 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
  • 43. 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à.  
  • 44. 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
  • 47. Vulnerabilità <?php // parameters $author = $_GET['author']; $sql_inline = "SELECT * FROM blogs_table WHERE blogger_name = '$author'"; $res = $dbh->query($sql_inline); ?>
  • 48. 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(); ?>
  • 49. 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  +)
  • 50.
  • 51. FAQ
  • 52. 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
  • 55.