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


当你的才华

还撑不起你的野心时

那你就应该静下心来学习


目录

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

0x01 搭建环境

0x02 审计前言


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

0x01 搭建环境

Phpstudy+Nginx+Mysql数据库搭建

云业cms V2.0.2 源码

后台账号:admin

后台密码:admin

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

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

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

0x02 审计前言

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

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

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

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

我们登录后台页面

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

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

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

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

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

/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下发到客户端

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

我们登录MyPHPAdmin 里看看

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

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

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

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

SELECT * FROM dede_member

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

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

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

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

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

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

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

接下来,我们依次在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 伪造导致任意前台用户登录】织梦(DedeCMS)V5.7 SP2 代码审计_第26张图片

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

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

(我重新创建了账户)

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

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

我们先获取last_vid和last_vid__ckMd5的值

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

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

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

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

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

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

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

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

还有一种方式

由于在 /cms/uploads/include/memberlogin.class.php 中的第170行中 先进行cookie的校验再使用GetNum进行非数字和点的数据的替换,然后转成使用int型,拼接进入 sql语句【Cookie 伪造导致任意前台用户登录】织梦(DedeCMS)V5.7 SP2 代码审计_第36张图片【Cookie 伪造导致任意前台用户登录】织梦(DedeCMS)V5.7 SP2 代码审计_第37张图片

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

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

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

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

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

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

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

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

 

参考链接:

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


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


 

你可能感兴趣的:(渗透测试,PHP,代码审计,安全)