revision trick
漏洞发现者的文章最开始提到了一个revision的trick,用于承接越权写文章之后如何继续进行深入攻击。但是由于这个老外隐藏了部分技巧,导致按照他文章所说的内容无法复现订阅者账号触发SQL注入漏洞WordPress批量添加栏目 ,所以phithon在文章中没有提到这个trick。我在这里本着还原作者思路的目的,向大家介绍一下关于这个trick的原理。
下面是原文关于这个trick部分的翻译:
revisions字段用于记录草稿或者更新的发布,Wordpress中用revisions记录对于完成的提交和存储都会在posts数据库表中将post_type设置成revision,每个revision都会有一个’post_parent’字段,指明这个revision所基于的原版提交。
当尝试编辑一个revision时,会通过post_parent来进行校验,而不是revision本身。这样,如果我们基于一个post创建一个revision,那么我们可以任意设置它的状态为“trash”之外的任何状态,即使原始的post的状态是“trash”
使用这个trick,我们能够编辑这个“puppet revision”(傀儡文章?)和自由的向他添加评论,即使他的原版post已经被丢弃到了垃圾箱当中。
结合我们上文的越权写漏洞,可以看出作者提出使用这个trick的目的是为了,利用我们之前写进垃圾箱中文章(post)的修订版(revision)来进行编辑和评论进行操纵。因为类型为post的文章,即使是当前订阅用户提交的WordPress批量删除关键词 ,也是没有权限编辑的WordPress批量上传内容 ,而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'WordPress批量添加产品 , $post_id );
// Restore each comment to its original status.
WordPress批量助手$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中,而这两个变量的内容是用户可以操控的。因为用户传入的数据会先被过滤处理后存储到数据库中,然后直接从数据库提取数据进行拼接,所以如果我们的攻击语句会在数据库提取时恢复本来面貌——标准的二次注入。
文章地址:https://www.tianxianmao.com/article/wordpress/xSQLzrld.html