发现

无意间看到一名宅。大佬发表的一篇文章,他的网站被XSS攻击了,而这个攻击目标正好是Links友链插件,正好我也在用这个插件,就特意说一下

详情这里

重现

我研究了一下,可以通过访问某个链接就可以添加新的友链,如果自己的友链数据被修改就很危险了

大概流程是:访问友链插件action地址: h t t p s : / / i n n c 1 1 . c n / a c t i o n / l i n k s - e d i t (这是我自己的,大佬们手下留情)

然后模拟表单进行提交数据(插入、修改、或者删除)(只做演示,具体的参数我不会透露),由于没有权限检测,就会直接修改成功。

Links漏洞重现.gif

漏洞

因为Links插件插入友链、更新友链的操作是通过Typecho的action机制进行的。

可以大概理解为在指定URL后面附加不同的post参数就可以实现不同的功能do=insert(插入)、do=update(更新)。

到这儿一切都没什么问题,可关键就在于作者并没有考虑到插件鉴权的问题,导致可以在未登陆的情况下通过指定URL插入、修改、删除友链数据,如果被插了XSS进去了所有访问此网站的人都会受影响

大佬表示当他注意到这个问题时cookie已经被恶意上传了,这就意味着拿到cookie的人可以直接使用cookie登录你的博客后台(不用输入密码)而他也在第一时间将后台页面删除了。(不愧是大佬意识真的很强)

解决方式

大佬在他的文章里提到了修改默认的管理地址,就是那个admin文件夹。

但实际上这个方法实测对这个漏洞并不起作用,因为Links插件修改数据是通过Typecho的action机制进行,实际上并不需要访问你的管理地址,只需要访问action地址就可以达到目的

2021年1月1日02:10:24补充:
那位大佬之所以要修改管理地址,是因为被加载了恶意JS后,恶意JS已经将他的后台登录Cookie上传了,为了避免不必要的损失,及时修改、删除管理地址都是最直接的做法。
而我所说的这个Action漏洞和其并不冲突,因为被挂了恶意js后,后续的网站访问者仍然会受到这个恶意文件的影响,所以两个方法都是正确的,只是解决的问题不一样而已

(所谓action地址就是https: //domain.com/action,action后面接不同的参数来访问不同的插件API),

我有一个办法:

  1. 打开usr/plugins/Links/Action.phpp

  2. 找到107行左右的public function action()action()函数

  3. 在函数的开头新建一行输入,切记一定要放在action()函数的开头


/* 需要管理员以上权限 */

$this->widget('Widget_User')->pass('administrator');

然后保存关闭

当非法访问时会自动检查用户的权限是否为管理员,如果不是或者未登录会跳转到响应的登录或报错页面,从而避免了为鉴权访问

闲话

除了这个漏洞以外,我也建议正在使用Typecho的大家能够修改掉默认的管理地址(默认是 域名/admin),可以避免许多风险,在我的博客平均每天要被撞库100多次(Access插件记录),还好我设置了强密码,不然可就危险了

最后要感谢一名宅。大佬的文章,这个问题普通用户的确很难注意到,同时也提醒一下大家,如果可以,尽可能屏蔽掉博客主页所有的登录入口(如果是个人博客的话),登录后台时使用URL登录可以很大程度上避免安全风险。