Dip Your Toes in the Sea of Security

88
@asgrim Dip Your Toes in the Sea of Security James Titcumb PHP Benelux 2017

Transcript of Dip Your Toes in the Sea of Security

Page 1: Dip Your Toes in the Sea of Security

@asgrim

Dip Your Toesin the Sea of Security

James TitcumbPHP Benelux 2017

Page 3: Dip Your Toes in the Sea of Security

@asgrim

Page 4: Dip Your Toes in the Sea of Security

@asgrim

Some simple code...

<?php

$a = (int)filter_var($_GET['a'],

FILTER_SANITIZE_NUMBER_INT);

$b = (int)filter_var($_GET['b'],

FILTER_SANITIZE_NUMBER_INT);

$result = $a + $b;

printf('The answer is %d', $result);

Page 5: Dip Your Toes in the Sea of Security

@asgrim

Page 6: Dip Your Toes in the Sea of Security

@asgrim

The Golden Rules

Page 7: Dip Your Toes in the Sea of Security

@asgrim

The Golden Rules(my made up golden rules)

Page 8: Dip Your Toes in the Sea of Security

@asgrim

1. Keep it simple

Page 9: Dip Your Toes in the Sea of Security

@asgrim

2. Know the risks

Page 10: Dip Your Toes in the Sea of Security

@asgrim

3. Fail securely

Page 11: Dip Your Toes in the Sea of Security

@asgrim

4. Don’t reinvent the wheel

Page 12: Dip Your Toes in the Sea of Security

@asgrim

5. Never trust anything

Page 13: Dip Your Toes in the Sea of Security

@asgrim

OWASP& the OWASP Top 10

https://www.owasp.org/

Page 14: Dip Your Toes in the Sea of Security

@asgrim

Application Security(mainly PHP applications)

Page 15: Dip Your Toes in the Sea of Security

@asgrim

Always remember…

Filter InputEscape Output

Page 16: Dip Your Toes in the Sea of Security

@asgrim© 2003 Disney/Pixar. All Rights Reserved.

SQL Injection (#1)

Page 17: Dip Your Toes in the Sea of Security

@asgrim

SQL Injection (#1)

http://xkcd.com/327/

Page 18: Dip Your Toes in the Sea of Security

@asgrim

SQL Injection (#1)

Page 19: Dip Your Toes in the Sea of Security

@asgrim

SQL Injection (#1)

<?php

// user_id=1; DROP TABLE users; --

$user_id = $_GET['user_id'];

$sql = "

SELECT * FROM users

WHERE user_id = {$user_id}";

$db->execute($sql); ✘

Page 20: Dip Your Toes in the Sea of Security

@asgrim

SQL Injection (#1)

<?php

$user_id = $_GET['user_id'];

$sql = "

SELECT * FROM users

WHERE user_id = :userid";

$stmt = $db->prepare($sql);

$stmt->bind('userid', $user_id);

$stmt->execute();✓

Page 21: Dip Your Toes in the Sea of Security

@asgrim© 2003 Disney/Pixar. All Rights Reserved.

Page 22: Dip Your Toes in the Sea of Security

@asgrim

exec($_GET)

https://github.com/search?q=exec%28%24_GET&ref=cmdform&type=Code

Page 23: Dip Your Toes in the Sea of Security

@asgrim

eval()

https://github.com/search?q=eval%28%24_GET&type=Code&ref=searchresults

Page 24: Dip Your Toes in the Sea of Security

@asgrim

Cross-Site Scripting / XSS (#3)

© 2003 Disney/Pixar. All Rights Reserved.

Page 25: Dip Your Toes in the Sea of Security

@asgrim

Cross-Site Scripting / XSS (#3)

<?php

$unfilteredInput = '<script type="text/javascript">...</script>';

// Unescaped - JS will run :'(

echo $unfilteredInput;

// Escaped - JS will not run :)

echo htmlspecialchars($string, ENT_QUOTES, 'UTF-8');

Page 26: Dip Your Toes in the Sea of Security

@asgrim

Cross-Site Request Forgery / CSRF (#8)http://www.factzoo.com/invertebrates/cuttlefish-chameleon-of-the-sea.html

Page 27: Dip Your Toes in the Sea of Security

@asgrim

Cross-Site Request Forgery / CSRF (#8)

<?php

if (!$isPost) {

$csrfToken = base64_encode(random_bytes(32)));

$_SESSION['csrf_token'] = $csrfToken;

// ... output the form ...

echo '<input type="hidden" name="csrf_token" value="'.$csrfToken.'" />';

} else if ($isPost) {

if (hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {

die("Token invalid...");

}

// ... handle the form ...

}

Page 28: Dip Your Toes in the Sea of Security

@asgrim

<?php

if (!$isPost) {

$csrfToken = base64_encode(random_bytes(32)));

$_SESSION['csrf_token'] = $csrfToken;

// ... output the form ...

echo '<input type="hidden" name="csrf_token" value="'.$csrfToken.'" />';

} else if ($isPost) {

if (hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {

die("Token invalid...");

}

// ... handle the form ...

}

Cross-Site Request Forgery / CSRF (#8)

Page 29: Dip Your Toes in the Sea of Security

@asgrim

Cross-Site Request Forgery / CSRF (#8)

<?php

if (!$isPost) {

$csrfToken = base64_encode(random_bytes(32)));

$_SESSION['csrf_token'] = $csrfToken;

// ... output the form ...

echo '<input type="hidden" name="csrf_token" value="'.$csrfToken.'" />';

} else if ($isPost) {

if (hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {

die("Token invalid...");

}

// ... handle the form ...

}

Page 30: Dip Your Toes in the Sea of Security

@asgrim

Timing attacks

// From zend_is_identical:

return (Z_STR_P(op1) == Z_STR_P(op2) ||

(Z_STRLEN_P(op1) == Z_STRLEN_P(op2) &&

memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0));

Page 31: Dip Your Toes in the Sea of Security

@asgrim

Timing attacks

Actual string: “foobar”

● a (0.00001)● aa (0.00001)● aaa (0.00001)● aaaa (0.00001)● aaaaa (0.00001)● aaaaaa (0.00002) ← success!● aaaaaaa (0.00001)

● aaaaaaaa (0.00001)

● aaaaaaaaa (0.00001)

Page 32: Dip Your Toes in the Sea of Security

@asgrim

Timing attacks

1 int memcmp(const void* s1, const void* s2,size_t n)

2 {

3 const unsigned char *p1 = s1, *p2 = s2;

4 while(n--)

5 if( *p1 != *p2 )

6 return *p1 - *p2;

7 else

8 p1++,p2++;

9 return 0;

10 }

http://clc-wiki.net/wiki/C_standard_library:string.h:memcmp#Implementation

Page 33: Dip Your Toes in the Sea of Security

@asgrim

Timing attacks

Actual string: “foobar”

● “aaaaaa” (0.00001)● “baaaaa” (0.00001) ● …● “faaaaa” (0.00002) ← success!● “fbaaaa” (0.00002)● “fcaaaa” (0.00002)● …● “foaaaa” (0.00003) ← success!

Page 34: Dip Your Toes in the Sea of Security

@asgrim

Sensitive Data Exposure (#6)© 2003 Disney/Pixar. All Rights Reserved.

Page 35: Dip Your Toes in the Sea of Security

@asgrim

Sensitive Data Exposure (#6)

Page 36: Dip Your Toes in the Sea of Security

@asgrim© 2003 Disney/Pixar. All Rights Reserved.

Page 37: Dip Your Toes in the Sea of Security

@asgrim

curl + https

<?php

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

Page 38: Dip Your Toes in the Sea of Security

@asgrim

curl + https

<?php

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);

curl_setopt($ch, CURLOPT_CAINFO, "/path/to/certificate");

Page 39: Dip Your Toes in the Sea of Security

@asgrim© 2003 Disney/Pixar. All Rights Reserved.

Page 40: Dip Your Toes in the Sea of Security

@asgrim

Third Party Code

Page 41: Dip Your Toes in the Sea of Security

@asgrim

Third Party Code!!! WARNING !!

!

Page 42: Dip Your Toes in the Sea of Security

@asgrim

Third Party Code github.com/ /SecurityAdvisories

!!! WARNING !!!

Page 43: Dip Your Toes in the Sea of Security

@asgrim

Dependencies Disappearing

Page 44: Dip Your Toes in the Sea of Security

@asgrim

Page 45: Dip Your Toes in the Sea of Security

@asgrim

We are not allsecurity experts!

Page 46: Dip Your Toes in the Sea of Security

@asgrim

We are not allsecurity experts!

… but we CAN write secure code

Page 47: Dip Your Toes in the Sea of Security

@asgrim

Hack your own system!

© 2003 Disney/Pixar. All Rights Reserved.

Page 48: Dip Your Toes in the Sea of Security

@asgrim

What do you want?

Think like a hacker

Page 49: Dip Your Toes in the Sea of Security

@asgrim

How do you get it?

Think Differently

Page 50: Dip Your Toes in the Sea of Security

@asgrim

Threat ModellingD.R.E.A.D.

© Buena Vista Pictures

Page 51: Dip Your Toes in the Sea of Security

@asgrim

Threat Modelling

Damage

R

E

A

D

© Buena Vista Pictures

Page 52: Dip Your Toes in the Sea of Security

@asgrim

Threat Modelling

Damage

Reproducibility

E

A

D

© Buena Vista Pictures

Page 53: Dip Your Toes in the Sea of Security

@asgrim

Threat Modelling

Damage

Reproducibility

Exploitability

A

D

© Buena Vista Pictures

Page 54: Dip Your Toes in the Sea of Security

@asgrim

Threat Modelling

Damage

Reproducibility

Exploitability

Affected users

D

© Buena Vista Pictures

Page 55: Dip Your Toes in the Sea of Security

@asgrim

Threat Modelling

Damage

Reproducibility

Exploitability

Affected users

Discoverability

© Buena Vista Pictures

Page 56: Dip Your Toes in the Sea of Security

@asgrim

Rank them in orderAnd fix them!

© Buena Vista Pictures

Page 57: Dip Your Toes in the Sea of Security

@asgrim

Authentication& Authorization

Page 58: Dip Your Toes in the Sea of Security

@asgrim

AuthenticationVerifying Identity

Page 59: Dip Your Toes in the Sea of Security

@asgrim

Case Study: Custom Authentication

We thought about doing this…

Page 60: Dip Your Toes in the Sea of Security

@asgrim

Case Study: Custom Authentication

We thought about doing this…

Page 61: Dip Your Toes in the Sea of Security

@asgrim

Case Study: Custom Authentication

We thought about doing this…

Page 62: Dip Your Toes in the Sea of Security

@asgrim

Password Hashingpassword_hash()

Page 63: Dip Your Toes in the Sea of Security

@asgrim

Two Factor Authentication

Page 64: Dip Your Toes in the Sea of Security

@asgrim

Page 65: Dip Your Toes in the Sea of Security

@asgrim

AuthorizationVerifying Access

Page 66: Dip Your Toes in the Sea of Security

@asgrim

CRYPTOGRAPHYIS

HARD

Page 67: Dip Your Toes in the Sea of Security

@asgrim

Page 68: Dip Your Toes in the Sea of Security

@asgrim

CRYPTOGRAPHYIS

HARDNEVER EVER “ROLL YOUR OWN”

Page 69: Dip Your Toes in the Sea of Security

@asgrim

CRYPTOGRAPHYIS

HARDNEVER EVER “ROLL YOUR OWN”

EVER!!!

Page 70: Dip Your Toes in the Sea of Security

@asgrim

How to encrypt then?

Page 71: Dip Your Toes in the Sea of Security

@asgrim

I’ve got some great ideas for encryption...

Image: IBTimes (http://goo.gl/zPVeo0)

Page 72: Dip Your Toes in the Sea of Security

@asgrim

How to encrypt then?libsodium PECL package

Page 73: Dip Your Toes in the Sea of Security

@asgrim

Linux Server Security

Page 74: Dip Your Toes in the Sea of Security

@asgrim

Create an SSH Fortress

Page 75: Dip Your Toes in the Sea of Security

@asgrim

Firewalls

Page 76: Dip Your Toes in the Sea of Security

@asgrim

iptables

#!/bin/bash

IPT="/sbin/iptables"

$IPT --flush

$IPT --delete-chain

$IPT -P INPUT DROP

$IPT -P FORWARD DROP

$IPT -P OUTPUT DROP

# Loopback

$IPT -A INPUT -i lo -j ACCEPT

$IPT -A OUTPUT -o lo -j ACCEPT

# Inbound traffic

$IPT -A INPUT -p tcp --dport ssh -j ACCEPT

$IPT -A INPUT -p tcp --dport 80 -j ACCEPT

$IPT -A INPUT -p tcp --dport 443 -j ACCEPT

# Outbound traffic

$IPT -A OUTPUT -p tcp --dport 80 -j ACCEPT

$IPT -A OUTPUT -p tcp --dport 443 -j ACCEPT

$IPT -A OUTPUT -p udp --dport 53 -m state --state NEW -j ACCEPT

Page 77: Dip Your Toes in the Sea of Security

@asgrim

iptables

https://twitter.com/sadserver/status/615988393198026752

Page 78: Dip Your Toes in the Sea of Security

@asgrim

ufw

sudo ufw enable

sudo ufw allow 22

sudo ufw allow 80

Page 79: Dip Your Toes in the Sea of Security

@asgrim

Mitigate Brute Force Attacks

Page 80: Dip Your Toes in the Sea of Security

@asgrim

Install Only What You Need

Page 81: Dip Your Toes in the Sea of Security

@asgrim© 2003 Disney/Pixar. All Rights Reserved.

Page 82: Dip Your Toes in the Sea of Security

@asgrim

+

Page 83: Dip Your Toes in the Sea of Security

@asgrim

Case Study: Be Minimal

Internets

Postfix

Squid Proxy(badly configured)

hacker

spam

Page 85: Dip Your Toes in the Sea of Security

@asgrim

The Golden Rules

1. Keep it simple2. Know the risks3. Fail securely4. Don’t reinvent the wheel5. Never trust anything / anyone

Page 86: Dip Your Toes in the Sea of Security

@asgrim

If you follow all this, you get...

Page 87: Dip Your Toes in the Sea of Security

@asgrim

If you follow all this, you get...

Page 88: Dip Your Toes in the Sea of Security

Any questions? :)

https://joind.in/talk/3d299James Titcumb