来源:自学PHP网 时间:2015-04-16 23:15 作者: 阅读:次
[导读] 写插件的时候偶然发现的 可绕过Discuz自带的CSRF攻击discuz在判断表单时用这个函数:submitcheck( 39;submit 39;, true)其中第二个参数本来应该是是否允许GET请求的选项。在X2 5 X3 X3 1中,第二个...
写插件的时候偶然发现的...可绕过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时,后面整个括号就可以无视了
修复方案:
最简单的办法,修改下这个判断语句的逻辑吧
|
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com