Introduktion till datasäkerhet
Christian Ohlsson 1
Varför säkra upp webbapplikationer?
Christian Ohlsson 2
Vart ska man attackera?
Christian Ohlsson 3
Brandvägg Server
Win/
Mac/
Linux
Cisco SUN
Klient
Apache PHP
WP Tema
h"ps h"ps
Brandväggen?
Christian Ohlsson 4
Krypteringen?
Christian Ohlsson 5
Servern?
Christian Ohlsson 6
Apache?
Christian Ohlsson 7
PHP?
Christian Ohlsson 8
WordPress?
Christian Ohlsson 9
Någons okontrollerade kod?
Christian Ohlsson 10
Virus drabbar amerikanska drönare
Christian Ohlsson 11
SONY Playstation Network
Christian Ohlsson 12
77 miljoner konton stulna. Lösenord i klartext
SonyPictures.com
Christian Ohlsson 13
LulzSec: SQLi stal konton
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
Definitioner
§ Identifiering
§ Autentisering
§ Auktorisering
§ Sessionshantering
Christian Ohlsson 15
Identifiering/Autentisering
§ Hur kan man bevisa vem man är?
§ Biometriska pass
§ ID-kort med foto
§ Fingeravtryck
§ Användarnamn/Lösenord
Christian Ohlsson 16
Autentisering
§ Enkla eller multipla faktorer
§ Endast lösenord
§ Lösenord samt fingeravtryck
§ Avvägning mellan
§ Enkelhet
§ Kostnad
§ Komplexitet
§ Säkerhet
Christian Ohlsson 17
Christian Ohlsson 18
Christian Ohlsson 19
Autentisering på webben
Christian Ohlsson 20
Autentisering på webben
§ Enkel autentisering (Basic)
§ Autentisering med Digest
§ Autentisering med Formulär
Christian Ohlsson 21
Enkel autentisering
Christian Ohlsson 22
Enkel autentisering
Christian Ohlsson 23
Enkel autentisering
§ Ingen kryptering
§ Användarnamn och lösenord bara kodas om
§ Kräver en säker kommunikationskanal
Christian Ohlsson 24
Digest-autentisering
Christian Ohlsson 25
Hashar username och password
Digest-autentisering
Christian Ohlsson 26
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
Autentisering med formulär
Christian Ohlsson 28
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
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
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
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
RBAC: Roll baserad Access-kontroll
Christian Ohlsson 33
Ring a bell?
Christian Ohlsson 34
Olika typer av attacker
Christian Ohlsson 35
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
Session ID Forgery
§ Manipulering av URL
§ Manipulering av POST-parametrar
Christian Ohlsson 37
Citibank
Christian Ohlsson 38
Citibank kunder förlorade $2.7 miljoner dollar i en attack
Christian Ohlsson 39
23-årig attackerare fick 200.000 konton
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
Cross-Site-Scripting
Christian Ohlsson 41
Beständig
Cross-Site-Scripting
Christian Ohlsson 42
Icke-Beständig
Little Bobby Tables J
Christian Ohlsson 43
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
Christian Ohlsson 45
Christian Ohlsson 46
.gov
Christian Ohlsson 47
Wordpress.org
Christian Ohlsson 48
Lagade en felaktighet som kunde leda till XSS i version 3.1.1
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
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
Cross-Site-Request Forgery
Christian Ohlsson 51
Cross-Site-Request Forgery
Christian Ohlsson 52
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
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
SQL Injection
Christian Ohlsson 55
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
SQL Injection: Exempel
Christian Ohlsson 57
SQL Injection: Motmedel
§ Lita aldrig, aldrig aldrig på User Input, bland annat genom:
§ Formulär
§ URL
§ Cookie
§ HTTP Headers
Christian Ohlsson 58
SQL Injection: Motmedel
§ Använd ”Prepared Statements”
§ Fördelar
§ Förkompilerade frågor: lite snabbare
§ Nackdelar
§ Liiiite mer komplext
Christian Ohlsson 59
Google Hacking DB
Christian Ohlsson 60
exploit-db.com: Sårbarheter i WordPress
Christian Ohlsson 61
http://bit.ly/1jMCXlL
1337day.com
Christian Ohlsson 62
Enorm databas med färdiga exploits
metaspliot.com
Christian Ohlsson 63
User input?
Christian Ohlsson 64
NEVER NEVER NEVER
TRUST USER INPUT
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
Skriva säker kod i WordPress
Christian Ohlsson 66
Kodarens gyllene regel
Christian Ohlsson 67
Informationshantering
All data är skadlig till dess att motsatsen bevisats
Christian Ohlsson 68
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:
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:
Christian Ohlsson 71
$wpdb->insert()
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 )
Christian Ohlsson 73
$wpdb->update()
$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' )
);
Christian Ohlsson 75
$wpdb->delete()
$wpdb->delete()
Christian Ohlsson 76
$wpdb->delete(
$wpdb->posts,
array( 'ID' => 5 ), array( '%d' )
);
$wpdb->delete( $table, $where, $where_format )
Christian Ohlsson 77
$wpdb->prepare()
$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 );
$wpdb->prepare()
Christian Ohlsson 79
$wpdb->prepare( "
DELETE FROM $wpdb->postmeta WHERE post_id = %d
AND meta_key = %s ", 420, 'Europe' );
$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' );
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
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
Cross-Site Scripting (XSS)
Christian Ohlsson 83
<h1><?php echo $title; ?></h1>
DÅLIGT
Cross-Site Scripting (XSS)
Christian Ohlsson 84
<?php
$title = "<script>alert('Hello Europe!');</script>";
?>
<h1><?php echo $title; ?></h1>
DÅLIGT
Cross-Site Scripting (XSS)
Christian Ohlsson 85
<?php
$title = "<script>alert('Hello Europe!');</script>";
?>
<h1><?php echo esc_html( $title ); ?></h1>
BRA
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 ); ?>" />
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>
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
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 ); ?>" />
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 ); ?>" />
Sanera data
Att sanera data innebär att du tar data och ”tvättar” den ren
Christian Ohlsson 91
Cross-Site Scripting (XSS)
Christian Ohlsson 92
<?php
update_post_meta(
420,
'_post_meta_key',
$_POST['new_meta_value']
);
?>
DÅLIGT
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
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
Cross-site Request Forgery (CSRF)
§ Nonces
§ Action, object och user-specifika tidsstämplade hemliga nycklar
Christian Ohlsson 95
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!
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:
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:
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>
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:
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
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
Säkra din WordPress-installation
Christian Ohlsson 103
#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
#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
#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!
#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
#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
#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
#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 ');
#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
#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
#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
Christian Ohlsson 114