Introduktion till datasäkerhet Christian Ohlsson 1
Varför säkra upp webbapplikationer? Christian Ohlsson 2
Vart ska man attackera? Tema WP PHP Apache Win/ Mac/ Linux h"ps Cisco h"ps SUN Klient Brandvägg Server Christian Ohlsson 3
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 77 miljoner konton stulna. Lösenord i klartext Christian Ohlsson 12
SonyPictures.com LulzSec: SQLi stal konton Christian Ohlsson 13
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 Hashar username och password Christian Ohlsson 25
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 Citibank kunder förlorade $2.7 miljoner dollar i en attack Christian Ohlsson 38
23-årig attackerare fick 200.000 konton Christian Ohlsson 39
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 Beständig Christian Ohlsson 41
Cross-Site-Scripting Icke-Beständig Christian Ohlsson 42
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
.gov Christian Ohlsson 46
Christian Ohlsson 47
Wordpress.org Lagade en felaktighet som kunde leda till XSS i version 3.1.1 Christian Ohlsson 48
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 http://bit.ly/1jmcxll Christian Ohlsson 61
1337day.com Enorm databas med färdiga exploits Christian Ohlsson 62
metaspliot.com Christian Ohlsson 63
User input? NEVER NEVER NEVER TRUST USER INPUT Christian Ohlsson 64
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 global $wpdb; $ID = $_GET['ID']; $sql = "SELECT post_title FROM $wpdb->posts WHERE ID = '$ID';"; Tänkt resultat: SELECT post_title FROM wp_posts WHERE ID = '5'; Christian Ohlsson 69
SQLi och WordPress global $wpdb; $ID = $_GET['ID']; $sql = "SELECT post_title FROM $wpdb->posts WHERE ID = '$ID';"; Möjligt resultat: SELECT post_title FROM wp_posts WHERE ID = ' ; SELECT * FROM wp_users WHERE 1 = '1'; Christian Ohlsson 70
$wpdb->insert() Christian Ohlsson 71
$wpdb->insert() $wpdb->insert( $table, $data, $format ) $wpdb->insert( $wpdb->postmeta, array( 'post_id' => '5', 'meta_key' => '_custom_meta_key', 'meta_value' => 'true' ), array( '%d', '%s', '%s' ) ); Christian Ohlsson 72
$wpdb->update() Christian Ohlsson 73
$wpdb->update( $table, $data, $where, $format, $where_format ) $wpdb->update( $wpdb->postmeta', array( 'meta_value' => 'false' ), array( 'post_id' => 5, 'meta_key' => '_custom_meta_key' ), array( '%s' ), array( '%d', '%s' ) ); Christian Ohlsson 74
$wpdb->delete() Christian Ohlsson 75
$wpdb->delete() $wpdb->delete( $table, $where, $where_format ) $wpdb->delete( $wpdb->posts, array( 'ID' => 5 ), array( '%d' ) ); Christian Ohlsson 76
$wpdb->prepare() Christian Ohlsson 77
$wpdb->prepare() $wpdb->prepare( " SELECT post_title FROM $wpdb->posts WHERE ID = %d ", $ID ); 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() $wpdb->prepare( " DELETE FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = %s ", 420, 'Europe' ); Christian Ohlsson 79
$wpdb->prepare() $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' ); Christian Ohlsson 80
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 esc_attr_e() 1 2 3 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 Christian Ohlsson 82
Cross-Site Scripting (XSS) DÅLIGT <h1><?php echo $title;?></h1> Christian Ohlsson 83
Cross-Site Scripting (XSS) DÅLIGT <?php $title = "<script>alert('hello Europe!');</script>";?> <h1><?php echo $title;?></h1> Christian Ohlsson 84
Cross-Site Scripting (XSS) BRA <?php $title = "<script>alert('hello Europe!');</script>";?> <h1><?php echo esc_html( $title );?></h1> Christian Ohlsson 85
esc_attr() Används när du vill visa data i ett HTML element <input type="text" name="name" value="<?php echo esc_attr( $text );?>" /> http://codex.wordpress.org/function_reference/esc_attr Christian Ohlsson 86
esc_textarea() Används när du vill visa data i en <textarea> <textarea name="bio"> <?php echo esc_textarea( $bio);?> </textarea> http://codex.wordpress.org/function_reference/esc_textarea Christian Ohlsson 87
esc_url() Används när du vill validera och tvätta URL <a href="<?php echo esc_url( $url);?>">link</a> http://codex.wordpress.org/function_reference/esc_url Christian Ohlsson 88
absint() Konverterar en siffra till en positiv siffra $ID = absint( $_GET['ID'] ); <input type="text" name="number_posts" value= <?php echo absint( $number );?>" /> http://codex.wordpress.org/function_reference/absint Christian Ohlsson 89
intval() Returnerar en integer. Fungerar med negativa tal $ID = intval( $_GET['ID'] ); <input type="text" name="number_posts" value= <?php echo intval( $number );?>" /> http://php.net/manual/en/funclon.intval.php Christian Ohlsson 90
Sanera data Att sanera data innebär att du tar data och tvättar den ren Christian Ohlsson 91
Cross-Site Scripting (XSS) DÅLIGT <?php update_post_meta( 420, '_post_meta_key', $_POST['new_meta_value'] );?> Christian Ohlsson 92
sanitize_text_field() BRA <?php update_post_meta( 34, '_post_meta_key', sanitize_text_field( $_POST['new_meta_value'] ) );?> http://codex.wordpress.org/function_reference/sanitize_text_field Christian Ohlsson 93
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) <?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! Christian Ohlsson 96
wp_nonce_field( $action, $name, $referer, $echo ); 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: <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 Christian Ohlsson 97
check_admin_referer($action, $query_arg ) Kontrollera koden: 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 Christian Ohlsson 98
Fixat exempel <?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> Christian Ohlsson 99
wp_nonce_url($actionurl, $action, $name ) $url = 'http://example.com/wp-admin/?id=5'; $url = wp_nonce_url( $url, 'bw_process_email_action', 'bw_newsletter' ); Ny URL: http://example.com/wp-admin/?id=5&bw_newsletter=287de957e8 http://codex.wordpress.org/function_reference/wp_nonce_url Christian Ohlsson 100
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-wordpressplugin-development-best-practices/ http://wpengine.com/2013/05/brad-williams-on-securewordpress-development/ Säkerhetspresentationer http://wordpress.tv/2013/08/09/mike-adams-three-securityissues-you-thought-youd-fixed/ http://wordpress.tv/2013/09/26/brennen-byrne-employing-bestsecurity-praclces-for-wordpress-sites-3/ http://wordpress.tv/2011/01/29/mark-jaquith-theme-pluginsecurity/ 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 Tänk långt, tänk svenskt! Christian Ohlsson 106
#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 function crille_remove_version () { return''; } add_filter ('the_generator', 'crille_remove_version '); Christian Ohlsson 110
#8 Skydda wp-config.php Viktigaste konfigurationsfilen Du kan/bör flytta wp-config.php upp en nivå /var/www/crille/public_html/sajt/wp-config.php /var/www/crille/public_html/wp-config.php Christian Ohlsson 111
#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