63
AVOIDING THE OWASP Top 10 security exploits Friday, 2 November, 12

Owasp top 10

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Owasp top 10

AVOIDING THE OWASP Top 10 security exploits

Friday, 2 November, 12

Page 2: Owasp top 10

ME

Illustrator turned developer

Team Lead at FreshBooks

Lead developer of CakePHP

PHP developer for 7 years

Friday, 2 November, 12

Page 3: Owasp top 10

SECURITY

Friday, 2 November, 12

Page 4: Owasp top 10

SECURITY CONTINUUM

( )unusable unrestricted

Friday, 2 November, 12

Page 5: Owasp top 10

OWASPOpen Web Application Security Project

Friday, 2 November, 12

Page 6: Owasp top 10

OWASP TOP 10

Friday, 2 November, 12

Page 7: Owasp top 10

SQL INJECTION‘ OR 1=1 ‘--1

Friday, 2 November, 12

Page 8: Owasp top 10

RISKS

Permits query manipulation, and arbitrary SQL.

Bad guys can re-write your queries.

Friday, 2 November, 12

Page 9: Owasp top 10

$username = $_POST[‘username’];$password = $_POST[‘password’];

$query = “SELECT * FROM userWHERE username = ‘$username’AND password = ‘$password’”;

$user = $db->query($query);

SQL INJECTION EXAMPLE

Friday, 2 November, 12

Page 10: Owasp top 10

$username = “root”;$password = “‘ OR 1 = 1 --”;

USER INPUT

Friday, 2 November, 12

Page 11: Owasp top 10

FINAL QUERY

$query = “SELECT * FROM userWHERE username = ‘root’AND password = ‘‘ OR 1 = 1 --’”;

Friday, 2 November, 12

Page 12: Owasp top 10

FINAL QUERY

$query = “SELECT * FROM userWHERE username = ‘root’AND password = ‘‘ OR 1 = 1 --’”;

Friday, 2 November, 12

Page 13: Owasp top 10

PREVENTION

Use an ORM or Database abstraction layer that provides escaping. Doctrine, Zend\Table, and CakePHP all do this.

Use PDO and prepared statements.

Never put user data into a query.

Never use regular expressions, magic quotes, or addslashes()

Friday, 2 November, 12

Page 14: Owasp top 10

EXAMPLE (PDO)

$query = “SELECT * FROM userWHERE username = ?AND password = ?”;

$stmt = $db->prepare($query);$stmt->bindValue($username);$stmt->bindValue($password);$result = $db->execute();

Friday, 2 November, 12

Page 15: Owasp top 10

2XSS<script>alert(‘cross site scripting’);</script>

Friday, 2 November, 12

Page 16: Owasp top 10

RISKS

Allows bad guys to do things as the person viewing a page.

Steal identities, passwords, credit cards, hijack pages and more.

Friday, 2 November, 12

Page 17: Owasp top 10

XSS EXAMPLE

<p><?php echo $user[‘bio’]; ?>

</p>

Friday, 2 November, 12

Page 18: Owasp top 10

XSS EXAMPLE

<p><?php echo $user[‘bio’]; ?>

</p>

Friday, 2 November, 12

Page 19: Owasp top 10

You may be thinking, I can use regular expressionsto fix this.

Friday, 2 November, 12

Page 20: Owasp top 10

NOFriday, 2 November, 12

Page 21: Owasp top 10

PREVENTION

Regular expressions and strip_tags leave you vulnerable.

The only solution is output encoding.

Friday, 2 November, 12

Page 22: Owasp top 10

EXAMPLE

<p><?php echo htmlentities($user[‘bio’],ENT_QUOTES,‘UTF-8’

); ?></p>

Friday, 2 November, 12

Page 23: Owasp top 10

DANGERS

Manually encoding is error prone, and you will make a mistake.

Using a template library like Twig that provides auto-escaping reduces the chances of screwing up.

Encoding is dependent on context.

Friday, 2 November, 12

Page 24: Owasp top 10

3BROKEN AUTHENTICATION & SESSION MANAGEMENT

/index.php?PHPSESSID=pwned

Friday, 2 November, 12

Page 25: Owasp top 10

RISKS

Identity theft.

Firesheep was an excellent example.

Friday, 2 November, 12

Page 26: Owasp top 10

SESSION FIXATION EXAMPLE

<?phpsession_start();if (isset($_GET[‘sessionid’]) {session_id($_GET[‘sessionid’]);

}

Friday, 2 November, 12

Page 27: Owasp top 10

SESSION FIXATION EXAMPLE

<?phpsession_start();if (isset($_GET[‘sessionid’]) {session_id($_GET[‘sessionid’]);

}

Friday, 2 November, 12

Page 28: Owasp top 10

PREVENTION

Rotate session identifiers upon login/logout

Set the HttpOnly flag on session cookies.

Use well tested / mature libraries for authentication.

SSL is always a good idea.

Friday, 2 November, 12

Page 29: Owasp top 10

4INSECURE DIRECT OBJECT REFERENCE

Friday, 2 November, 12

Page 30: Owasp top 10

RISKS

Bad guys can access information they shouldn’t

Bad guys can modify data they shouldn’t.

Friday, 2 November, 12

Page 31: Owasp top 10

BROKEN PASSWORD UPDATE

<form action=”/user/update” method=”post”><input type=”hidden” name=”userid” value=”4654” /><input type=”text” name=”new_password” /><button type=”submit”>Save</button>

</form>

Friday, 2 November, 12

Page 32: Owasp top 10

PREVENTION

Remember hidden inputs are not really hidden, and can be changed by users.

Validate access to all things, don’t depend on things being hidden/invisible.

If you need to refer to the current user, use session data not form inputs.

Whitelist properties any form can update.

Friday, 2 November, 12

Page 33: Owasp top 10

5CROSS SITE REQUEST FORGERY

(CSRF)

Friday, 2 November, 12

Page 34: Owasp top 10

RISKS

Evil websites can perform actions for users logged into your site.

Side effects on GET can be performed via images or CSS files.

Remember the Gmail contact hack.

Friday, 2 November, 12

Page 35: Owasp top 10

CSRF EXAMPLE

Your app

Evil site

Friday, 2 November, 12

Page 36: Owasp top 10

CSRF EXAMPLE

Your app

Evil site

Login

Friday, 2 November, 12

Page 37: Owasp top 10

CSRF EXAMPLE

Your app

Evil site

Login

Accidentally visit

Friday, 2 November, 12

Page 38: Owasp top 10

CSRF EXAMPLE

Your app

Evil site

Login

Accidentally visit

Submit form for evil

Friday, 2 November, 12

Page 39: Owasp top 10

PREVENTION

Add opaque expiring tokens to all forms.

Requests missing tokens or containing invalid tokens should be rejected.

Friday, 2 November, 12

Page 40: Owasp top 10

SAMPLE CSRF VALIDATION

<?phpif (!$this->validCsrfToken($data, ‘csrf’)) {throw new ForbiddenException();

}

Friday, 2 November, 12

Page 41: Owasp top 10

6SECURITY MISCONFIGURATION

Friday, 2 November, 12

Page 42: Owasp top 10

RISKS

Default settings can be insecure, and intended for development not production.

Attackers can use misconfigured software to gain knowledge and access.

Friday, 2 November, 12

Page 43: Owasp top 10

PREVENTION

Know the tools you use, and configure them correctly.

Keep up to date on vulnerabilities in the tools you use.

Remove/disable any services/features you aren’t using.

Friday, 2 November, 12

Page 44: Owasp top 10

7INSECURE CRYPTOGRAPHIC STORAGEmd5(‘password’)

Friday, 2 November, 12

Page 45: Owasp top 10

RISKS

Weak cryptographic storage can easily be cracked.

Keys can be exposed with encrypted data.

Backups can contain encrypted data & keys.

Compromised passwords can be used to obtain information on other sites.

Friday, 2 November, 12

Page 46: Owasp top 10

BAD PASSWORD HASHING

$password;

md5($password);

sha1($password);

Friday, 2 November, 12

Page 47: Owasp top 10

BAD PASSWORD HASHING

$password;

md5($password);

sha1($password);

Friday, 2 November, 12

Page 48: Owasp top 10

USE BCRYPT FOR PASSWORDS

only you can prevent bad hashing

Friday, 2 November, 12

Page 49: Owasp top 10

PREVENTION

Use strong hashing/encryption.

Use one way hashing for passwords. Never use symmetric encryption for passwords.

Don’t collect data if you don’t need it.

Keep keys separate from data.

If you’re using symmetric encryption, be able to rotate keys easily.

Friday, 2 November, 12

Page 50: Owasp top 10

BCRYPT IN PHP

// password hashing (bcrypt)$hashed = crypt($pass,‘$2a$10$asdkbisloqi.fidsliz.df190.d9f40’);

// compare later$hashed = crypt($plaintext, $storedHash);

// check for match$hashed === $storedHash

Friday, 2 November, 12

Page 51: Owasp top 10

BCRYPT IN PHP

// password hashing (bcrypt)$hashed = crypt($pass,‘$2a$10$asdkbisloqi.fidsliz.df190.d9f40’);

// compare later$hashed = crypt($plaintext, $storedHash);

// check for match$hashed === $storedHash

Friday, 2 November, 12

Page 52: Owasp top 10

BCRYPT IN PHP

// password hashing (bcrypt)$hashed = crypt($pass,‘$2a$10$asdkbisloqi.fidsliz.df190.d9f40’);

// compare later$hashed = crypt($plaintext, $storedHash);

// check for match$hashed === $storedHash

Friday, 2 November, 12

Page 53: Owasp top 10

BCRYPT IN PHP

// password hashing (bcrypt)$hashed = crypt($pass,‘$2a$10$asdkbisloqi.fidsliz.df190.d9f40’);

// compare later$hashed = crypt($plaintext, $storedHash);

// check for match$hashed === $storedHash

Friday, 2 November, 12

Page 54: Owasp top 10

USE MCRYPT

// encrypt (rijndael)$value = mcrypt_encrypt(‘rijndael-256’, $secretKey, $ccnumber,‘cbc’, $iv

);

// decrypt$value = mcrypt_decrypt(‘rijndael-256’, $secretKey, $encrypted,‘cbc’, $iv

);

Friday, 2 November, 12

Page 55: Owasp top 10

8FAILURE TO RESTRICT URL ACCESS

Friday, 2 November, 12

Page 56: Owasp top 10

RISK

Hidden things can easily be found.

Creative people will eventually find your hidden URLs

Security through obscurity is a terrible idea.

Friday, 2 November, 12

Page 57: Owasp top 10

PREVENTION

Check access to all urls both when you generate links and more importantly when handling requests.

Don’t rely on things staying hidden.

Friday, 2 November, 12

Page 58: Owasp top 10

9INSUFFICIENT TRANSPORT LAYER PROTECTION

Friday, 2 November, 12

Page 59: Owasp top 10

SSL/TLSFriday, 2 November, 12

Page 60: Owasp top 10

10UNVALIDATED REDIRECTS & FORWARDS

Friday, 2 November, 12

Page 61: Owasp top 10

RISKS

Trusting user input for redirects opens phishing attacks.

Breach of trust with your users.

Friday, 2 November, 12

Page 62: Owasp top 10

PREVENTION

Don’t trust user data when handling redirects.

Friday, 2 November, 12

Page 63: Owasp top 10

QUESTIONS?

Friday, 2 November, 12