这是我第一次发表相关文章,有问题的地方欢迎大佬指正
ripro
ripro主题是一个倾向于付费的主题,现在也有一些网站正在使用这个主题。该网站的页面:RiPro主题_资源站首选优质内容变现主题实践 (rizhuti.com)
漏洞的代码是在wordpress/wp-content/themes/ripro/inc/admin/page/balance.php该php代码中,具体代码如下:
<?php
// 主页面PHP
$perpage = 20; // 每页数量
$paged=isset($_GET['paged']) ?intval($_GET['paged']) :1; //当前页
$offset = $perpage*($paged-1); //偏移页
//////// 构造SQL START ////////
$sql = "SELECT * FROM {$balance_log_table_name}";
$where = ' WHERE 1=1';
// charge,post,cdk,other 类型:充值 资源 卡密 其他
if ( !empty( $_GET['type'] ) ) {
$where .= ' AND type="'.esc_sql($_GET['type']).'"';
}
if ( !empty( $_GET['user_id'] ) ) {
$where .= ' AND user_id='.esc_sql($_GET['user_id']);
}
echo $where;
$orderlimti = ' ORDER BY time DESC';
$orderlimti .= ' LIMIT '.esc_sql($offset.','.$perpage);
$result = $wpdb->get_results($sql.$where.$orderlimti);
$total = $wpdb->get_var("SELECT COUNT(id) FROM $balance_log_table_name {$where}");
//////// 构造SQL END ////////
?>
漏洞代码就是上面的if ( !empty( $_GET['user_id'] ) ) {
$where .= ' AND user_id='.esc_sql($_GET['user_id']);
}这里了,将用户的get请求的参数直接拼接到了sql语句中,并且在后面传到$wpdb->get_results()函数里面,造成的sql注入,先来说说为什么esc_sql()没有用。因为该参数预期是数值,所以在其外面没有像其他的参数加上了双引号包裹,就比如上面的type参数。
复现:
这里我的复现是使用phpstudy,使用wordpress5.2.5版本加上ripro5.6版本。
安装好wordpress后,在在主题里面安装ripro。
ripro安装好后,就基本上算是安装完成,可以复现了。
那么怎么用到上面漏洞用的这个php代码呢?如果你直接访问,结果会是这样:
提示找不到函数esc_sql(),这样不是正常的调用方式,要像正常的访问该段代码,在管理员登陆wordpress后,进入wp-admin/目录,即wordpress的管理页面:
左下角有个商城管理,鼠标移过去,然后点击用户余额明细查询。进入到这个页面:
这个地方对应的就是那段代码实现功能的地方。
根据代码可以尝试union 联合注入,有回显的,上面的部分php代码没贴全,后面的html会回显$result的内容。
构造user_id=-1 union select 1,2,3,user(),5,6,7,8#:
这里是已经测试了好几次是那个位置回显的,直接可以看见执行了union 并且回显了我们输入的user()。
总结:
就是一次esc_sql()函数利用错误导致的sql注入漏洞,而且是需要管理员后台的权限才可以执行,可适用范围较小,但是有特定环境还是可以为后续渗透提供一个方向的。
有什么疑问的地方可以直接发消息给我,欢迎小伙伴的讨论。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)