secure coding with wordpress (barcamp orlando 2009)

51
Secure Coding with WordPress Mark Jaquith markjaquith.com coveredwebservices.com

Upload: mark-jaquith

Post on 12-Jan-2015

2.655 views

Category:

Technology


1 download

DESCRIPTION

Slightly modified version of my Secure Coding with WordPress presentation for BarCamp Orlando 2009.

TRANSCRIPT

Page 1: Secure Coding With Wordpress (BarCamp Orlando 2009)

Secure Coding with WordPress

Mark Jaquithmarkjaquith.com

coveredwebservices.com

Page 2: Secure Coding With Wordpress (BarCamp Orlando 2009)

XSSCSRFSQL injection

privilege escalation

shell execution

Page 3: Secure Coding With Wordpress (BarCamp Orlando 2009)

Plugin security is hit-or-miss

Page 4: Secure Coding With Wordpress (BarCamp Orlando 2009)

Mostly miss

Page 5: Secure Coding With Wordpress (BarCamp Orlando 2009)

SQL Injection

Page 6: Secure Coding With Wordpress (BarCamp Orlando 2009)

<?php$wpdb->query( "UPDATE $wpdb->posts SET post_title = '$newtitle' WHERE ID = $my_id" );?>

Page 7: Secure Coding With Wordpress (BarCamp Orlando 2009)

<?php$newtitle = $wpdb->escape( $newtitle );$my_id = absint( $my_id );

$wpdb->query( "UPDATE $wpdb->posts SET post_title = '$newtitle' WHERE ID = $my_id" );?>

Page 8: Secure Coding With Wordpress (BarCamp Orlando 2009)

$wpdb->update()

Page 9: Secure Coding With Wordpress (BarCamp Orlando 2009)

<?php$wpdb->update( $wpdb->posts, array( 'post_title' => $newtitle ), array( 'ID' => $my_id ) );?>

Page 10: Secure Coding With Wordpress (BarCamp Orlando 2009)

$wpdb->insert()

Page 11: Secure Coding With Wordpress (BarCamp Orlando 2009)

<?php$wpdb->insert( $wpdb->posts, array( 'post_title' => $newtitle ) );?>

Page 12: Secure Coding With Wordpress (BarCamp Orlando 2009)

<?php$wpdb->update( $wpdb->posts, array( 'post_title' => $newtitle, 'post_content' => $newcontent ), array( 'ID' => $my_id, 'post_title' => $old_title ) );?>

Page 13: Secure Coding With Wordpress (BarCamp Orlando 2009)

<?php$post_title = 'New Title';$wheres['ID'] = 123;$wheres['post_title'] = 'Old Title';$wpdb->update( $wpdb->posts, compact( 'post_title' ), $wheres );?>

Page 14: Secure Coding With Wordpress (BarCamp Orlando 2009)

$wpdb->prepare()

Page 15: Secure Coding With Wordpress (BarCamp Orlando 2009)

<?php$title = 'Post Title';$ID = 123;$content = $wpdb->get_var( $wpdb->prepare( "SELECT post_content FROM $wpdb->posts WHERE post_title = %s AND ID = %d", $title, $ID ) );?>

Page 16: Secure Coding With Wordpress (BarCamp Orlando 2009)

•Uses sprintf() formatting

•%s for strings

•%d for integers

•You should not quote or escape

Page 17: Secure Coding With Wordpress (BarCamp Orlando 2009)

Escapelate

Page 18: Secure Coding With Wordpress (BarCamp Orlando 2009)

XSS

Page 19: Secure Coding With Wordpress (BarCamp Orlando 2009)

<h1><?php echo $title;?></h1>

Page 20: Secure Coding With Wordpress (BarCamp Orlando 2009)

<?php $title = '<script> pwnage(); </script>'?><h1><?php echo $title;?></h1>

Page 21: Secure Coding With Wordpress (BarCamp Orlando 2009)

Anything that isn’t hardcoded

is suspect

Page 22: Secure Coding With Wordpress (BarCamp Orlando 2009)

Better:Everything is suspect

Page 23: Secure Coding With Wordpress (BarCamp Orlando 2009)

wp_specialchars()

Page 24: Secure Coding With Wordpress (BarCamp Orlando 2009)

<?php $title = '<script> pwnage(); </script>'?><h1><?php echo wp_specialchars( $title );?></h1>

Page 25: Secure Coding With Wordpress (BarCamp Orlando 2009)

<?php$title = '" onmouseover="pwnd();';?><a href="#wordcamp" title="<?php echo wp_specialchars( $title );?>">Link Text</a>

Page 26: Secure Coding With Wordpress (BarCamp Orlando 2009)

attribute_escape()

Page 27: Secure Coding With Wordpress (BarCamp Orlando 2009)

<?php$title = '" onmouseover="pwnd();';?><a href="#wordcamp" title="<?php echo attribute_escape( $title );?>">Link Text</a>

Page 28: Secure Coding With Wordpress (BarCamp Orlando 2009)

<?php $url = 'javascript:pwnage();';?><a href="<?php echo attribute_escape( $url );?>">Link Text</a>

Page 29: Secure Coding With Wordpress (BarCamp Orlando 2009)

clean_url()

Page 30: Secure Coding With Wordpress (BarCamp Orlando 2009)

<?php $url = 'javascript:pwnage();';?><a href="<?php echo clean_url( $url );?>">Link Text</a>

Page 31: Secure Coding With Wordpress (BarCamp Orlando 2009)

sanitize_url(), sister of clean_url()

Page 32: Secure Coding With Wordpress (BarCamp Orlando 2009)

js_escape()

Page 33: Secure Coding With Wordpress (BarCamp Orlando 2009)

CSRF

Page 34: Secure Coding With Wordpress (BarCamp Orlando 2009)

Authorizationvs.

Intention

Page 35: Secure Coding With Wordpress (BarCamp Orlando 2009)
Page 36: Secure Coding With Wordpress (BarCamp Orlando 2009)

Noncesaction-, object-,

user-specific time limited secret keys

Page 37: Secure Coding With Wordpress (BarCamp Orlando 2009)

Specific to •WordPress user

•Action attempted

•Object of attempted action

•Time window

Page 38: Secure Coding With Wordpress (BarCamp Orlando 2009)

wp_nonce_field()

Page 39: Secure Coding With Wordpress (BarCamp Orlando 2009)

<form action="process.php" method="post"><?php wp_nonce_field('plugin-action_object');?>

...</form>

Page 40: Secure Coding With Wordpress (BarCamp Orlando 2009)

check_admin_referer( )

Page 41: Secure Coding With Wordpress (BarCamp Orlando 2009)

<?php// before output goes to browsercheck_admin_referer('plugin- action_object');?>

Page 42: Secure Coding With Wordpress (BarCamp Orlando 2009)

Still need to use current_user_can()

Page 43: Secure Coding With Wordpress (BarCamp Orlando 2009)

AJAXCSRF

Page 44: Secure Coding With Wordpress (BarCamp Orlando 2009)

• wp_create_nonce( 'your_action' );

• &_ajax_nonce=YOUR_NONCE

• check_ajax_referer( 'your_action' );

Page 45: Secure Coding With Wordpress (BarCamp Orlando 2009)

Privilege Escalation

Page 46: Secure Coding With Wordpress (BarCamp Orlando 2009)

current_user_can()

Page 47: Secure Coding With Wordpress (BarCamp Orlando 2009)

Set your salts!http://api.wordpress.org/secret-key/1.1/

Page 48: Secure Coding With Wordpress (BarCamp Orlando 2009)

Stupid shit I see all the time

Page 49: Secure Coding With Wordpress (BarCamp Orlando 2009)

exec()

Page 50: Secure Coding With Wordpress (BarCamp Orlando 2009)

<form action="<?php echo $_SERVER['REQUEST_URI']; ?>">

Page 51: Secure Coding With Wordpress (BarCamp Orlando 2009)

Thank you!