### 简要描述: 写插件的时候偶然发现的...可绕过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时,后面整个括号就可以无视了
### 简要描述: 写插件的时候偶然发现的...可绕过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时,后面整个括号就可以无视了