89
@asgrim Dip Your Toes in the Sea of Security James Titcumb International PHP Conference 2017

Dip Your Toes in the Sea of Security (IPC Fall 2017)

Embed Size (px)

Citation preview

Page 1: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Dip Your Toes inthe Sea of Security

James TitcumbInternational PHP Conference 2017

Page 2: Dip Your Toes in the Sea of Security (IPC Fall 2017)

$ whoami

James Titcumb

www.jamestitcumb.com

www.roave.com

@asgrim

Page 3: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Page 4: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Some simple PHP 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 (IPC Fall 2017)

@asgrim

Page 6: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

The Golden Rules

Page 7: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

The Golden Rules(my made up golden rules)

Page 8: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

1. Keep it simple

Page 9: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

2. Know the risks

Page 10: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

3. Fail securely

Page 11: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

4. Don’t reinvent the wheel

Page 12: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

5. Never trust anything

Page 13: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

OWASP& the OWASP Top 10

https://www.owasp.org/

Page 14: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Application Security(mainly PHP applications)

Page 15: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Always remember…

Filter InputEscape Output

Page 16: Dip Your Toes in the Sea of Security (IPC Fall 2017)

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

SQL Injection (#1)

Page 17: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

SQL Injection (#1)

http://xkcd.com/327/

Page 18: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

SQL Injection (#1)

Page 19: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@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 (IPC Fall 2017)

@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 (IPC Fall 2017)

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

Page 22: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@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 (IPC Fall 2017)

@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 (IPC Fall 2017)

@asgrim

Cross-Site Scripting / XSS (#3)

© 2003 Disney/Pixar. All Rights Reserved.

Page 25: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@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 (IPC Fall 2017)

@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 (IPC Fall 2017)

@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 (IPC Fall 2017)

@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 (IPC Fall 2017)

@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 (IPC Fall 2017)

@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 (IPC Fall 2017)

@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 (IPC Fall 2017)

@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 (IPC Fall 2017)

@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 (IPC Fall 2017)

@asgrim

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

Page 35: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Sensitive Data Exposure (#6)

Page 36: Dip Your Toes in the Sea of Security (IPC Fall 2017)

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

Page 37: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@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 (IPC Fall 2017)

@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 (IPC Fall 2017)

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

Page 40: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Third Party Code

Page 41: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Third Party Code!!! WARNING !!

!

Page 42: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Third Party Code github.com/ /SecurityAdvisories

!!! WARNING !!!

Page 43: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Dependencies Disappearing

Page 44: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

composer.lock(and other stuff in web root)

Page 45: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Page 46: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

We are not allsecurity experts!

Page 47: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

We are not allsecurity experts!

… but we CAN write secure code

Page 48: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Hack your own system!

© 2003 Disney/Pixar. All Rights Reserved.

Page 49: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

What do you want?

Think like a hacker

Page 50: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

How do you get it?

Think Differently

Page 51: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Threat ModellingD.R.E.A.D.

© Buena Vista Pictures

Page 52: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Threat Modelling

Damage

R

E

A

D

© Buena Vista Pictures

Page 53: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Threat Modelling

Damage

Reproducibility

E

A

D

© Buena Vista Pictures

Page 54: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Threat Modelling

Damage

Reproducibility

Exploitability

A

D

© Buena Vista Pictures

Page 55: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Threat Modelling

Damage

Reproducibility

Exploitability

Affected users

D

© Buena Vista Pictures

Page 56: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Threat Modelling

Damage

Reproducibility

Exploitability

Affected users

Discoverability

© Buena Vista Pictures

Page 57: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Rank them in orderAnd fix them!

© Buena Vista Pictures

Page 58: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Authentication& Authorization

Page 59: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

AuthenticationVerifying Identity

Page 60: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Case Study: Custom Authentication

We thought about doing this…

Page 61: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Case Study: Custom Authentication

We thought about doing this…

Page 62: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Case Study: Custom Authentication

We thought about doing this…

Page 63: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Password Hashingpassword_hash()

(basically, bcrypt with proper salt)

Page 64: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Two Factor Authentication

Page 65: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Page 66: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

AuthorizationVerifying Access

Page 67: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

CRYPTOGRAPHYIS

HARD

Page 68: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Page 69: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

CRYPTOGRAPHYIS

HARDNEVER EVER “ROLL YOUR OWN”

Page 70: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

CRYPTOGRAPHYIS

HARDNEVER EVER “ROLL YOUR OWN”

EVER!!!

Page 71: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

How to encrypt then?

Page 72: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

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

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

Page 73: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

How to encrypt then?sodium+halite or Defuse php-encryption

Page 74: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Linux Server Security

Page 75: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Create an SSH Fortress

Page 76: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Firewalls

Page 77: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@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 78: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

iptables

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

Page 79: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

ufw

sudo ufw enable

sudo ufw allow 22

sudo ufw allow 80

Page 80: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Mitigate Brute Force Attacks

Page 81: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Install Only What You Need

Page 82: Dip Your Toes in the Sea of Security (IPC Fall 2017)

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

Page 83: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

+

Page 84: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Case Study: Be Minimal

Internets

Postfix

Squid Proxy(badly configured)

hacker

spam

Page 85: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

Resources

● http://securingphp.com/● https://www.owasp.org/● http://blog.ircmaxell.com/● https://github.com/paragonie/random_compat● https://github.com/paragonie/sodium_compat● https://github.com/ircmaxell/password_compat● https://paragonie.com/blog● https://websec.io/resources.php● https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-16-04● https://www.kali.org/

Page 86: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

The Golden Rules

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

Page 87: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

If you follow all this, you get...

Page 88: Dip Your Toes in the Sea of Security (IPC Fall 2017)

@asgrim

If you follow all this, you get...

Page 89: Dip Your Toes in the Sea of Security (IPC Fall 2017)

Any questions?

...James Titcumb@asgrim