• 影响条件:
  • 程序:WordPress
  • 版本: ?->2.0.5
  • 严重程度:高危

正文

由于这些漏洞都是在exploit-db上面扒下来的exp,再通过exp的作用来分析程序漏洞.所以有时候exp写的比较让人难以理解,可以通过wireshark抓包来进行分析.

这个漏洞expolit-db里的exp名称是
WordPress 2.0.5 - Trackback UTF-7 - Remote SQL Injection Exploit

由于这个漏洞是注入,可以选择在wp-includes/wp-db.phpprint_error()函数里面下一个断点,OS X里可以使用macGDBp配合MAMP搭建测试环境,很方便.

我在print_error()里下了一个断点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function print_error($str = '') {
xdebug_break(); //断点在这里
global $EZSQL_ERROR;
if (!$str) $str = mysql_error();
$EZSQL_ERROR[] =
array ('query' => $this->last_query, 'error_str' => $str);
// Is error output turned on or not..
if ( $this->show_errors ) {
// If there is an error then take note of it
print "<div id='error'>
<p class='wpdberror'><strong>WordPress database error:</strong> [$str]<br />
<code>$this->last_query</code></p>
</div>";
} else {
return false;
}
}

运行一遍exp
03F08447-8CE2-4ED0-8039-BB9CA8797868.png

可以看到wireshark监听loopback已经抓到了以下的几个http数据包

FA9877B1-45D0-4BF7-949E-B943F7AC4675.png

在No.82 http数据包中看到了明显的payload
08E21E8D-45BC-412D-9801-58AC445496C0.png

将这个数据包放在burp里面重放,回到macGDBp里面查看截断的情况.

B447920E-8011-4A13-83A1-4AB74604614D.png

$blog_name是可以传入注入语句的参数.

可以看到 $blog_name先是被赋值给了$comment_author之后再被打包传入了wp_new_comment()处理
382A7665-8238-441F-818B-703083DEEA9B.png

再wp_new_comment()函数中调用了一个函数来检测相对应的帖子之前是否有使用过trackback功能评论过,所以进行了数据库查询

1
2
    if ( $wpdb->get_var($dupe) )
            die( __('Duplicate comment detected; it looks as though you\'ve already said that!') );
其中$dupe的语句就是

1
2
3
4
                $dupe = "SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = '$comment_post_ID' AND ( comment_author = '$comment_author' ";
                    if ( $comment_author_email )
                            $dupe .= "OR comment_author_email = '$comment_author_email' ";
                                $dupe .= ") AND comment_content = '$comment_content' LIMIT 1";
我们可以看到没有经过任何处理的$comment_author就这样进入了sql语句中,进行了数据库的查询. 为什么用utf-7就可以注入呢?因为`'`号使用了utf-7编码的话,就绕过了编码函数,如果用utf-8编码的`'`号,会被防注入加上`\` ![7C623354-4EF8-46C3-A6CC-5A1422E24B62.png](http://lonelyrain.me/usr/uploads/2016/06/2484722904.png) 所以我们的payload只要用utf-7编码`'`符号为`+ACc-`,让mb_convert_encoding()函数再解码为`'`号就可以闭合前面的`'`号进行注入了. 所以构造的payload是
1
                                +ACc- AND 1=0) UNION SELECT 1 FROM wp_users WHERE ID=+ACc--1+ACc- /*
看了一看这个文件的其它最后进入数据库的参数,我发现了`url`这个参数也是可以注入的,最后进入的数据库查询的语句是这个 **wp-trackback.php:87行**
1
                                $dupe = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_post_ID = '$comment_post_ID' AND comment_author_url = '$comment_author_url'");

Comments

⬆︎TOP