How to get Tomorrowland tickets - A technical analysis en

By Gtoniser on Monday 6 February 2017 10:27 - Comments (10)
Category: Algemeen, Views: 5.938

Introduction
Tomorrowland - Every year over a million people (as the organisation claims) try to obtain tickets for this 3-day festival in Belgium.
Since the amount of tickets is considerably lower than the number of people interested, many people leave disappointed after the ticket sale every year.
This blogpost explores the technique used by Paylogic, the payment provider for the Tomorrowland tickets, to sell the tickets in a scalable way.
It also shows how this system can be scripted/abused to increase your chance of buying tickets.

Read more »

Wachtwoorden hashen? Wettelijk verplicht!

Door Gtoniser op donderdag 7 augustus 2014 12:06 - Reacties (19)
Categorie: Algemeen, Views: 5.810

Nodig?
"Ja, Joomla slaat de wachtwoorden standaard beveiligd op, maar dat vinden we niet handig dus slaan we ze ook als plaintext op"
Tijdens een gesprek met een klant kwam deze opmerking afgelopen week langs. Ja, een wachtwoord plaintext opslaan kan soms handig zijn, maar een beetje webdeveloper weet wel dat zulke dingen niet door de beugel kunnen.
Het excuus wat ik wel eens langs hoor komen is dat de dienst toch niet zo belangrijk is, en mensen hooguit een wachtwoord voor die dienst buit kunnen maken.
Fout.
Veel mensen gebruiken standaard dezelfde wachtwoorden, en als ik een kwaadwillende "hacker" ben en ik heb jouw email en wachtwoord, dan ga ik deze natuurlijk als eerste proberen op je email account, facebook, etc

Verplicht!
Wat veel mensen niet lijken te weten is dat het goed beveiligen van wachtwoorden in Nederland wettelijk is verplicht. In Nederland hebben we namelijk te maken met de Wet Bescherming Persoonsgegevens.
De text van deze wet kun je hier vinden. Het artikel in toepassing is artikel 13:
quote: WBP
De verantwoordelijke legt passende technische en organisatorische maatregelen ten uitvoer om persoonsgegevens te beveiligen tegen verlies of tegen enige vorm van onrechtmatige verwerking. Deze maatregelen garanderen, rekening houdend met de stand van de techniek en de kosten van de tenuitvoerlegging, een passend beveiligingsniveau gelet op de risico's die de verwerking en de aard van te beschermen gegevens met zich meebrengen. De maatregelen zijn er mede op gericht onnodige verzameling en verdere verwerking van persoonsgegevens te voorkomen.
Wat betekent dit nou in de praktijk? Het orgaan wat toezicht houdt op deze wet, het College Bescherming Persoonsgegevens (CBP) heeft een handig document hierover: http://www.cbpweb.nl/down...ging-persoonsgegevens.pdf
Hoewel het woord "richtsnoeren" misschien wat lijkt op aanbevelingen, moet je dit niet zien als een voorbeeld, maar als de invulling van de wet waar je je aan dient te houden.
In het hoofdstuk over het hiervoor genoemde Artikel 13 vinden we onder andere het volgende:
quote: CBP
Naast de beveiliging van persoonsgegevens ziet artikel 13 Wbp ook op de toepassing van privacy enhancing technologies (pet)
(...)
pet is de verzamelnaam voor een aantal technieken die de verantwoordelijke kan toepassen om bij het verwerken van persoonsgegevens de risico’s voor de betrokkenen te beperken.
Even verder vinden we wat voor regelgeving deze pet inhoudt:
quote: CBP
Bij het onderzoeken en beoordelen van de naleving van de wettelijke verplichting tot het toepassen van pet hanteert het cbp als uitgangspunt een aantal gangbare pet maatregelen. Deze maatregelen zijn:
• Encryptie (versleuteling) en hashing
De verantwoordelijke maakt gebruik van cryptografische bewerkingen om de persoonsgegevens
die hij verwerkt te beveiligen. Hij past encryptie (versleuteling) toe bij verzending van persoonsge­
gevens via het internet, bij de opslag van persoonsgegevens op draagbare apparatuur en op verwij­derbare media zoals usbsticks en in andere situaties waar persoonsgegevens kwetsbaar zijn voor toegang door onbevoegden (bijvoorbeeld persoonsgegevens die via het world wide web kunnen worden benaderd). Bij de opslag en verwerking van wachtwoorden maakt hij gebruik van hashing. Bij het toepassen van cryptografische technieken past hij alle gangbare voorzorgsmaatregelen toe, zoals goed ingericht sleutelbeheer en het gebruik van sleutellengten en versleutelingstechnieken die in overeenstemming zijn met de actuele stand van de techniek.
Voor de duidelijkheid, dit betekent dat dingen als
PHP:
1
2
$hash = md5($password);
$hash = sha1($password);

NIET voldoende zijn.
Deze technieken zijn hopeloos verouderd, met een beetje moderne videokaart kun je zo'n 10.000 Miljoen tot 20.000 Miljoen hashes per seconde testen (bron).

In de praktijk
Wat is dan wel een goede beveiliging voor wachtwoorden in een database?
Een goede hash voldoet tenminste aan de volgende punten:
- Een random salt
- Een sterk algorithme (blowfish, sha256, sha512, etc)
- Voldoende encryptie rondes

Er zijn voldoende sites die dit verder uitwerken. Een voorbeeld voor PHP kun je hier vinden: http://www.martinstoeckli.ch/php/php.html#bcrypt

Een stukje code PHP wat ik vaak gebruik en aan deze voorwaarden voldoet (sha256 met >15000 encryptie rondes):

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class login {
    public static function securePass($input,$salt=null){
        //Secure password
        //Random salt if no salt given (if salt given its for decoding purposes)
        if($salt == null){
            $binaryLength = (int)(16 * 3 / 4 + 1);
            if(function_exists('openssl_random_pseudo_bytes')){
                $salt = substr(str_replace('+', '.',base64_encode(openssl_random_pseudo_bytes($binaryLength))), 0, 16);
            }elseif(function_exists('mcrypt_create_iv')){
                $salt = substr(str_replace('+', '.',base64_encode(mcrypt_create_iv ( $binaryLength , MCRYPT_DEV_URANDOM  ))), 0, 16);
            }else{
                $salt = substr(str_replace('+', '.', base64_encode(pack('N4', mt_rand(), mt_rand(), mt_rand(), mt_rand()))), 0, 16);
            }
        }
        $crypttype = '$5$rounds=17838$';
        return substr(crypt($input,$crypttype.$salt.'$'),strlen($crypttype));
    }
    public static function validatePass($pass,$passhash){
        $passparts = explode('$',$passhash);
        $salt = $passparts[0];
        $out = self::securePass($pass,$salt);
        if(strcmp($out,$passhash) == 0){
            return true;
        }else{
            return false;
        }
    }
}


Gebruiksvoorbeeld:
PHP:
1
2
3
4
5
//Maak een hash aan die je in de database kunt opslaan
$hash = login::securePass($password);

//Controleer het wachtwoord met de hash uit de database
$valid = login::validatePass($password,$hash);


Een bijkomend voordeel is dat deze functie het gebruikte hashtype en rondes niet opslaat in de database, dus als een hacker een database dump heeft weet hij nog steeds niet hoeveel encryptie rondes je hebt gebruikt. Nadeel daarvan is dat als je de encryptie methode of het aantal rondes verandert, alle wachtwoorden uit je database het niet meer doen.

Tot slot: Wachtwoord hashing is niet alles, maar het is wel een belangrijke stap in ieder login systeem. Wil je meer weten over websites en security? Kijk eens op https://www.owasp.org/

Gamen met PS3 controller op Windows

Door Gtoniser op zondag 27 april 2014 14:48 - Reacties (15)
Categorie: Algemeen, Views: 7.283

Ik game tegenwoordig steeds vaker op mijn PC dan op m'n PS3 die toch wel erg oud aan begint te voelen. Daarnaast zijn spellen voor de PC vaak een stuk goedkoper en zien ze er vaak beter uit op de PC.
Echter zijn niet alle spellen zeer geschikt voor toetsenbord en muis. Spellen zoals Assassins Creed, The Witcher, Tomb Raider, etc, speel ik liever met een controller, op de bank, op de TV.
Met een Xbox controller is dit vrij simpel, daar is gewoon in Windows ondersteuning voor en veel spellen snappen de controls automatisch.
Met een PS3 controller, de DS3, is dat wat lastiger, maar als je weet hoe, is het ook vrij simpel.

Hier een korte tutorial, met de hoop dat meer tweakers dit nuttig vinden:

Stap 1: MotioninJoy
Om de controller te laten werken, heb je drivers nodig. Deze kun je krijgen door het programma MotioninJoy te downloaden van http://www.motioninjoy.com/download
Nadat je dit gedownload en hebt geïnstalleerd, start je het programma op.
Je moet nu de DS3 controller verbinden via USB. Hierna kun je via het "Driver Management" de optie "Load Driver" kiezen, wat de driver installeert op die USB poort.
Als je meer info wilt voor deze stap, de installatie instructies staan op http://www.motioninjoy.com/wiki/en/install/latest

Stap 2: Better DS3
Het probleem met MotioninJoy is dat het:
- Een draak van een programma is
- Admin rechten nodig heeft
- De programma code iedere keer via het internet ophaalt in HTML vorm (dit is dus een groot security risk)

Gelukkig heb je het programma zelf niet nodig, er is namelijk een veel beter alternatief, genaamd Better DS3.
Dit kun je downloaden van deze site: http://betterds3.ciebiera.net/
Het programma heeft alleen de driver nodig van MotioninJoy, vandaar dat we dit eerst moesten installeren.
In Better DS3 kun je het profiel instellen voor je controller, de button mapping veranderen, en nog diverse andere instellingen aanpassen.
http://betterds3.ciebiera.net/bds3wp/wp-content/themes/responsive-child-theme/images/featured-image.png
Mijn beste ervaring is om de controller als Xinput profiel te laten werken, dit emuleert een Xbox 360 controller. Omdat ik de Assassins Creed serie veel op de PS3 heb gespeeld, vond ik het zelf handig om de L1 en L2 om te wisselen (net als de R1 en R2), omdat ik anders telkens de verkeerde knop indrukte :P

Stap 3: Draadloos gamen
De voorgaande stappen stellen je in staat om via USB met je DS3 te gamen. Op zich kun je hier stoppen, maar de beste ervaring heb je natuurlijk als er geen USB kabel constant aan je controller hangt.
Gelukkig kunnen we de DS3 ook draadloos laten werken.
Wat je nodig hebt is een Bluetooth adapter die minimaal versie 2.1 van de Bluetooth standaard ondersteunt en EDR ondersteuning biedt. Dit laatste is meestal niet het geval met de goedkopere dongles die je voor een paar euro/dollar in China bestelt.
Een Bluetooth dongle die compatible is kun je hier vinden: pricewatch: Sitecom CN-516 Bluetooth 2.1 USB Micro Adapter

Na het installeren van de Bluetooth driver via de MotioninJoy interface, kun je in Better DS3 de master host van je DS3 veranderen, zodat als je de controller aanzet hij verbinding met je PC maakt.
Om draadloos te spelen is het runnen van Better DS3 niet altijd nodig, voor USB wel. Zorg dus voordat je je game start je het programma hebt runnen.

Android en je privacy

Door Gtoniser op maandag 18 maart 2013 12:44 - Reacties (17)
Categorie: Algemeen, Views: 6.437

Laten we even voorop stellen dat ik een groot fan ben van Android. Als tweaker vind ik het geweldig dat ik alles met mijn telefoon kan doen en hem precies zo kan aanpassen als ik dat wil met custom roms en themes.
Toen ik echter afgelopen week wat aan het spelen was met mijn tablet en een test app installeerde via de Android SDK kwam ik ineens het volgende tegen in mijn LogCat:

code:
1
2
3
4
03-15 17:09:17.460: I/GetJar SDK [com.zeptolab.ctr.hd.google.paid](15588): CommManager: processesRequest() [thread:31729] [request:-1075312065] Starting Request -1075312065
03-15 17:09:17.460: D/GetJar SDK [com.zeptolab.ctr.hd.google.paid](15588): CommManager: processesRequest() [thread:31729] [request:-1075312065] Making a request to: 'https://rptuse20120814.getjar.com:443/user/devices/000203ec00000000009c4d82/apps/report_usage?version=20120401'
03-15 17:09:17.480: D/GetJar SDK [com.zeptolab.ctr.hd.google.paid](15588): CommManager: processesRequest() [thread:31729] [request:-1075312065] Sending POST data as part of the request [length: 584]:
03-15 17:09:17.480: D/GetJar SDK [com.zeptolab.ctr.hd.google.paid](15588): app_usage_data=%5B%7B%22usage_type%22%3A%22UNINSTALLED%22%2C%22app_metadata%22%3A%5B%7B%22value%22%3A%221.0%22%2C%22key%22%3A%22android.package.version_name%22%7D%2C%7B%22value%22%3A%22android%22%2C%22key%22%3A%22device.platform%22%7D%2C%7B%22value%22%3A%221%22%2C%22key%22%3A%22android.package.version_code%22%7D%2C%7B%22value%22%3A%22eu.sanoweb.webviewtest%22%2C%22key%22%3A%22android.package.name%22%7D%2C%7B%22value%22%3A%224.1.1%22%2C%22key%22%3A%22device.platform_version%22%7D%5D%2C%22tracking_metadata%22%3A%5B%5D%2C%22event_timestamp%22%3A%222013-03-15T16%3A09%3A17Z%22%7D%5D


Iets is dus blijkbaar mijn "Device usage" aan het syncen naar een server. Als we even urldecode over de data heen halen krijgen we de volgende JSON string:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[ {
    "usage_type" : "UNINSTALLED",
    "app_metadata" : [ {
        "value" : "1.0",
        "key" : "android.package.version_name"
    }, {
        "value" : "android",
        "key" : "device.platform"
    }, {
        "value" : "1",
        "key" : "android.package.version_code"
    }, {
        "value" : "com.test.webviewtest",
        "key" : "android.package.name"
    }, {
        "value" : "4.1.1",
        "key" : "device.platform_version"
    } ],
    "tracking_metadata" : [],
    "event_timestamp" : "2013-03-15T16:09:17Z"
} ]

Bij het installeren van een app wordt dit ook verzonden naar de server.
Wat verder onderzoek laat zien dat dit afkomstig is van de app "Cut the Rope" van zeptolab. Maar waarom houdt dit bij welke apps ik installeer en verwijder?
De volgende pagina biedt uitkomst: https://developer.getjar....paign-tracking-analytics/
GetJar’s Pay-Per-Install program tracks App install events on the user’s device. These are events when the user visits the Google Play Store, downloads and installs the App on their phone. Since Getjar’s SDK is integrated into a Publisher’s application, it has the permission to listen to the ACTION_PACKAGE_ADDED system event. For more details of this event, please refer to the Android documentation here ACTION_PACKAGE_ADDED
Vanuit de developer documentatie komen we erachter dat dit via een "broadcast" aan alle apps wordt gestuurd bij een nieuwe install of uninstall.
Leuk natuurlijk, maar het lijkt me niet de bedoeling dat deze dingen naar diverse ad providers worden verstuurd.

Door de app op te zoeken in Google Play komen we bij de volgende privacy policy uit van ZeptoLab: http://www.zeptolab.com/pp.htm

Hier staat inderdaad in dat door het downloaden van een app je Zeptolab toestemming geeft om zo ongeveer alle "non-personal data" te verzamelen en te versturen naar third parties.
De apps die je installeert vallen blijkbaar ook onder Non-personal data.

Nu vind ik dit nogal apart. Over het algemeen zeggen apps die je installeert natuurlijk niet zo veel over je persoon. Maar wat als ik een rooster app van een universiteit installeer? Weet je gelijk waar ik studeer. En een Bijbel of Koran app? Of een app van een datingsite?

Het is natuurlijk niet gegarandeerd dat GetJar deze informatie verzamelt en opslaat (immers het doel is volgens de site om te tracken of iemand een app installeert na aanleiding van een advertentie), maar dat alles wat ik doe met mijn tablet wordt verstuurt naar random derde partijen waar ik nog nooit van heb gehoord vind ik persoonlijk niet erg fijn.

Wat me het meest verbaast is nog wel dat er totaal geen permissies nodig zijn om deze "broadcasts" te ontvangen. Enkel internet permissie (wat iedere app vrijwel heeft) is voldoende om deze data naar een willekeurige server te versturen.
Wat mij betreft slaat Google hier toch wel behoorlijk de plank mis.
Ben benieuwd wat anderen hierover denken :)

Joomla op IIS

Door Gtoniser op zaterdag 27 oktober 2012 16:15 - Reacties (4)
Categorie: Algemeen, Views: 2.482

Joomla is net als Wordpress een vrij populair CMS.
Het probleem dat veel pakketten echter hebben, is dat ze ontworpen worden voor Apache op Linux. Dit is niet helemaal onterecht natuurlijk, omdat dit nu eenmaal het overgrote deel van de hostings betreft.
Voor wie echter met IIS werkt, geven deze pakketten vaak nogal problemen.

De "Search engine friendly" (SEF) module van Joomla bijvoorbeeld, wil niet zomaar werken met Microsoft's url_rewrite module. Zoals wel meer pakketten doen, gebruiken ze de PHP variable $_SERVER['REQUEST_URI']. Het probleem is echter, dat IIS deze variable niet kent, en dus het een en ander in de soep loopt.
Om dit toch te fixen, kun je (uiteraard alleen op IIS, apache heeft dat niet nodig), de volgende regels toevoegen bovenin de index.php van Joomla:

PHP:
1
2
3
4
5
6
if (isset($_SERVER['HTTP_X_REWRITE_URL']))
{
    $_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_REWRITE_URL'];
}elseif(!isset($_SERVER['REQUEST_URI'])){
    $_SERVER['REQUEST_URI'] = $_SERVER['PHP_SELF'];
}



Een ander probleem waar ik tegenaan liep, is dat Joomla niet helemaal snapt dat bestandsnamen op Windows niet hoofdlettergevoelig zijn. Dit gaf foutmeldingen dat het path niet in de open_basedir van PHP zou staan bij het uploaden van een extensie.
Folder::create: Path not in open_basedir paths; Unable to create destination
Het veranderen van de volgende code in /libraries/joomla/filesystem/folder.php gaf ook hier een oplossing voor:
(rond regel 236)

PHP:
1
2
3
4
5
6
7
8
9
10
// Iterate through open_basedir paths looking for a match
                foreach ($obdArray as $test)
                {
                    $test = JPath::clean($test);
                    if (strpos($path, $test) === 0)
                    {
                        $inBaseDir = true;
                        break;
                    }
                }

naar
PHP:
1
2
3
4
5
6
7
8
9
10
// Iterate through open_basedir paths looking for a match
                foreach ($obdArray as $test)
                {
                    $test = JPath::clean($test);
                    if (strpos(strtolower($path), strtolower($test)) === 0)
                    {
                        $inBaseDir = true;
                        break;
                    }
                }


Sowieso vind ik het nogal overkill om te kijken of een subdirectory van je website wel in je open_basedir path staat, ten eerste is dat een vrij logische aanname (hoe kun je anders de pagina bereiken) en ten tweede kan dit prima opgevangen worden bij het aanmaken van de map.

Hoewel dit waarschijnlijk niet het meest interessante blogitem is om te lezen, zijn er misschien mensen die dit ooit ook nodig hebben (en ik ben het zelf al meerdere keren tegengekomen, maar vergeet altijd hoe ik het ook al weer had opgelost).