请选择 进入手机版 | 继续访问电脑版
站长学院
各类建站教程汇总整理
261 个话题,1205 个回复

【最新漏洞解决】 函数check_seccode()漏洞
所属分类:Discuz!技巧  /   回复:2  /  阅读:1317
茶姒兔子 发表于 2016-12-3 11:02:30 | 显示全部楼层 |阅读模式
本帖最后由 茶姒兔子 于 2016-12-3 11:12 编辑

函数check_seccode()漏洞,该函数在/source/class/helper/helper_seccheck.php中,discuz验证码处理漏洞


(百度云观测爆出discuz漏洞)


嗯我乍一看实际上解决这个漏洞很简单,我们给他加个数据过滤函数就是了,过滤一般就是对数值整数化、文字文本化这些,表单输入必有的代码。比如管理帖子时填写理由,变量是$_GET['reason'],担心有人别有用心把代码符号写进去,变成执行代码,就加个过滤函数:htmlspecialchars($_GET['reason']),全部变文本,代码失效,就没问题了。但是我太懒了。。 你们可以自己找到加或者直接用我下面的。。

方法:打开/source/class/helper/helper_seccheck.php文件
查找:
  1. public static function check_seccode($value, $idhash, $fromjs = 0, $modid = '') {
  2. global $_G;
  3. if(!$_G['setting']['seccodestatus']) {
  4. return true;
  5. }
  6. $seccheck = self::_check('code');
  7. if(!$seccheck) {
  8. return false;
  9. }
  10. $ssid = $seccheck['ssid'];
  11. if(!is_numeric($_G['setting']['seccodedata']['type']) && preg_match('/^[\w\d:_]+$/i', $_G['setting']['seccodedata']['type'])) {
  12. $etype = explode(':', $_G['setting']['seccodedata']['type']);
  13. if(count($etype) > 1) {
  14. $codefile = DISCUZ_ROOT.'./source/plugin/'.$etype[0].'/seccode/seccode_'.$etype[1].'.php';
  15. $class = $etype[1];
  16. } else {
  17. $codefile = libfile('seccode/'.$_G['setting']['seccodedata']['type'], 'class');
  18. $class = $_G['setting']['seccodedata']['type'];
  19. }
  20. if(file_exists($codefile)) {
  21. @include_once $codefile;
  22. $class = 'seccode_'.$class;
  23. if(class_exists($class)) {
  24. $code = new $class();
  25. if(method_exists($code, 'check')) {
  26. $return = $code->check($value, $idhash, $seccheck, $fromjs, $modid);
  27. }
  28. }
  29. } else {
  30. $return = false;
  31. }
  32. } else {
  33. $return = $seccheck['code'] == strtoupper($value);
  34. }
  35. if($return) {
  36. C::t('common_seccheck')->update_succeed($ssid);
  37. } else {
  38. C::t('common_seccheck')->update_verified($ssid);
  39. }
  40. return $return;
  41. }
复制代码
替换:
  1. public static function check_seccode($value, $idhash, $fromjs = 0, $modid = '') {
  2. global $_G;
  3. if(!$_G['setting']['seccodestatus']) {
  4. return true;
  5. }
  6. $seccheck = self::_check('code');
  7. if(!$seccheck) {
  8. return false;
  9. }
  10. $ssid = $seccheck['ssid'];
  11. if(htmlspecialchars(!is_numeric($_G['setting']['seccodedata']['type'])) && preg_match('/^[\w\d:_]+$/i', htmlspecialchars($_G['setting']['seccodedata']['type']))) {
  12. $etype = explode(':', htmlspecialchars($_G['setting']['seccodedata']['type']));
  13. if(count($etype) > 1) {
  14. $codefile = DISCUZ_ROOT.'./source/plugin/'.$etype[0].'/seccode/seccode_'.$etype[1].'.php';
  15. $class = $etype[1];
  16. } else {
  17. $codefile = libfile('seccode/'.htmlspecialchars($_G['setting']['seccodedata']['type']), 'class');
  18. $class = htmlspecialchars($_G['setting']['seccodedata']['type']);
  19. }
  20. if(file_exists($codefile)) {
  21. @include_once $codefile;
  22. $class = 'seccode_'.$class;
  23. if(class_exists($class)) {
  24. $code = new $class();
  25. if(method_exists($code, 'check')) {
  26. $return = $code->check($value, $idhash, $seccheck, $fromjs, $modid);
  27. }
  28. }
  29. } else {
  30. $return = false;
  31. }
  32. } else {
  33. $return = $seccheck['code'] == strtoupper($value);
  34. }
  35. if($return) {
  36. C::t('common_seccheck')->update_succeed($ssid);
  37. } else {
  38. C::t('common_seccheck')->update_verified($ssid);
  39. }
  40. return $return;
  41. }
复制代码
替换的过滤函数是群群自己手动一个个加上去的。。 简直灰常辛苦。。
出处:http://www.nextgod.com/thread-3142-1-1.html

真正的离别从来都是悄无声息。
回复

使用道具 举报

话题讨论
2 个回复

common

巡查团 LV.12| 发表于 2016-12-3 13:00:57 | 显示全部楼层
这个东西有啥用呢
回复 支持 反对

使用道具 举报

小时空

管理员 LV.14| 发表于 2016-12-3 15:07:59 | 显示全部楼层
很好
回复

使用道具 举报

参与讨论
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

楼主资料
茶姒兔子
超级版主 LV.13 27.4%
经验值:547 / 2000
注册时间:2016-02-02
累计发帖:451 篇
精华帖:18 篇
在线时长:330 小时