Slide 1

Slide 1 text

Web Application Security Update: Top Vulnerabilities Eric Mann

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

ASR 1 - Injection

Slide 4

Slide 4 text

The attacker's hostile data can trick the interpreter into executing unintended commands or accessing data without proper authorization.

Slide 5

Slide 5 text

xkcd: Exploits of a Mom - https://xkcd.com/327/

Slide 6

Slide 6 text

$db = new \PDO(...); $name = $_POST['name']; $sql = "SELECT * FROM users WHERE email='$name'"; foreach($db->query($sql) as $user) { // ... } curl -X POST -d "[email protected]' OR 1=1;--" http://yoursite.com SELECT * FROM users WHERE email='[email protected]' OR 1=1;--'

Slide 7

Slide 7 text

$db = new \PDO(...); $name = $_POST['name']; $sql = "SELECT * FROM users WHERE email=:email"; $statement = $db->prepare($sql); $params = [':email' => $name]; foreach($db->execute($statement, $params) as $user) { // ... } curl -X POST -d "[email protected]' OR 1=1;--" http://yoursite.com SELECT * FROM users WHERE email='[email protected]\' OR 1=1;--'

Slide 8

Slide 8 text

function serve_file($filename) { header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename=\"{$filename}\""); header("Content-Length: 11111"); passthru("cat /home/uploads/" . $filename); exit(); } curl -X GET -d "filename=;cat+/etc/letsencrypt/site.com/privkey.pem" http://site.com cat /home/uploads/;cat /etc/letsencrypt/site.com/privkey.pem

Slide 9

Slide 9 text

function serve_file($filename) { // Sanitize the filename before it's used $sanitized = basename($filename); header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename=\"{$sanitized}\""); header("Content-Length: 11111"); $path = "/home/uploads/{$sanitized}"; passthru('cat ' . escapeshellarg($path)); exit(); } curl -X GET -d "filename=;cat+/etc/letsencrypt/site.com/privkey.pem" http://site.com cat /home/uploads/privkey.pem

Slide 10

Slide 10 text

ASR 2 - Broken Authentication

Slide 11

Slide 11 text

Application functions related to authentication and session management are often not implemented correctly...

Slide 12

Slide 12 text

Client-side Sessions Don’t trust the user to store sensitive information Don’t trust information provided by the user Don’t store sensitive information with an untrusted party Don’t use cookies to store sensitive data (If you are using cookies, use secure cookies - but only store identifiers)

Slide 13

Slide 13 text

Password Management Passwords should NEVER be stored in plaintext. Passwords should NEVER be stored with encryption. Passwords should ONLY be stored using one-way hashes. Try to avoid passwords in the first place...

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

(Full image slide. No text)

Slide 16

Slide 16 text

Problems with JWT Leaking sensitive information The `none` algorithm is required by the spec Algorithm confusion - RSA vs HMAC Weak algorithms are allowed

Slide 17

Slide 17 text

What you should do Only store session data on the server Ensure strong authentication protects user identities Lock down insecure algorithms and primitives Only use trusted third-party library implementations

Slide 18

Slide 18 text

ASR 3 - Sensitive Data Exposure

Slide 19

Slide 19 text

Many web applications do not adequately protect sensitive data, such as credit cards, tax IDs, and authentication credentials.

Slide 20

Slide 20 text

Photo borrowed from Schneier on Security: https://www.schneier.com/blog/archives/2005/02/the_weakest_lin.html

Slide 21

Slide 21 text

Sensitive Data Retention What data do you retain? Why do you need this data in the first place? Who has access to the data? Where are backups stored? Who has access to the data via the backup system?

Slide 22

Slide 22 text

Encoding is not encryption!

Slide 23

Slide 23 text

function encodeString($str) { for ($i = 0; $i < 5; $i++) { $str = strrev(base64_encode($str)); } return $str; } function decodeString($str) { for ($i = 0; $i < 5; $i++) { $str = base64_decode(strrev($str)); } return $str; } encodeString('this is a secret'); QVlRHZlbopUYxQWShRkTUR1aaVUWuB3UNdlR2NmRWplUuJkVUxGcPFGbGVkVqp0VUJjUZdVVaNVTtVUP

Slide 24

Slide 24 text

ASR 4 - XML External Entities

Slide 25

Slide 25 text

Untrusted XML input containing a reference to an external entity is processed by a weakly configured XML parser ...

Slide 26

Slide 26 text

]> Friend of &name; &name; &name; - 2019 ]> &info;

Slide 27

Slide 27 text

]> &bomb;

Slide 28

Slide 28 text

$default = libxml_disable_entity_loader(true); $dom = new DOMDocument(); $dom->loadXML($xml); // Do things with XML // Restore the previous value libxml_disable_entity_loader($default); What you should do

Slide 29

Slide 29 text

ASR 5 - Broken Access Control

Slide 30

Slide 30 text

Restrictions on what authenticated users are allowed to do are not properly enforced.

Slide 31

Slide 31 text

$app->post( '/profile', function ($request, $response, $args) { if (!isset($_SESSION['user_id']) || !$this->users->get($_SESSION['user_id'])) { return $response->withRedirect('/?error=notloggedin'); } $userID = $request->getParam('user_id'); $fname = $request->getParam('fname'); $lname = $request->getParam('lname'); $email = $request->getParam('email'); // Retrieve the user's account from the database (via the app container) $user = $this->users->get(intval($userID)); $user->profile->fname = filter_var($fname, FILTER_SANITIZE_STRING); $user->profile->lname = filter_var($lname, FILTER_SANITIZE_STRING); $user->profile->email = filter_var($email, FILTER_SANITIZE_EMAIL); $this->users->update($user); } );

Slide 32

Slide 32 text

United Airlines experienced this vulnerability in their mobile app in 2015 - https://randywestergren.com/united-airlines-bug-bounty-an-experience-in-reporting-a-serious-vulnerability//

Slide 33

Slide 33 text

ASR 6 - Security Misconfiguration

Slide 34

Slide 34 text

Secure settings should be defined, implemented, and maintained, as defaults are often insecure.

Slide 35

Slide 35 text

PHP Settings Disable error display (display_errors) Disable remote includes (allow_url_fopen and allow_url_include) Set reasonable resource maximums (upload_max_filesize and memory_limit) Leverage the disable_functions directive to block dangerous functions: exec, passthru, shell_exec, system, proc_open, popen, parse_ini_file, show_source, eval, create_function

Slide 36

Slide 36 text

Webserver Settings (Nginx / Apache / etc) Disable server tokens and signature disclosure Configure a static server name (don’t trust potentially malicious HOST headers) Disable directory traversal ALWAYS configure strong SSL certificates for secure access Return proper error codes

Slide 37

Slide 37 text

Database (MySQL) Settings Set an appropriate bind-address Ensure users are configured from the correct host, not a % wildcard Limit user permissions on the database to just what the application needs

Slide 38

Slide 38 text

ASR 7 - Cross-Site Scripting (XSS)

Slide 39

Slide 39 text

An application takes untrusted data and sends it to a web browser without proper validation or escaping.

Slide 40

Slide 40 text

Search results for: "" No results for ''
Search results for: No results for ''

Slide 41

Slide 41 text

Search results for: "" No results for ''
Search results for: "" No results for ''

Slide 42

Slide 42 text

ASR 8 - Insecure Deserialization

Slide 43

Slide 43 text

Languages’ native deserialization mechanisms can be repurposed for malicious effect when operating on untrusted data.

Slide 44

Slide 44 text

class CartCache { $cache_file; $data = []; // ... /** * Automatically purge the cache file from disk to clean up */ public function __destruct() { $file = "/var/www/cache/tmp/carts/{$this->cache_file}"; if ($this->cleanup && file_exists($file)) { @unlink($file); } } } $data = unserialize($_GET['data']); https://yoursite.com/endpoint.php?data=O:9:"CartCache":2:{s:10:"cache_file";s:18:"../../../i ndex.php";s:4:"data";a:0:{}}

Slide 45

Slide 45 text

Do not pass untrusted user input to unserialize() regardless of the options value of allowed_classes.

Slide 46

Slide 46 text

ASR 9 - Using Components with Known Vulnerabilities

Slide 47

Slide 47 text

Applications using components with known vulnerabilities may undermine application defenses and enable a range of possible attacks and impacts.

Slide 48

Slide 48 text

Audit Application Dependencies Monitor Composer-installed dependencies for outdated or vulnerable libraries Leverage unattended-upgrades to keep system packages up-to-date Audit the packages installed on your server - don’t install things you don’t need

Slide 49

Slide 49 text

Custom error messages can help demonstrate when a security hole has been plugged. Or annoy those who were exploiting it in the first place...

Slide 50

Slide 50 text

Audit Application Dependencies Monitor Composer-installed dependencies for outdated or vulnerable libraries Leverage unattended-upgrades to keep system packages up-to-date Audit the packages installed on your server - don’t install things you don’t need Only run current, supported versions of PHP!!!

Slide 51

Slide 51 text

ASR 10 - Insufficient Logging & Monitoring

Slide 52

Slide 52 text

Attackers rely on the lack of monitoring and timely response to achieve their goals without being detected.

Slide 53

Slide 53 text

It’s Important to Track: What happened When it happened Where it happened (in terms of code and the IP of the server) To whom it happened What input triggered the event

Slide 54

Slide 54 text

Event Classes Input Validation Errors Output Validation Errors Authentication Events Authorization (Access Control) Failures Application Errors Application Startup/Shutdown High-risk Operations

Slide 55

Slide 55 text

Want to know more? Security Principles for PHP Applications Available online and in print through php[architect]

Slide 56

Slide 56 text

Questions?

Slide 57

Slide 57 text

Thank you [email protected] | 503.925.6266