Smau Milano 2102 Maurizio Del Corno

21
Rails (In)Security

description

Rails In Security

Transcript of Smau Milano 2102 Maurizio Del Corno

Page 1: Smau Milano 2102 Maurizio Del Corno

Rails (In)Security

Page 2: Smau Milano 2102 Maurizio Del Corno

$ whoami

Maurizio Del Corno

Security Consultant

Developer

Page 3: Smau Milano 2102 Maurizio Del Corno

DAFAQ IS RAILS?

• Rails è un Framework

• Creato da @dhh

• Costruito su Ruby

Page 4: Smau Milano 2102 Maurizio Del Corno

INSTALL @ WINDOWS

http://railsinstaller.org/

Page 5: Smau Milano 2102 Maurizio Del Corno

SECURE BY DESIGN

• CSRF Protection

• SQLi praticamente impossibili

• Tutto escapato

Page 6: Smau Milano 2102 Maurizio Del Corno

MA QUESTO NON CI SALVA DEL TUTTO!

Page 7: Smau Milano 2102 Maurizio Del Corno

REGULAR EXPRESSION IN RUBY ovvero come RTFM ci avrebbe potuto salvare

UOT?

Page 8: Smau Milano 2102 Maurizio Del Corno

STOP! HAMMER TIME!

Page 9: Smau Milano 2102 Maurizio Del Corno
Page 10: Smau Milano 2102 Maurizio Del Corno

MATCH vs #{HTTP_VERB}

Page 11: Smau Milano 2102 Maurizio Del Corno

Rails implementa una protezione contro il CSRF…

…ma solo su POST (e giustamente!)

Page 12: Smau Milano 2102 Maurizio Del Corno

Per definire una rotta possiamo usare il verbo HTTP

post ‘/path/che/vogliamo’ => ‘controller#method’

match ‘/path/che/vogliamo’ => ‘controller#method’

Oppure possiamo usare la funzione “match”

Page 13: Smau Milano 2102 Maurizio Del Corno

RISULTATO:

POST

POST

POST

GET

U MAD BRO?

Page 14: Smau Milano 2102 Maurizio Del Corno

ENCODERS

Rails fa escaping di tutto di default… o quasi!

JSON, Javascript & CSS vengono passati “as is”!

Page 15: Smau Milano 2102 Maurizio Del Corno

HACKERS

MASS ASSIGNMENT

Page 16: Smau Milano 2102 Maurizio Del Corno

C’era una volta

E il suo grande amico…

…BENDER?!?!

Page 17: Smau Milano 2102 Maurizio Del Corno
Page 18: Smau Milano 2102 Maurizio Del Corno

MA COME E’ POSSIBILE?

Abuso della funzione Model.update_attributes(*args)

In questo modo il nostro controller accetta parametri del tipo:

=> /path?model[attr1]=val&model[attr1]=val&model[attr1]=val

E possiamo aggiornali come:

=> Model.update_attributes(params[:model])

…e se tra i parametri inseriamo qualcosa che nel form non c’è?

Page 19: Smau Milano 2102 Maurizio Del Corno

Come per esempio inserire tra le chiavi pubbliche la nostra?

<input type=“hidden” value=“USER_ID” name=“public_key[user_id]”>

L’avete messo attr_accessible vero??

Page 20: Smau Milano 2102 Maurizio Del Corno

ALL’INIZIO AVEVO DETTO CHE LE SQLi ERANO

“PRATICAMENTE” IMPOSSIBILI

http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2012-2695

Page 21: Smau Milano 2102 Maurizio Del Corno

GRAZIE DELL’ATTENZIONE