[公开漏洞]Discuz! X2.5 / X3 / X3.1中CSRF攻击防御可被绕过

来源:WooYun 浏览:1293次 时间:2014-06-14
做网站找雨过天晴工作室
Discuz! X2.5 / X3 / X3.1中CSRF攻击防御可被绕过 相关厂商: Discuz! 漏洞作者:kookxiang 提交时间:2014-03-16 11:32 公开时间:2014-06-14 11:32 漏洞类型:CSRF 危害等级:中 自评Rank:10 漏洞状态: 厂商已经确认 漏洞来源:http://www.wooyun.org Tags标签: csrf 防护策略绕过 漏洞详情 披露状态:

2014-03-16:细节已通知厂商并且等待厂商处理中
2014-03-17:厂商已经确认,细节仅向厂商公开
2014-03-20:细节向第三方安全合作伙伴开放
2014-03-27:细节向核心白帽子及相关领域专家公开
2014-04-06:细节向普通白帽子公开
2014-04-26:细节向实习白帽子公开
2014-06-14:细节向公众公开

简要描述:

写插件的时候偶然发现的...可绕过Discuz自带的CSRF攻击

详细说明:

discuz在判断表单时用这个函数:

submitcheck('submit', true)



其中第二个参数本来应该是是否允许GET请求的选项。

在X2.5 / X3 / X3.1中,第二个参数为true时竟然不判断formhash直接return true了……

使用批量搜索工具搜索discuz源代码里的submitcheck(*, *)……然后发现官方也用了这种写法,尿了尿了

另外表示X2和之前的都没看过,不确定是否有问题。 我本地的X2.5 X3 X3.1这个文件基本都一样……

漏洞证明:

source/class/helper/helper_form.php

Line 22

if($allowget || ($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_GET['formhash']) && $_GET['formhash'] == formhash() && empty($_SERVER['HTTP_X_FLASH_VERSION']) && (empty($_SERVER['HTTP_REFERER']) ||
preg_replace("/https?:\/\/([^\:\/]+).*/i", "\\1", $_SERVER['HTTP_REFERER']) == preg_replace("/([^\:]+).*/", "\\1", $_SERVER['HTTP_HOST'])))) {



当$allowget = TRUE时,后面整个括号就可以无视了

修复方案:

最简单的办法,修改下这个判断语句的逻辑吧

版权声明:转载请注明来源 kookxiang@乌云 漏洞回应 厂商回应:

危害等级:低

漏洞Rank:1

确认时间:2014-03-17 16:48

厂商回复:

allowget这个参数是用户无法控制的,只有当程序员认为这个功能不需要post方式提交和formhash校验的时候,才会使用allowget这个参数。

最新状态:

暂无