Typecho 友情链接插件 Links 越权漏洞

September 8th, 2017

趁着这几天学校刚开学能有稍微有多一点空余时间,便对博客的插件进行了一次检查维护。当维护到友链插件 Links 时,留意到一个比较奇怪的问题,在插件目录下负责处理后台管理友链请求的 Action.php 之中的全部方法没有做任何权限验证,一开始我以为 Typecho 本身会对这些请求作相应认证工作,但是经过一些测试之后证实这是一个允许越权以及表单欺骗的漏洞。

所有 Links 插件版本为 1.1.1 或之前的用户都可能受到本漏洞影响。
发现 Links 新增友链表单项目未做过滤,可以配合此漏洞实施跨站攻击,请受影响用户立即检查并修补。

漏洞修补

当务之急是须封堵漏洞入口,亦即是对友链管理操作添加权限验证。为了配合 Links 插件原生设定为仅管理员可进入友链管理页面的这一设置,则现在需要把 Action.php 中的 action() 方法也限制为仅管理员可用,具体操作很简单,只需在 action() 方法内的开头位置插入下列代码即可。

$user = Typecho_Widget::widget('Widget_User');
$user->pass('administrator');

漏洞复现

我找了一个博客使用 Typecho 并且安装了 Links 插件的好友测试了一下,首先打开自己博客后台的友链管理面板,用开发者工具把编辑链接表单 action 属性中的域名改成好友网站的域名,再点击提交。

Links_leak_1.png

执行提交后,虽然会因为未登录而跳转回到对方的博客后台登录页面,但可见页面上方仍然出现了操作成功的提示:“链接 XXX 已经被增加”,证明添加友链的操作已经绕过了权限验证被顺利执行。

跨站测试

我们可以先来做一个最简单的测试,利用插件新增友链表单,添加一个“链接名称”为 <script>alert('test')</script> 的链接。在链接被添加后即可见页面出现对应的弹出对话框,也就是说添加的 JS 代码被执行了。

Links_leak_2.png

我接下来做的几个测试证实,当博客管理员访问受攻击的友链管理页面,可以在自身不知情的情况下被他人作出获取客户端 Cookie、删除文章、更改博客配置等高危动作,具体代码就不贴出来了。说明插件对表单提交内容的过滤工作未完善;而且友链管理页面表单的“链接名称”一项对应的数据库字段数据类型为 varchar(200),此处也给攻击者留下了很大的发挥空间。

最后

快去补漏洞!

本文共有 6 则回复
  1. Loekman Loekman 回复

    虽然从来不用这个插件,不过还是佩服博主的

  2. tcdw tcdw 回复

    这玩意我以前还用过很长时间。。瑟瑟发抖

    1. Wis Chu Wis Chu

      而且貌似没什么人留意到这个问题……瑟瑟发抖

  3. Zhensheng Zhensheng 回复

    一个存在如此久的问题被你发现了。
    平时用别人的成果,除非有兴趣,不然一般都没那么多心思去细看究竟……

    1. Wis Chu Wis Chu

      其实这个问题也是偶然之间发现的啦 hhh