What is Security?
Jason Ragsdale
Sr. Technical Yahoo
Yahoo!
Help us
Thank our
Sponsors:
Friday, November 12, 2010
A good place to start...
php.ini
display_errors = Off
register_globals = Off
open_basedir = ....
What about safe_mode??
Friday, November 12, 2010
Don’t be stupid
Never require/include any file based on user
input without checking it first.
<?php
if (isset($_GET[‘page’])
{
require $_GET[‘page’];
}
?>
URL: script.php?page=/etc/passwd
....
nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false
root:*:0:0:System Administrator:/var/root:/bin/sh
Friday, November 12, 2010
Don’t be stupid... 2
If your solution uses eval().... you are doing it
wrong
<?php
if (isset($_GET[‘input’])
{
eval($_GET[‘input’]);
}
?>
URL: script.php?input=passthru(“cat /etc/passwd”);
....
nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false
root:*:0:0:System Administrator:/var/root:/bin/sh
Friday, November 12, 2010
Input Filtering
What is input?
Anything the user or interacting system
sends to your site i.e. ($_POST, $_GET,
$_REQUEST, $_COOKIE...)
What is a whitelist?
“A list of approved or favored items”
What is a blacklist?
“A list persons who are disapproved of or
are to be punished or boycotted”
Friday, November 12, 2010
Input Validation
Unfiltered code
Example
<?php
if (isset($_POST[‘username’]))
{
$username = $_POST[‘username’];
}
Friday, November 12, 2010
Input Validation
ctype
Example
<?php
$clean = array();
if (ctype_alnum($_POST[‘username’]))
{
$clean[‘username’] = $_POST[‘username’];
}
Friday, November 12, 2010
Input Validation
Zend_Filter_Input
Example
<?php
if (isset($_POST[‘username’]))
{
$filterChain = new Zend_Filter();
$filterChain->addFilter(new Zend_Filter_Alpha())
->addFilter(new Zend_Filter_StringToLower());
$username = $filterChain->filter($_POST[‘username’]);
}
Friday, November 12, 2010
Input Validation
php/filter
Example
<?php
if (isset($_POST[‘username’]))
{
$username = filter_var(‘username’, FILTER_VALIDATE_REGEXP,
array(
‘options’=>
array(‘regexp’=>’/([a-zA-Z0-9]+)/’)
)
);
}
Friday, November 12, 2010
Output Encoding
What is output?
Anything sent back to the user / sender
of the request (RSS Feed, Form Validate,
User created data...)
htmlentities Example
<?php
$str = “A ‘quote’ is <b>bold</b>”;
//Outputs: A ‘quote’ is &lt;b&gt;bold&lt;/b&gt
echo htmlentities($str);
//Outputs: A &#039;quote&#039; is &lt;b&gt;bold&lt;/b&gt
echo htmlentities($str, ENT_QUOTES);
Friday, November 12, 2010
Tim Stiles
At this point mention XmlWriter and all
it’s wonders.... ;)
Friday, November 12, 2010
Database Inputs
(or: How I Learned to Stop Worrying and Love the Users)
Friday, November 12, 2010
How do i deal with it?
A input filter (whitelist) combined with
prepared statements... DONE
$clean = array();
if (ctype_alnum($_POST[‘username’]))
{
$clean[‘username’] = $_POST[‘username’];
}
$sql = “SELECT `username` FROM `users` WHERE `username`
= :username”;
$sth = $dbh->prepare($sql);
$sth->execute(array(‘:username’=> $clean[‘username’]));
$username = $sth->fetchColumn();
Friday, November 12, 2010
XSS
(Cross Site Scripting)
Example
<?php
echo “<p> Welcome back, {$_GET[‘username’]}.</p>”;
?>
------
Let’s exploit this
------
<p> Welcome back, <script> ....do something bad here... </script>.
</p>
Friday, November 12, 2010
XSS
(Cross Site Scripting)
If you do the two items we spoke about
Input Filtering
Output Encoding
You most likely are still vulnerable, but it’ll be a
lot harder to exploit
Almost impossible to completely nullify all
security / XSS stuff (new browsers and plugins all
the time + bad guys keep getting smarter)
Friday, November 12, 2010
CSRF
(Cross Site Request Forgeries)
Somewhere on MyFavoriteForum.com:
<img src=”bank.com/transfermoney.php?
to=me&amount=100.00”>
...if users are logged in, invisible actions can
be taken on their behalf, with their
authority.
Friday, November 12, 2010
CSRF
(Cross Site Request Forgeries)
Solutions
Sign your forms with a token (MD5 hash
with a secret key)
Validate the token before processing the
data
This can be done with Cookie and Session
data as well
Friday, November 12, 2010
Protecting Source Code
Make sure all code file extensions are
blocked from viewing
You can remove them from the html root
Or block them in the apache config
<FilesMatch “.inc$”>
order deny, allow
deny from all
</FilesMatch>
Friday, November 12, 2010
Protecting Source Code
Watch for editor backup files too!
.file.php.tmp
file.php~
etc...
Or don’t edit code on production boxes.
Friday, November 12, 2010
Code Auditing
Set a standard for your team (and yes a
team can be a single person)
Input Filtering Methods
Output Encoding Methods
Database Access Methods
Search code security points (echo, print...)
Enforce these methods
Friday, November 12, 2010
Code Auditing
Default to Secure.
Make being unsecure obvious and auditable
YAHOO_GET_RAW( “blah” )
Friday, November 12, 2010
System Security
Your website is only as secure as the
server/network is it hosted on
Perform regular package updates
Make sure you apply any updated PHP or
Apache code as soon as you can, there are
reasons for security releases
Friday, November 12, 2010
Firewalls & Access
Control
Only allow access to ports that you need to
80 - Web
443 - SSL
22 - SSH
Friday, November 12, 2010
Misc...
Signed Data (MD5)
Encrypted passwords in the DB
Config Files outside DOCROOT
Secret keys outside code, in config files
If it’s customer data USE SSL
Friday, November 12, 2010
Q&A
Friday, November 12, 2010
Please Complete An
Evaluation Form
http://joind.in/talk/view/2356
Friday, November 12, 2010

More Related Content

PDF
What Is Security
KEY
Php 101: PDO
PDF
international PHP2011_Bastian Feder_jQuery's Secrets
PDF
Unit and Functional Testing with Symfony2
PDF
PHP Data Objects
PDF
Dependency injection in PHP 5.3/5.4
PDF
php plus mysql
PDF
Dependency Injection with PHP and PHP 5.3
What Is Security
Php 101: PDO
international PHP2011_Bastian Feder_jQuery's Secrets
Unit and Functional Testing with Symfony2
PHP Data Objects
Dependency injection in PHP 5.3/5.4
php plus mysql
Dependency Injection with PHP and PHP 5.3

What's hot (19)

PDF
Decouple Your Code For Reusability (International PHP Conference / IPC 2008)
PDF
dcs plus Catalogue 2015
PDF
Unittests für Dummies
PDF
Dependency injection - phpday 2010
PPT
Mocking Dependencies in PHPUnit
PDF
PhpUnit - The most unknown Parts
PDF
jQuery secrets
DOC
PDF
Security Meetup 22 октября. «Реверс-инжиниринг в Enterprise». Алексей Секрето...
PPT
Quebec pdo
PDF
Php unit the-mostunknownparts
PPTX
Nantes Jug - Java 7
TXT
PPT
Corephpcomponentpresentation 1211425966721657-8
PDF
Php tips-and-tricks4128
PDF
Symfony2 - WebExpo 2010
PDF
PhpBB meets Symfony2
PDF
OWASP Top 10 at International PHP Conference 2014 in Berlin
Decouple Your Code For Reusability (International PHP Conference / IPC 2008)
dcs plus Catalogue 2015
Unittests für Dummies
Dependency injection - phpday 2010
Mocking Dependencies in PHPUnit
PhpUnit - The most unknown Parts
jQuery secrets
Security Meetup 22 октября. «Реверс-инжиниринг в Enterprise». Алексей Секрето...
Quebec pdo
Php unit the-mostunknownparts
Nantes Jug - Java 7
Corephpcomponentpresentation 1211425966721657-8
Php tips-and-tricks4128
Symfony2 - WebExpo 2010
PhpBB meets Symfony2
OWASP Top 10 at International PHP Conference 2014 in Berlin
Ad

Viewers also liked (8)

KEY
Caching: A Guided Tour - 10/12/2010
PPT
Web Speed And Scalability
PDF
Tulsa tech fest 2010 - web speed and scalability
KEY
Test Driven Development - Tulsa TechFest 2009
KEY
Test Driven Development - 09/2009
KEY
RIA with Flex & PHP - Tulsa TechFest 2009
KEY
Yii Introduction
KEY
Yii Framework
Caching: A Guided Tour - 10/12/2010
Web Speed And Scalability
Tulsa tech fest 2010 - web speed and scalability
Test Driven Development - Tulsa TechFest 2009
Test Driven Development - 09/2009
RIA with Flex & PHP - Tulsa TechFest 2009
Yii Introduction
Yii Framework
Ad

Similar to Tulsa techfest2010 security (20)

PPT
Security.ppt
PPT
12-security.ppt - PHP and Arabic Language - Index
ODP
My app is secure... I think
PPT
Php Security By Mugdha And Anish
PPTX
Secure Coding
PPTX
Secure coding | XSS Attacks on current Web Applications
PPT
PHPUG Presentation
PDF
OWASP Top 10 2013
PDF
2013 - Mark story - Avoiding the Owasp
PDF
PHP Secure Programming
PPT
Php My Sql Security 2007
PDF
Security in PHP Applications: An absolute must!
PPTX
Web Application Security - Folio3
PDF
Web Security: What's wrong, and how the bad guys can break your website
PPSX
Web Security
PPT
Php security
PDF
Making Joomla Insecure - Explaining security by breaking it
PDF
Php Security
PDF
Memphis php html form processing with php
PPT
Php & Web Security - PHPXperts 2009
Security.ppt
12-security.ppt - PHP and Arabic Language - Index
My app is secure... I think
Php Security By Mugdha And Anish
Secure Coding
Secure coding | XSS Attacks on current Web Applications
PHPUG Presentation
OWASP Top 10 2013
2013 - Mark story - Avoiding the Owasp
PHP Secure Programming
Php My Sql Security 2007
Security in PHP Applications: An absolute must!
Web Application Security - Folio3
Web Security: What's wrong, and how the bad guys can break your website
Web Security
Php security
Making Joomla Insecure - Explaining security by breaking it
Php Security
Memphis php html form processing with php
Php & Web Security - PHPXperts 2009

Tulsa techfest2010 security

  • 1. What is Security? Jason Ragsdale Sr. Technical Yahoo Yahoo! Help us Thank our Sponsors: Friday, November 12, 2010
  • 2. A good place to start... php.ini display_errors = Off register_globals = Off open_basedir = .... What about safe_mode?? Friday, November 12, 2010
  • 3. Don’t be stupid Never require/include any file based on user input without checking it first. <?php if (isset($_GET[‘page’]) { require $_GET[‘page’]; } ?> URL: script.php?page=/etc/passwd .... nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false root:*:0:0:System Administrator:/var/root:/bin/sh Friday, November 12, 2010
  • 4. Don’t be stupid... 2 If your solution uses eval().... you are doing it wrong <?php if (isset($_GET[‘input’]) { eval($_GET[‘input’]); } ?> URL: script.php?input=passthru(“cat /etc/passwd”); .... nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false root:*:0:0:System Administrator:/var/root:/bin/sh Friday, November 12, 2010
  • 5. Input Filtering What is input? Anything the user or interacting system sends to your site i.e. ($_POST, $_GET, $_REQUEST, $_COOKIE...) What is a whitelist? “A list of approved or favored items” What is a blacklist? “A list persons who are disapproved of or are to be punished or boycotted” Friday, November 12, 2010
  • 6. Input Validation Unfiltered code Example <?php if (isset($_POST[‘username’])) { $username = $_POST[‘username’]; } Friday, November 12, 2010
  • 7. Input Validation ctype Example <?php $clean = array(); if (ctype_alnum($_POST[‘username’])) { $clean[‘username’] = $_POST[‘username’]; } Friday, November 12, 2010
  • 8. Input Validation Zend_Filter_Input Example <?php if (isset($_POST[‘username’])) { $filterChain = new Zend_Filter(); $filterChain->addFilter(new Zend_Filter_Alpha()) ->addFilter(new Zend_Filter_StringToLower()); $username = $filterChain->filter($_POST[‘username’]); } Friday, November 12, 2010
  • 9. Input Validation php/filter Example <?php if (isset($_POST[‘username’])) { $username = filter_var(‘username’, FILTER_VALIDATE_REGEXP, array( ‘options’=> array(‘regexp’=>’/([a-zA-Z0-9]+)/’) ) ); } Friday, November 12, 2010
  • 10. Output Encoding What is output? Anything sent back to the user / sender of the request (RSS Feed, Form Validate, User created data...) htmlentities Example <?php $str = “A ‘quote’ is <b>bold</b>”; //Outputs: A ‘quote’ is &lt;b&gt;bold&lt;/b&gt echo htmlentities($str); //Outputs: A &#039;quote&#039; is &lt;b&gt;bold&lt;/b&gt echo htmlentities($str, ENT_QUOTES); Friday, November 12, 2010
  • 11. Tim Stiles At this point mention XmlWriter and all it’s wonders.... ;) Friday, November 12, 2010
  • 12. Database Inputs (or: How I Learned to Stop Worrying and Love the Users) Friday, November 12, 2010
  • 13. How do i deal with it? A input filter (whitelist) combined with prepared statements... DONE $clean = array(); if (ctype_alnum($_POST[‘username’])) { $clean[‘username’] = $_POST[‘username’]; } $sql = “SELECT `username` FROM `users` WHERE `username` = :username”; $sth = $dbh->prepare($sql); $sth->execute(array(‘:username’=> $clean[‘username’])); $username = $sth->fetchColumn(); Friday, November 12, 2010
  • 14. XSS (Cross Site Scripting) Example <?php echo “<p> Welcome back, {$_GET[‘username’]}.</p>”; ?> ------ Let’s exploit this ------ <p> Welcome back, <script> ....do something bad here... </script>. </p> Friday, November 12, 2010
  • 15. XSS (Cross Site Scripting) If you do the two items we spoke about Input Filtering Output Encoding You most likely are still vulnerable, but it’ll be a lot harder to exploit Almost impossible to completely nullify all security / XSS stuff (new browsers and plugins all the time + bad guys keep getting smarter) Friday, November 12, 2010
  • 16. CSRF (Cross Site Request Forgeries) Somewhere on MyFavoriteForum.com: <img src=”bank.com/transfermoney.php? to=me&amount=100.00”> ...if users are logged in, invisible actions can be taken on their behalf, with their authority. Friday, November 12, 2010
  • 17. CSRF (Cross Site Request Forgeries) Solutions Sign your forms with a token (MD5 hash with a secret key) Validate the token before processing the data This can be done with Cookie and Session data as well Friday, November 12, 2010
  • 18. Protecting Source Code Make sure all code file extensions are blocked from viewing You can remove them from the html root Or block them in the apache config <FilesMatch “.inc$”> order deny, allow deny from all </FilesMatch> Friday, November 12, 2010
  • 19. Protecting Source Code Watch for editor backup files too! .file.php.tmp file.php~ etc... Or don’t edit code on production boxes. Friday, November 12, 2010
  • 20. Code Auditing Set a standard for your team (and yes a team can be a single person) Input Filtering Methods Output Encoding Methods Database Access Methods Search code security points (echo, print...) Enforce these methods Friday, November 12, 2010
  • 21. Code Auditing Default to Secure. Make being unsecure obvious and auditable YAHOO_GET_RAW( “blah” ) Friday, November 12, 2010
  • 22. System Security Your website is only as secure as the server/network is it hosted on Perform regular package updates Make sure you apply any updated PHP or Apache code as soon as you can, there are reasons for security releases Friday, November 12, 2010
  • 23. Firewalls & Access Control Only allow access to ports that you need to 80 - Web 443 - SSL 22 - SSH Friday, November 12, 2010
  • 24. Misc... Signed Data (MD5) Encrypted passwords in the DB Config Files outside DOCROOT Secret keys outside code, in config files If it’s customer data USE SSL Friday, November 12, 2010
  • 26. Please Complete An Evaluation Form http://joind.in/talk/view/2356 Friday, November 12, 2010