Scriptorama.nl

Header image showing a keyboard, mouse, laptop and books on design patterns

Top 5 security bugs in PHP web applicaties

De OWASP (The Open Web Application Security Project) heeft een lijst uitgegeven met de top 5 vaakst voorkomende PHP security bugs. Dit is de top 5:

1. Remote Code Execution
2. Cross-site scripting
3. SQL Injection
4. PHP Configuration
5. File system attacks

De lijst is opgesteld door de bugs van 2005 te categoriseren. Zoals zij het zelf verwoorden:

This article is the underlying research behind the SANS Top 20 2005's PHP section. The methodology used in the preparation of this article is to review all Bugtraq postings containing the word "PHP" and categorize each unique flaw. The author analyzed the most popular flaws / attacks, and researched prevention techniques, resulting in this article.

If you need more information on how to write solid, secure PHP, please consult the references.


Je kunt deze lijst dus als referentie materiaal gebruiken. Maar wat voor nut heeft het als een voorbeeld een (grote) fout bevat? PHP security expert Steffen Esser spotte een fout en blogde erover. Wat is de fout? De lijst bevat een voorbeeld van SQL injection. De OWASP lijst bevat een foute oplossing:

PHP:
  1. $sql = "SELECT * FROM ".
  2. mysql_real_escape_string($_POST['DBHOST_TBL_PREFIX']).
  3. "themes WHERE themeid = '".intval($themeid)."'";
  4.  
  5. mysql_query($sql, $conn);

In dit artikel legden we al uit wat SQL injections zijn en hoe je ze kunt voorkomen. Op het eerste gezicht lijkt dit goed, maar er toch iets fout. Het escapen van gegevens is bedoeld voor strings in queries, maar niet voor SQL keywords, database namen en tabel namen. Wat als je nou een foute tabelnaam opgeeft? Dan krijg je een SQL error en deze error kan worden weergegeven afhankelijk van je error reporting.

Eigenlijk ook dat $themeid tussen quotes staat, het gaat hier om een integer niet een string!

De oplossing is een whitelist te gebruiken, met andere woorden een lijst van geldige tabelnamen. Deze kun je in een array stoppen en bij elke query controleren of de gegeven tabelnaam wel in de whitelist voorkomt.

Reageer ook!

Tja, niet iedereen is even blij met ze: http://blog.php-security.org/archives/35-Teaching-the-Teachers.html

Wat 'safe' SQL betreft, een interessante aanpak (printf() symbolen voor variabelen): http://www.phpinsider.com/php/code/SafeSQL/

Wat cros side scripting betreft:

http://ha.ckers.org/xss.html

Check het zelf...

@michel: MySQLi biedt ook 'prepared statements' welke hetzelfde doet:

http://www.scriptorama.nl/databases/een-blik-op-mysqli-ii-prepared-statements

Het aardige van SafeSQL is dat het %c, %l en %q symbolen heeft voor arrays (komma-gescheiden waarden in SQL). Dat ontbreekt bij mijn weten bij de meeste PHP prepared statement implementaties.

Leave a comment
Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>