d_cms(某梦)公开漏洞复现 - 篡改cookie登入admin

作者 | 枫涧

编辑 | 楌橪

 

审计系统:dedeCMS v5.7

目标:篡改cookie实现任意登录并分析原理。

我觉得这个漏洞主要是对于用户ID的处理方式不当,以及把敏感的东西放到了cookie中进行传输。

 

分析流程图:

细致分析
首先,当我们访问member/index.php?uid=00001时,触发了Putcookie(),而Putcookie()中的last_vid就是我们url里面的uid,同时,还设置了last_vid以及last_vid_ckMd5两个cookie进行传输,这个地方就造成了cookie泄露,我们可以通过抓包得到。

获得了后面需要用到的两个东西:last_vid和last_vid_ckMd5。

其次,当我们登陆成功后,会进行IsLogin()判断,判断是否是登录状态。

 

而M_ID又是来源于memberlogin.class.php中170行,通过GetNum(GetCooke("DedeUserID"))来获得;

期间我们可以观察cookie.helper.php中的GetCookie()和PutCookie(),发现生成cookie的方法都一样。

然后继续memberlogin.class.php得到了M_ID往下走,我们发现,在判断M_ID是否为空时,运用了intval()函数。这个函数有一个特点,就是在处理一些特殊数据进行取整处理时会进行一定转换,而也就是这些转换为我们提供了机会。下面引用菜鸟论坛对于intval()对于一些数据的处理说明:

而之前我们提到在获取cookie的时候也有一个GetNum()方法,这个方法其实也就是对M_ID做一个只取数字的处理,所以我们也可以通过修改正则表达式来达到想要的效果,避免使用intval()的而出现这个问题。

因此,我们设置M_ID=00001时,会通过intval()变为1,而1恰好就是admin的ID。那么我们得到了admin的M_ID之后,回到index.php进行后续的数据获取操作,从而进入了对应的空间。

 

操作及结果:

首先,注册一个username是00001的用户,类似能通过intval()换为1的就行,而这个username也就是我们的uid:

 

然后用00001用户登陆后,刷新进行抓包,用之前我们访问00001主界面抓取到的cookie进行修改再发包过去:

得到: