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

Secure Coding With Wordpress (BarCamp Orlando 2009)

Embed Size (px)

DESCRIPTION

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

Citation preview

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!