Top Banner
Dip Your Toes in the Sea of Security James Titcumb PHP UK Conference 2016
84

Dip Your Toes in the Sea of Security (PHP UK 2016)

Jan 26, 2017

Download

Technology

James Titcumb
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Dip Your Toes in the Sea of Security (PHP UK 2016)

Dip Your Toes in theSea of Security

James TitcumbPHP UK Conference 2016

Page 3: Dip Your Toes in the Sea of Security (PHP UK 2016)

Use “phpuk16” discount code!

Page 4: Dip Your Toes in the Sea of Security (PHP UK 2016)

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 (PHP UK 2016)
Page 6: Dip Your Toes in the Sea of Security (PHP UK 2016)

The Golden Rules

Page 7: Dip Your Toes in the Sea of Security (PHP UK 2016)

The Golden Rules(my made up golden rules)

Page 8: Dip Your Toes in the Sea of Security (PHP UK 2016)

1. Keep it simple

Page 9: Dip Your Toes in the Sea of Security (PHP UK 2016)

2. Know the risks

Page 10: Dip Your Toes in the Sea of Security (PHP UK 2016)

3. Fail securely

Page 11: Dip Your Toes in the Sea of Security (PHP UK 2016)

4. Don’t reinvent the wheel

Page 12: Dip Your Toes in the Sea of Security (PHP UK 2016)

5. Never trust anything

Page 13: Dip Your Toes in the Sea of Security (PHP UK 2016)

OWASP& the OWASP Top 10

https://www.owasp.org/

Page 14: Dip Your Toes in the Sea of Security (PHP UK 2016)

Application Security(mainly PHP applications)

Page 15: Dip Your Toes in the Sea of Security (PHP UK 2016)

Always remember…

Filter InputEscape Output

Page 16: Dip Your Toes in the Sea of Security (PHP UK 2016)

© 2003 Disney/Pixar. All Rights Reserved.

SQL Injection (#1)

Page 17: Dip Your Toes in the Sea of Security (PHP UK 2016)

SQL Injection (#1)

http://xkcd.com/327/

Page 18: Dip Your Toes in the Sea of Security (PHP UK 2016)

SQL Injection (#1)

1. Use PDO / mysqli2. Use prepared / parameterized statements

Page 19: Dip Your Toes in the Sea of Security (PHP UK 2016)

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 (PHP UK 2016)

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 (PHP UK 2016)

© 2003 Disney/Pixar. All Rights Reserved.

Page 24: Dip Your Toes in the Sea of Security (PHP UK 2016)

Cross-Site Scripting / XSS (#3)© 2003 Disney/Pixar. All Rights Reserved.

Page 25: Dip Your Toes in the Sea of Security (PHP UK 2016)

Cross-Site Scripting / XSS (#3)

● Escape output<?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 (PHP UK 2016)

Cross-Site Request Forgeryor CSRF (#8)

http://www.factzoo.com/invertebrates/cuttlefish-chameleon-of-the-sea.html

Page 27: Dip Your Toes in the Sea of Security (PHP UK 2016)

<?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 28: Dip Your Toes in the Sea of Security (PHP UK 2016)

<?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 (PHP UK 2016)

<?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 30: Dip Your Toes in the Sea of Security (PHP UK 2016)

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 (PHP UK 2016)

Timing attacksActual 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 (PHP UK 2016)

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 (PHP UK 2016)

Timing attacksActual 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 (PHP UK 2016)

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

Page 35: Dip Your Toes in the Sea of Security (PHP UK 2016)

Sensitive Data Exposure (#6)

Page 36: Dip Your Toes in the Sea of Security (PHP UK 2016)

© 2003 Disney/Pixar. All Rights Reserved.

Page 37: Dip Your Toes in the Sea of Security (PHP UK 2016)

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 (PHP UK 2016)

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 (PHP UK 2016)

© 2003 Disney/Pixar. All Rights Reserved.

Page 40: Dip Your Toes in the Sea of Security (PHP UK 2016)

Third Party Code

Page 41: Dip Your Toes in the Sea of Security (PHP UK 2016)

Third Party Code!!! WARNING !!!

Page 42: Dip Your Toes in the Sea of Security (PHP UK 2016)

Third Party Code github.com/ /SecurityAdvisories

!!! WARNING !!!

Page 43: Dip Your Toes in the Sea of Security (PHP UK 2016)
Page 44: Dip Your Toes in the Sea of Security (PHP UK 2016)

We are not allsecurity experts!

Page 45: Dip Your Toes in the Sea of Security (PHP UK 2016)

We are not allsecurity experts!

… but we CAN write secure code

Page 46: Dip Your Toes in the Sea of Security (PHP UK 2016)

Hack your own system!

© 2003 Disney/Pixar. All Rights Reserved.

Page 47: Dip Your Toes in the Sea of Security (PHP UK 2016)

What do you want?

Think like a hacker

Page 48: Dip Your Toes in the Sea of Security (PHP UK 2016)

How do you get it?

Think Differently

Page 49: Dip Your Toes in the Sea of Security (PHP UK 2016)

Threat ModellingD.R.E.A.D.

© Buena Vista Pictures

Page 50: Dip Your Toes in the Sea of Security (PHP UK 2016)

Threat Modelling

DamageREAD

© Buena Vista Pictures

Page 51: Dip Your Toes in the Sea of Security (PHP UK 2016)

Threat Modelling

DamageReproducibilityEAD

© Buena Vista Pictures

Page 52: Dip Your Toes in the Sea of Security (PHP UK 2016)

Threat Modelling

DamageReproducibilityExploitabilityAD

© Buena Vista Pictures

Page 53: Dip Your Toes in the Sea of Security (PHP UK 2016)

Threat Modelling

DamageReproducibilityExploitabilityAffected usersD

© Buena Vista Pictures

Page 54: Dip Your Toes in the Sea of Security (PHP UK 2016)

Threat Modelling

DamageReproducibilityExploitabilityAffected usersDiscoverability

© Buena Vista Pictures

Page 55: Dip Your Toes in the Sea of Security (PHP UK 2016)

Put them in orderAnd fix them!

© Buena Vista Pictures

Page 56: Dip Your Toes in the Sea of Security (PHP UK 2016)

Authentication& Authorization

Page 57: Dip Your Toes in the Sea of Security (PHP UK 2016)

AuthenticationVerifying Identity

Page 58: Dip Your Toes in the Sea of Security (PHP UK 2016)

Case Study: Custom Authentication

We thought about doing this…

Page 59: Dip Your Toes in the Sea of Security (PHP UK 2016)

Case Study: Custom Authentication

We thought about doing this…

Page 60: Dip Your Toes in the Sea of Security (PHP UK 2016)

Case Study: Custom Authentication

We thought about doing this…

Page 61: Dip Your Toes in the Sea of Security (PHP UK 2016)

Password Hashingpassword_hash()

Page 62: Dip Your Toes in the Sea of Security (PHP UK 2016)

AuthorizationVerifying Access

Page 63: Dip Your Toes in the Sea of Security (PHP UK 2016)

CRYPTOGRAPHYIS

HARD

Page 64: Dip Your Toes in the Sea of Security (PHP UK 2016)
Page 65: Dip Your Toes in the Sea of Security (PHP UK 2016)

CRYPTOGRAPHYIS

HARDNEVER EVER “ROLL YOUR OWN”

Page 66: Dip Your Toes in the Sea of Security (PHP UK 2016)

CRYPTOGRAPHYIS

HARDNEVER EVER “ROLL YOUR OWN”

EVER!!!

Page 67: Dip Your Toes in the Sea of Security (PHP UK 2016)

How to encrypt then?

Page 68: Dip Your Toes in the Sea of Security (PHP UK 2016)

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

Image: The Guardian (http://goo.gl/pUkyvO)

Page 69: Dip Your Toes in the Sea of Security (PHP UK 2016)

How to encrypt then?libsodium PECL package

Page 70: Dip Your Toes in the Sea of Security (PHP UK 2016)

Linux Server Security

Page 71: Dip Your Toes in the Sea of Security (PHP UK 2016)

Create an SSH Fortress

Page 72: Dip Your Toes in the Sea of Security (PHP UK 2016)

Firewalls

Page 73: Dip Your Toes in the Sea of Security (PHP UK 2016)

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 74: Dip Your Toes in the Sea of Security (PHP UK 2016)

ufwsudo ufw enable

sudo ufw allow 22

sudo ufw allow 80

Page 75: Dip Your Toes in the Sea of Security (PHP UK 2016)

Mitigate Brute Force Attacks

Page 76: Dip Your Toes in the Sea of Security (PHP UK 2016)

Install OnlyWhat You Need

Page 77: Dip Your Toes in the Sea of Security (PHP UK 2016)

© 2003 Disney/Pixar. All Rights Reserved.

Page 78: Dip Your Toes in the Sea of Security (PHP UK 2016)

+

Page 79: Dip Your Toes in the Sea of Security (PHP UK 2016)

Case Study: Be Minimal

Internets

Postfix

Squid Proxy(badly configured)

hacker

spam

Page 81: Dip Your Toes in the Sea of Security (PHP UK 2016)

The Golden Rules

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

Page 82: Dip Your Toes in the Sea of Security (PHP UK 2016)

If you follow all this, you get...

Page 83: Dip Your Toes in the Sea of Security (PHP UK 2016)

If you follow all this, you get...

Page 84: Dip Your Toes in the Sea of Security (PHP UK 2016)

Any questions? :)

https://joind.in/talk/c2bb0James Titcumb @asgrim