• No results found

Introduktion till datasäkerhet. Christian Ohlsson 1

N/A
N/A
Protected

Academic year: 2022

Share "Introduktion till datasäkerhet. Christian Ohlsson 1"

Copied!
114
0
0

Loading.... (view fulltext now)

Full text

(1)

Introduktion till datasäkerhet

Christian Ohlsson 1

(2)

Varför säkra upp webbapplikationer?

Christian Ohlsson 2

(3)

Vart ska man attackera?

Christian Ohlsson 3

Brandvägg Server

Win/

Mac/

Linux

Cisco SUN

Klient

Apache PHP

WP Tema

h"ps   h"ps  

(4)

Brandväggen?

Christian Ohlsson 4

(5)

Krypteringen?

Christian Ohlsson 5

(6)

Servern?

Christian Ohlsson 6

(7)

Apache?

Christian Ohlsson 7

(8)

PHP?

Christian Ohlsson 8

(9)

WordPress?

Christian Ohlsson 9

(10)

Någons okontrollerade kod?

Christian Ohlsson 10

(11)

Virus drabbar amerikanska drönare

Christian Ohlsson 11

(12)

SONY Playstation Network

Christian Ohlsson 12

77 miljoner konton stulna. Lösenord i klartext

(13)

SonyPictures.com

Christian Ohlsson 13

LulzSec: SQLi stal konton

(14)

Top 25 Most Dangerous Software Errors

1. SQL Injection

2. OS Command Injection 3. Classic Buffer Overflow 4. Cross-site Scripting

5. Missing Authentication for Critical Function 6. Missing Authorization

7. Use of Hard-coded Credentials

8. Missing Encryption of Sensitive Data

9. Unrestricted Upload of File with Dangerous Type 10.Reliance on Untrusted Inputs in a Security Decision

Christian Ohlsson 14

(15)

Definitioner

§  Identifiering

§  Autentisering

§  Auktorisering

§  Sessionshantering

Christian Ohlsson 15

(16)

Identifiering/Autentisering

§  Hur kan man bevisa vem man är?

§  Biometriska pass

§  ID-kort med foto

§  Fingeravtryck

§  Användarnamn/Lösenord

Christian Ohlsson 16

(17)

Autentisering

§  Enkla eller multipla faktorer

§  Endast lösenord

§  Lösenord samt fingeravtryck

§  Avvägning mellan

§  Enkelhet

§  Kostnad

§  Komplexitet

§  Säkerhet

Christian Ohlsson 17

(18)

Christian Ohlsson 18

(19)

Christian Ohlsson 19

(20)

Autentisering på webben

Christian Ohlsson 20

(21)

Autentisering på webben

§  Enkel autentisering (Basic)

§  Autentisering med Digest

§  Autentisering med Formulär

Christian Ohlsson 21

(22)

Enkel autentisering

Christian Ohlsson 22

(23)

Enkel autentisering

Christian Ohlsson 23

(24)

Enkel autentisering

§  Ingen kryptering

§  Användarnamn och lösenord bara kodas om

§  Kräver en säker kommunikationskanal

Christian Ohlsson 24

(25)

Digest-autentisering

Christian Ohlsson 25

Hashar username och password

(26)

Digest-autentisering

Christian Ohlsson 26

(27)

Digest-autentisering

§  Fördelar

§  Kommunikationen är mer säker, trots viss osäkerhet med användningen av MD5

§  Nackdelar

§  Server lagrar användarnamn/lösenord i klartext

§  Sårbar mot Man-in-the-middle-attacker (MITM)

Christian Ohlsson 27

(28)

Autentisering med formulär

Christian Ohlsson 28

(29)

Autentisering med formulär

§  Fördelar

§  Enkel att utveckla

§  Interface som skapas av designers

§  Kan använda multi-faktor autentisering

§  Nackdelar

§  Kräver en säker kanal

Christian Ohlsson 29

(30)

Andra autentiserings-metoder

§  Single-sign-on

§  Open-ID, ShibboLeth osv

§  Använda Windows-autentisering

§  Token-baserad

§  Open-time-passords (OTP)

§  Secure-ID osv

§  Publik-nyckel (SSL med klient-cert)

Christian Ohlsson 30

(31)

RBAC: Roll baserad Access-kontroll

§  Roller i systemet identifieras

§  admins, gruppledare, utvecklare

§  Rättigheter tilldelas roller

§  Gruppledare kan skriva på webbsidan

§  Entiteter tilldelas roll/roller

§  Anna är en gruppledare

Christian Ohlsson 31

(32)

RBAC: Roll baserad Access-kontroll

§  Mycket enklare än att tilldela rättigheter på entitetsnivå

§  Dessa roller kan enkelt länka till de befintliga roller som finns inom organisationen

§  Automatisk underhåll

§  Mindre administration

Christian Ohlsson 32

(33)

RBAC: Roll baserad Access-kontroll

Christian Ohlsson 33

(34)

Ring a bell?

Christian Ohlsson 34

(35)

Olika typer av attacker

Christian Ohlsson 35

(36)

Olika typer av attacker

§  Sessions-attacker

§  Session Fixation / Sessions-ID forgery

§  Cross-Site Scripting

§  Cross-Site Request Forgery

§  Injection

§  SQL Injection

§  Command Injection

§  Google Hacks

Christian Ohlsson 36

(37)

Session ID Forgery

§  Manipulering av URL

§  Manipulering av POST-parametrar

Christian Ohlsson 37

(38)

Citibank

Christian Ohlsson 38

Citibank kunder förlorade $2.7 miljoner dollar i en attack

(39)

Christian Ohlsson 39

23-årig attackerare fick 200.000 konton

(40)

Cross-Site-Scripting

§  Den absolut vanligaste formen av sårbarhet på dagens webbsidor

§  Man beräknar att upp till 68% kan vara sårbara för XSS

Christian Ohlsson 40

(41)

Cross-Site-Scripting

Christian Ohlsson 41

Beständig

(42)

Cross-Site-Scripting

Christian Ohlsson 42

Icke-Beständig

(43)

Little Bobby Tables J

Christian Ohlsson 43

(44)

Cross-Site-Scripting

§  Vad kan hända om man blir utsatt?

§  Väldigt mycket:

§  Identitets-stölder

§  Spridning av elak programvara

§  Site Defacement:

Christian Ohlsson 44

(45)

Christian Ohlsson 45

(46)

Christian Ohlsson 46

.gov

(47)

Christian Ohlsson 47

(48)

Wordpress.org

Christian Ohlsson 48

Lagade en felaktighet som kunde leda till XSS i version 3.1.1

(49)

XSS: Man kan man lära sig?

§  Lita aldrig, aldrig aldrig på User Input, bland annat genom:

§  Formulär

§  URL

§  Cookie

§  HTTP Headers

Christian Ohlsson 49

(50)

XSS: Motmedel

§  Ta bort HTML-kod

§  Använd White-list eller Backlist

§  Använd märkord istället för HTML

§  Som Wikis & forum gör med med BB-code

§  Använd ett scannerverktyg

§  Exempelvis Acunetix

Christian Ohlsson 50

(51)

Cross-Site-Request Forgery

Christian Ohlsson 51

(52)

Cross-Site-Request Forgery

Christian Ohlsson 52

(53)

Cross-Site-Request Forgery: Motmedel

§  För slutanvändaren finns väldigt lite man kan göra

§  Logga ut från sajten före du besöker nästa

§  Använd inte ”Kom ihåg mig”-knappen

§  Surfa inte på platser du inte litar på

Christian Ohlsson 53

(54)

Cross-Site-Request Forgery: Motmedel

§  För utvecklaren av sajten finns en del saker man kan göra:

§  Ta med ett hemligt ”nounce” i formulär

§  Ignorera GET-parametrar när du processar POST-data

Christian Ohlsson 54

(55)

SQL Injection

Christian Ohlsson 55

(56)

SQL Injection

§  SQL injektion är indata från användaren som tillåts passera direkt till databasen utan att ha tvättats

Christian Ohlsson 56

(57)

SQL Injection: Exempel

Christian Ohlsson 57

(58)

SQL Injection: Motmedel

§  Lita aldrig, aldrig aldrig på User Input, bland annat genom:

§  Formulär

§  URL

§  Cookie

§  HTTP Headers

Christian Ohlsson 58

(59)

SQL Injection: Motmedel

§  Använd ”Prepared Statements”

§  Fördelar

§  Förkompilerade frågor: lite snabbare

§  Nackdelar

§  Liiiite mer komplext

Christian Ohlsson 59

(60)

Google Hacking DB

Christian Ohlsson 60

(61)

exploit-db.com: Sårbarheter i WordPress

Christian Ohlsson 61

http://bit.ly/1jMCXlL

(62)

1337day.com

Christian Ohlsson 62

Enorm databas med färdiga exploits

(63)

metaspliot.com

Christian Ohlsson 63

(64)

User input?

Christian Ohlsson 64

NEVER NEVER NEVER

TRUST USER INPUT

(65)

Stuxnet

§  Video om Stuxnet

§  http://vimeo.com/25118844

§  TED-talks om Stuxnet

§  http://www.ted.com/talks/

ralph_langner_cracking_stuxnet_a_21st_century_cyb erweapon.html

Christian Ohlsson 65

(66)

Skriva säker kod i WordPress

Christian Ohlsson 66

(67)

Kodarens gyllene regel

Christian Ohlsson 67

(68)

Informationshantering

All data är skadlig till dess att motsatsen bevisats

Christian Ohlsson 68

(69)

SQLi och WordPress

Christian Ohlsson 69

global $wpdb;

$ID = $_GET['ID'];

$sql = "SELECT post_title FROM $wpdb->posts WHERE ID = '$ID';";

SELECT post_title FROM wp_posts WHERE ID = '5';

Tänkt resultat:

(70)

SQLi och WordPress

Christian Ohlsson 70

global $wpdb;

$ID = $_GET['ID'];

$sql = "SELECT post_title FROM $wpdb->posts WHERE ID = '$ID';";

SELECT post_title FROM wp_posts WHERE ID = '’;

SELECT * FROM wp_users WHERE 1 = '1';

Möjligt resultat:

(71)

Christian Ohlsson 71

$wpdb->insert()

(72)

Christian Ohlsson 72

$wpdb->insert(

$wpdb->postmeta, array(

'post_id' => '5',

'meta_key' => '_custom_meta_key', 'meta_value' => 'true'

), array(

'%d', '%s', '%s' ) );

$wpdb->insert()

$wpdb->insert( $table, $data, $format )

(73)

Christian Ohlsson 73

$wpdb->update()

(74)

$wpdb->update( $table, $data, $where, $format, $where_format )

Christian Ohlsson 74

$wpdb->update(

$wpdb->postmeta', array(

'meta_value' => 'false' ),

array(

'post_id' => 5,

'meta_key' => '_custom_meta_key' ),

array(

'%s' ),

array(

'%d', '%s' )

);

(75)

Christian Ohlsson 75

$wpdb->delete()

(76)

$wpdb->delete()

Christian Ohlsson 76

$wpdb->delete(

$wpdb->posts,

array( 'ID' => 5 ), array( '%d' )

);

$wpdb->delete( $table, $where, $where_format )

(77)

Christian Ohlsson 77

$wpdb->prepare()

(78)

$wpdb->prepare()

§  Hanterar strängar (%s) och integers (%d)

§  Tar hand om all escaping

§  Du behöver inte sätta %s inom ”och”

Christian Ohlsson 78

$wpdb->prepare( "

SELECT post_title FROM $wpdb->posts

WHERE ID = %d ", $ID );

(79)

$wpdb->prepare()

Christian Ohlsson 79

$wpdb->prepare( "

DELETE FROM $wpdb->postmeta WHERE post_id = %d

AND meta_key = %s ", 420, 'Europe' );

(80)

$wpdb->prepare()

Christian Ohlsson 80

$wpdb->prepare() snyggar till frågan, inte exekverar den!

$wpdb->query(

$wpdb->prepare( " DELETE FROM $wpdb->postmeta

WHERE post_id = %d AND meta_key = %s ", 420, 'Europe' ) );

För att se vad den gör: skriv ut det

echo $wpdb->prepare( " DELETE FROM $wpdb->postmeta

WHERE post_id = %d AND meta_key = %s ", 420, 'Europe' );

(81)

Cross-Site Scripting (XSS)

§  Vad innebär att escape’a en sträng?

§  Det innebär att du tar data som du redan har och säkrar den före du visar den för en användare

Christian Ohlsson 81

(82)

Escaping

Christian Ohlsson 82

esc_attr_e()

1.  esc_ är prefixet för alla funktioner som escape’ar saker 2.  attr är den kontext som skall bli escape’ad

3.  _e är suffixet om du använder översättning

1 2 3

(83)

Cross-Site Scripting (XSS)

Christian Ohlsson 83

<h1><?php echo $title; ?></h1>

DÅLIGT

(84)

Cross-Site Scripting (XSS)

Christian Ohlsson 84

<?php

$title = "<script>alert('Hello Europe!');</script>";

?>

<h1><?php echo $title; ?></h1>

DÅLIGT

(85)

Cross-Site Scripting (XSS)

Christian Ohlsson 85

<?php

$title = "<script>alert('Hello Europe!');</script>";

?>

<h1><?php echo esc_html( $title ); ?></h1>

BRA

(86)

esc_attr()

Christian Ohlsson 86

Används när du vill visa data i ett HTML element

http://codex.wordpress.org/Function_Reference/esc_attr

<input type="text" name="name"

value="<?php echo esc_attr( $text ); ?>" />

(87)

esc_textarea()

Christian Ohlsson 87

Används när du vill visa data i en <textarea>

http://codex.wordpress.org/Function_Reference/esc_textarea

<textarea name="bio">

<?php echo esc_textarea( $bio); ?>

</textarea>

(88)

esc_url()

Christian Ohlsson 88

http://codex.wordpress.org/Function_Reference/esc_url

<a href="<?php echo esc_url( $url); ?>">Link</a>

Används när du vill validera och tvätta URL

(89)

absint()

Christian Ohlsson 89

Konverterar en siffra till en positiv siffra

http://codex.wordpress.org/Function_Reference/absint

$ID = absint( $_GET['ID'] );

<input type="text" name="number_posts" value=”

<?php echo absint( $number ); ?>" />

(90)

intval()

Christian Ohlsson 90

Returnerar en integer. Fungerar med negativa tal

http://php.net/manual/en/funcLon.intval.php

$ID = intval( $_GET['ID'] );

<input type="text" name="number_posts" value=”

<?php echo intval( $number ); ?>" />

(91)

Sanera data

Att sanera data innebär att du tar data och ”tvättar” den ren

Christian Ohlsson 91

(92)

Cross-Site Scripting (XSS)

Christian Ohlsson 92

<?php

update_post_meta(

420,

'_post_meta_key',

$_POST['new_meta_value']

);

?>

DÅLIGT

(93)

sanitize_text_field()

Christian Ohlsson 93

<?php

update_post_meta(

34,

'_post_meta_key',

sanitize_text_field( $_POST['new_meta_value'] ) );

?>

BRA

http://codex.wordpress.org/Function_Reference/sanitize_text_field

(94)

Cross-site Request Forgery (CSRF)

Exploit av en webbplats där elaka

kommandon skickas från en användare som webbplatsen litar på

Christian Ohlsson 94

(95)

Cross-site Request Forgery (CSRF)

§  Nonces

§  Action, object och user-specifika tidsstämplade hemliga nycklar

Christian Ohlsson 95

(96)

Cross-site Request Forgery (CSRF)

Christian Ohlsson 96

<?php

if ( isset( $_POST['email'] ) ) { //process form data }

?>

<form method="post">

<input type="text" name="email /><br />

<input type="submit" name="submit" value="Submit" />

</form>

Man kan inte veta var $_POST[‘email’] kommer ifrån!

(97)

wp_nonce_field( $action, $name, $referer, $echo );

Christian Ohlsson 97

<form method="post">

<input type="hidden" id="bw_newsletter" name="bw_newsletter" value="287de957e8" />

<input type="hidden" name="_wp_http_referer" value="/x/sample-page/" />

<input type="text" name="email" /><br />

<input type="submit" name="submit" value="Submit" />

</form>

http://codex.wordpress.org/Function_Reference/wp_nonce_field Formulär:

<form method="post">

<?php wp_nonce_field( 'bw_process_email_action', 'bw_newsletter' ); ?>

<input type="text" name="email" /><br />

<input type="submit" name="submit" value="Submit" />

</form>

View Source:

(98)

check_admin_referer($action, $query_arg )

Christian Ohlsson 98

if ( isset( $_POST['email'] ) ) {

check_admin_referer( 'bw_process_email_action', 'bw_newsletter' );

//process form data }

http://codex.wordpress.org/Function_Reference/check_admin_referer Kontrollera koden:

(99)

Fixat exempel

Christian Ohlsson 99

<?php

if ( isset( $_POST['email'] ) ) {

check_admin_referer( 'bw_process_email_action', 'bw_newsletter' );

//process form data }

?>

<form method="post">

<?php wp_nonce_field( 'bw_process_email_action', 'bw_newsletter' ); ?>

<input type="text" name="email" /><br />

<input type="submit" name="submit" value="Submit" />

</form>

(100)

wp_nonce_url($actionurl, $action, $name )

Christian Ohlsson 100

$url = 'http://example.com/wp-admin/?ID=5';

$url = wp_nonce_url( $url, 'bw_process_email_action', 'bw_newsletter' );

http://codex.wordpress.org/Function_Reference/wp_nonce_url

http://example.com/wp-admin/?ID=5&bw_newsletter=287de957e8

Ny URL:

(101)

Nounces

§  Specifika till:

§  WordPress-användaren

§  Vilken action som skall tas

§  Objektet som vill ta nämnda action

§  Tiden då det händer

Christian Ohlsson 101

(102)

Mer att läsa

§  Säkerhetsartiklar

§  http://codex.wordpress.org/Data_Validation

§  http://codex.wordpress.org/

Validating_Sanitizing_and_Escaping_User_Data

§  http://wp.tutsplus.com/tutorials/7-simple-rules-wordpress- plugin-development-best-practices/

§  http://wpengine.com/2013/05/brad-williams-on-secure- wordpress-development/

§  Säkerhetspresentationer

§  http://wordpress.tv/2013/08/09/mike-adams-three-security- issues-you-thought-youd-fixed/

§  http://wordpress.tv/2013/09/26/brennen-byrne-employing-best- security-pracLces-for-wordpress-sites-3/

§  http://wordpress.tv/2011/01/29/mark-jaquith-theme-plugin- security/

Christian Ohlsson 102

(103)

Säkra din WordPress-installation

Christian Ohlsson 103

(104)

#1 Uppdatera!

§  Det första du skall göra är att uppdatera Wordpress ofta

§  Minst veckovis

§  Wordpress uppdateras ofta, och ofta är det för att säkerhetsmissar har gjorts

§  Precis som all programvara

Christian Ohlsson 104

(105)

#2 Byta ditt username

§  Se till att du inte använder ett vanligt användarnamn

§  Det ska inte vara lätt att räkna ut

§  Admin är standard J

§  Eget namn är bättre, men inte bäst

Christian Ohlsson 105

(106)

#3 Välj ett starkt lösenord

§  Starka lösenord är mycket viktiga

§  Använd inte varianter av ditt namn, användarnamn, födelsedag, e-post, mobilnummer eller publikt

§  Vanliga lösenord som många använder är också tabu

Christian Ohlsson 106

Tänk långt, tänk svenskt!

(107)

#4 Sätt gräns på antalet login-försök

§  Enkelt och utmärkt sätt att skydda din blogg från brute force attacker

§  Flera plugins finns

§  Hur ofta skriver du fel lösenord flera gånger i rad?

§  Flera = > 10

Christian Ohlsson 107

(108)

#5 Använd två-vägs-autentisering

§  För att skydda verkligt viktig data

§  Plugins finns för att koppla WP med exempelvis Google Authenticator

Christian Ohlsson 108

(109)

#6 Byt tabell-prefixet

§  Wordpress-tabeller börjar med ”wp_" som standard

§  Innan du ändrar databasprefix: gör backup

§  Öppna wp-config.php

§  Byt $table_prefix = ’wp_';

§  Mot $table_prefix = ’wp_74rwg2u5_’;

§  Kan vara knepigt, du behöver aldrig tänka på det igen

§  I phpMyAdmin

§  Döp om tabellerna

§  Ex: ’wp_74rwg2u5_commentmeta’

Christian Ohlsson 109

(110)

#7 Göm versionen du kör

§  För äldre Wordpress-versioner finns färdiga exploits

§  Lägg först till denna kod till din functions.php fil:

§  remove_action ('wp_head', 'wp_generator');

§  Döljer version i WP-headern

§  Och dölj från RSS-läsare

Christian Ohlsson 110

function crille_remove_version () { return'';

}

add_filter ('the_generator', 'crille_remove_version ');

(111)

#8 Skydda wp-config.php

§  Viktigaste konfigurationsfilen

§  Du kan/bör flytta wp-config.php upp en nivå

Christian Ohlsson 111

/var/www/crille/public_html/sajt/wp-config.php

/var/www/crille/public_html/wp-config.php

(112)

#9 Använd CAPTCHA

§  Med CAPTCHA skyddas inloggningen rejält mot Brute-Force

§  Kan även användas för kommentering

§  Vissa CAPTCHA-plugin blockar IP efter ett antal inloggningsförsök

Christian Ohlsson 112

(113)

#10 Använd säkerhetsplugins

§  Better WP Security

§  Innehåller flera olika säkerhetskontroller

§  Bulletproof Security

§  Skyddar sajt via .htaccess.

§  All-in-one-wp-security-and-firewall

§  Lägger en brandvägg på sajten

§  Sucuri- Scanner

§  Skannar din sajt efter malware osv.

§  Wordfence

§  Innehåller flera olika säkerhetskontroller

§  Exploit Scanner

§  Söker I databasen efter elak kod

Christian Ohlsson 113

(114)

Christian Ohlsson 114

References

Related documents

Identitetshantering: Kerberos-autentisering; LDAP-autentisering; 1 000 PIN-koder för användare; Avancerade autentiseringslösningar från HP och tredje part som tillval

Carelock ACE Gate kan drivas med extern spänningsmatning när denna finns tillgänglig ,och går att spänningsmata Carelock ACE Gate med, samt med batteri vid t ex strömavbrott.

kontaktuppgifter, deltagarförteckningar, anmälningar, fastigheter, diakoni, skötsel av begravningsväsendet och trygga församlingens eller tredje parts intressen. Dessa

Alla organisationer som har någon form av datorbaserad eller datorstödd verk- samhet bör se till att servrar, bandstationer och annan vital utrustning placeras avskilt från

Förutsatt att funktionen för avancerade lösenord inte är aktiverad skall användaren inte själv få välja sitt lösenord, då det i sådana fall, automatiskt kommer att bli

Underso kningen visär ätt det ä r fullt mo jligt ätt skäpä ett eget tillä gg i SiteVision som genomfo r äutentisering med OAuth 2.0 och sedän änvä ndä dennä fo r ätt hä

Om detta sker skulle arbetet få ändras från ett arbete där implementationer testas och därefter utvärderas till ett arbete där det istället diskuteras varför det inte är

Då en smartphones autentiseringssystem står inför risken för många olika typer av attacker är det osannolikt att det går att skapa ett autentiseringssystem som löser alla problem