【Cookie 伪造导致任意前台用户登录】织梦(DedeCMS)V5.7 SP2 代码审计


当你的才华

还撑不起你的野心时

那你就应该静下心来学习


目录

【Cookie 伪造导致任意前台用户登录】

0x01 搭建环境

0x02 审计前言


【Cookie 伪造导致任意前台用户登录】

0x01 搭建环境

Phpstudy+Nginx+Mysql数据库搭建

云业cms V2.0.2 源码

后台账号:admin

后台密码:admin

0x02 审计前言

将源码放到seay 源代码审计工具里进行查看

我们前台登录先试试,发现提示如下信息

我们登录后台页面

此时,再次登录,因为是第一次登录,直接全部点默认就好

/uploads/member/index.php 文件中,

更新最近访客记录及站点统计记录处,

当满足

 $vtime - $last_vtime > 3600 || !preg_match('#,'.$uid.',#i', ','.$last_vid.',')

的时候且

$last_vid

的值为空的时候,会令

$last_vid = $uid

然后在第164行中使用

 PutCookie('last_vid', $last_vid, 3600*24, '/');

将cookie下发到客户端

/uploads/include/common.inc.php 文件中, 使用外部变量注册的方法进行变量声明,因此此处的 $uid 是用户可控的位置

校验客户端cookie是否进行了伪造,所以cookie就会要获取 \cms\uploads\data\config.cache.inc.php 文件中的内容,需要存在任意文件读取或下载的漏洞

另外一种方式,利用用户第一次登录时候下发cookie的方法( PutCookie )直接生成cookie,这样的话cookie会通过cookie校验的方法( GetCookie)

此处,查看登录位置的代码块,知晓登录时候cookie的生成规则是否是 PutCookie ,在文件 /cms/uploads/include/memberlogin.class.php 中输入合规的loginuser 和loginpwd便会执行 PutLoginInfo

跟入PutLoginInfo 方法,在文件 /cms/uploads/include/memberlogin.class.php 中发现了该方法的代码块,且在使用了 PutCookie 下发cookie。因此存在cookie的伪造漏洞。

跟入检测登录状态的代码,在文件 \cms\uploads\include\memberlogin.class.php 中发现代码块, cookie中的DedeUserID参数的值,传入数据库查询获得结果后,把结果展示在页面上

我们登录MyPHPAdmin 里看看

我们先判断一下,这个是在哪个数据库下的,已查出是在这个数据库下,那么我们就去该数据库下查找咯

SELECT table_schema FROM information_schema.TABLES WHERE table_name = 'dede_member'

SELECT * FROM dede_member

由于 $m_id 在数据库中是int,在进行cookie伪造时需要注册用户名为要越权的用户 $m_id 数值,而 admin默认为1。因此可以直接登录为admin。需要注册用户名为对应数据库中 dede_member 表中mid对应的值。

如注册用户名为0001对应 dede_member 表中mid为1,便是admin的mid值。

其实我有点迷,明明我都去审核了资料,为什么还是提示我未通过审核了,无奈,不研究了,我们继续往下看

接下来,我们依次在URL中输入:

http://192.168.206.146/cms/uploads/member/index.php?uid=admin1

http://192.168.206.146/cms/uploads/member/index.php?uid=admin2

http://192.168.206.146/cms/uploads/member/index.php?uid=admin

(我重新创建了账户)

然后访问如下请求获取伪造的cookie,

http://192.168.206.146/cms/uploads/member/index.php?uid=001

我们先获取last_vid和last_vid__ckMd5的值

用001账号登录后,将last_vid的值赋给DedeUserID,last_vid__ckMd5的值赋给DedeUserID__ckMd5,001账号登录,登录后修改cookie,修改完成如下图

保存后刷新页面登录,即可登录到想切换到的用户中

还有一种方式

由于在 /cms/uploads/include/memberlogin.class.php 中的第170行中 先进行cookie的校验再使用GetNum进行非数字和点的数据的替换,然后转成使用int型,拼接进入 sql语句

在 /cms/uploads/member/index.php 文件中的第124行,当uid不为空的时 候会 require_once(DEDEMEMBER.'/inc/config_space.php')

跟入 config_space.php 在 /cms/uploads/member/inc/config_space.php 文件中第29行使用了 GetUserSpaceInfos 方法

因此可以注册类似于xxx1xx的用户,如bala1bala(当然仅需要实际环境中有包含用户名有包含1的即 可),然后在uid位置使用%1%让 GetUserSpaceInfos 方法可以正常获取数据,从而使代码能够进 入 PutCookie 方法,从而生成伪造的cookie

然后对cookie进行替换, DedeUserID=%1%; DedeUserID__ckMd5=8983265c65c8d1ca; 中会满足 GetNum(GetCookie("DedeUserID")); 后并转成int型1 ,再进行SQL拼接,因此便可以登录到 admin

参考链接:

               https://www.freebuf.com/column/161703.html


虽然我们生活在阴沟里,但依然有人仰望星空!


发布了182 篇原创文章 · 获赞 99 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/God_XiangYu/article/details/105216291