我一直想搭建一个轻论坛,给想学习安全的师傅提供一个学习交流的简洁平台.偶然间我选中了xiuno bbs,看起来还不错,虽然官方已经不更新了,但是有师傅对官方版本进行了二开,所以这次的文章以版本号为xiuno V5.0.0 二开正式版 为例.

BUG出现的原因

xiuno bbs对站点访问限制如下.

一次xiuno bbs中的BUG带来的修复思考 - 图1

因为我不是特别喜欢白嫖的师傅,所以我想让用户在游客状态下无论访问什么页面都会先跳转到登录页面.

代码修改处:/model/misc.func.php,在差不多70行附近,检测站点的运行级别

当访问限制为会员可读写时候:

  1. case 3: $gid == 0 AND message(-1, lang('runlevel_reson_3')); break;
  2. //gid==0表示用户组是游客.当用户组是游客并且页面显示信息为:会员可读写.
  3. //本身权限没问题的,但是在注册和找回密码情况下,进行邮箱验证时,不能正常验证,都是提示会员可读写,这就影响到正常业务了

当访问限制为所有人可读写的时候代码直接break,导致能正常显示主页,然后百度搜索时候找到了一篇文章:教你用一行代码制作一个可DIY设定信息的《游客无权访问》插件

新建一个hook文件index_start.php,代码为

  1. if($gid==0){message(0,'游客无权限查看论坛!请 <a href="./?user-login.htm">登陆</a> 或 <a href="./?user-create.htm">注册</a>');}
  2. //为了游客状态下能直接跳转登录页,我把代码改为:
  3. if($gid==0){header("location:user-login.htm");exit;}//测试后发现代码需要在站点运行级别为所有人可读写才可以正常运行,但是这里就出现BUG了,测试时发现在未登录时可以直接访问用户中心,导致出现未授权访问或者说是url遍历漏洞,比如能访问user-1.htm,user-2.html,一直遍历下去.所以这个插件和站点访问限制组合时会出现这个bug,并且进行在注册和登录时的邮箱验证,会出现JSON报错,因为官方代码中,case后面是进行信息提示的,我改成跳转到登录页,所以会变成这种情况

一次xiuno bbs中的BUG带来的修复思考 - 图2

一次xiuno bbs中的BUG带来的修复思考 - 图3

BUG修复方法

经过不断地尝试与研究,在百度搜索时偶然发现了PHP的一个函数,可能可以修复此BUG,最后的代码如下:

  1. $url1="https://xxx.cn/";
  2. $url2="https://xxx.cn/user-resetpw.htm";
  3. $url3="https://xxx.cn/user-create.htm";
  4. case 3: if($gid == 0 AND $_SERVER['HTTP_REFERER']!=$url1 AND $_SERVER['HTTP_REFERER']!=$url2 AND $_SERVER['HTTP_REFERER']!=$url3){header("location:user-login.htm");} else{break;}

我的修复想法如下(因为我没有学过PHP,所以这个代码是根据我的想法来写的,应该还是有逻辑上的漏洞可以绕过,所以还请各位师傅指点指点)

我是根据百度上搜索的,php判断referer来源域进行黑白名单的访问控制找到的灵感,因为gid==0的时候就已经是可以直接跳转到user-login.htm登录页面了,并且url1的域名是登录后才能访问的首页,所以referer来源也不会是首页,这就解决了url的遍历问题.同时url2,$url3是设置来源白名单,这样注册和找回密码的邮箱验证能正常使用了.所以一举两得,修复了这两个BUG

但是还是有个问题,学安全以后我们知道referer头是可以进行伪造的,我不清楚xiuno官方是不是有检测referer伪造的机制,还没进行测试过.文章就写到这,同时希望各位师傅能多斧正!