当你的才华
还撑不起你的野心时
那你就应该静下心来学习
目录
【Cookie 伪造导致任意前台用户登录】
0x01 搭建环境
0x02 审计前言
Phpstudy+Nginx+Mysql数据库搭建
云业cms V2.0.2 源码
后台账号:admin
后台密码:admin
将源码放到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
虽然我们生活在阴沟里,但依然有人仰望星空!