学生教材网 >电脑教程 > 建站教程 > CMS教程 > 浏览文章

WordPress SQL注入漏洞与提权分析[页7]

来源:网络编辑:佚名时间:2015-08-27人气:

nonono音译,陈中来,姐夫当场捅死妹夫

使用这个trick,我们能够编辑这个“puppet revision”(傀儡文章?)和自由的向他添加评论,即使他的原版post已经被丢弃到了垃圾箱当中。

结合我们上文的越权写漏洞,可以看出作者提出使用这个trick的目的是为了,利用我们之前写进垃圾箱中文章(post)的修订版 (revision)来进行编辑和评论进行操纵。因为类型为post的文章,即使是当前订阅用户提交的,也是没有权限编辑的,而revision却是可以 编辑的。所以按照原文中所说,我们可以使用这个trick继续后面的操作。

漏洞原因

这个漏洞其实是一个二次注入的漏洞,它的本质原因是在从垃圾箱还原文章时,也要还原文章下面的评论,而在还原评论的代码中存在直接拼接用户可控内容,从而导致SQL注入漏洞。下面为问题代码:

function wp_untrash_post_comments( $post = null ) {
    global $wpdb;
 
    $post = get_post($post);
    if ( empty($post) )
        return;
 
    $post_id = $post->ID;
 
    $statuses = get_post_meta($post_id, '_wp_trash_meta_comments_status', true);
 
    if ( empty($statuses) )
        return true;
 
    do_action( 'untrash_post_comments', $post_id );
 
    // Restore each comment to its original status.
    $group_by_status = array();
    foreach ( $statuses as $comment_id => $comment_status )
        $group_by_status[$comment_status][] = $comment_id;
 
    foreach ( $group_by_status as $status => $comments ) {
        // Sanity check. This shouldn't happen.
        if ( 'post-trashed' == $status )
            $status = '0';
        $comments_in = implode( "', '", $comments );
        $wpdb->query( "UPDATE $wpdb->comments SET comment_approved = '$status' 
        WHERE comment_ID IN ('" . $comments_in . "')" );
    }
 
    clean_comment_cache( array_keys($statuses) );
 
    delete_post_meta($post_id, '_wp_trash_meta_comments_status');
 
    do_action( 'untrashed_post_comments', $post_id );
}

从代码中我们可以看到$status和$comments变量的内容会拼接到SQL中,而这两个变量的内容是用户可以操控的。因为用户传入的数据会先被过滤处理后存储到数据库中,然后直接从数据库提取数据进行拼接,所以如果我们的攻击语句会在数据库提取时恢复本来面貌——标准的二次注入。

漏洞利用&对作者深深的怨念

看懂了revision和漏洞原因,利用应该很简单:

  1. 对写入文章的revision进行评论
  2. 编辑评论状态为注入攻击语句
  3. 将revision丢入垃圾箱
  4. 还原最开始的文章(revision的原版)

看似没有什么问题,不知道各位还记不记得我们上文说的_wpnonce。对!就是这个坑!作者通篇没有提到这个漏洞要怎么获取_wpnonce!这最直接的导致我们第1、2、4步没有办法玩了o(╯□╰)o。

我猜测作者没有提及这个问题,要么是他自己也没找到,这篇文章其实只是个标题党,要么是他藏了一手。从作者前后漏洞关联的那么紧密来看,我比较倾向于后一种原因,所以这里要幽怨的瞪他一眼~~

小结

作者利用读取数据库中存储内容没有进行过滤的盲点进行二次注入的思路比较直接,但是利用revision编辑垃圾箱中文章这个点真心赞。

在分析过程中发现revision的编辑并非向作者所说的可以改成trash之外的任意类型,文章状态大概有publish、future、private、inherit、auto-draft、attachment、draft、pedding、trash这几种,而我们所能修改的文章类型只能是inherit、pedding和draft这三种。否则,如果我可以修改文章状态为private,从前台完成利用第1,2步操作.

断断续续的跟了这个漏洞一周的时间了,最大的感受就是作者真心是个坑o(╯□╰)o

0x03 总结

跟这个漏洞体会最深的就是Wordpress的token机制在防护csrf的同时,也协助防御了其他类型的攻击,一个很好的机制。

GP操作的逻辑是Web代码的一个问题,尤其是在做一些权限校验时候,很容易出现Wordpress这样的GP交叉导致的逻辑混乱问题。

二次注入应该算是一个老生常谈的问题了,过于信任已记录的数据,最终会导致忘记这条记录其实是用户写入的。

如何利用robots协议优化你的WordPress博客站

很多新手建站朋友对robots协议文件的重要性不是很清楚,本篇文章由昆明SEO博主普及一下WordPress站点robots协议文件编写知识。robots协议(也称为爬虫协议、机器人协议等)的全称是网络爬虫排除标准(RobotsExclusionProtocol),网站通过robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。

如何利用织梦cms做多语言的网站

有很多网友都问过我,用dedecms织梦程序如何做中英文网站,今天就给大家来一个详细的图文教程,希望能帮助到大家。

热门推荐