Wordpress 2.0.5 - Trackback UTF-7 SQL injection分析
- 影响条件:
- 程序: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.php的print_error()函数里面下一个断点,OS X里可以使用macGDBp配合MAMP搭建测试环境,很方便.
我在print_error()里下了一个断点
|
|
运行一遍exp
可以看到wireshark监听loopback已经抓到了以下的几个http数据包

在No.82 http数据包中看到了明显的payload
将这个数据包放在burp里面重放,回到macGDBp里面查看截断的情况.

$blog_name是可以传入注入语句的参数.
可以看到 $blog_name先是被赋值给了$comment_author之后再被打包传入了wp_new_comment()处理
再wp_new_comment()函数中调用了一个函数来检测相对应的帖子之前是否有使用过trackback功能评论过,所以进行了数据库查询
|
|
其中$dupe的语句就是
1234
$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编码的`'`号,会被防注入加上`\`

所以我们的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'");