简析60度CMS的Cookies欺骗漏洞

前言

本篇文章只是为了和大家分享漏洞的挖掘经验和思路,同时让大家认识到 Cookies 欺骗漏洞的危害和严重性。

漏洞发现时间:2017.8.16,因产商无回应,漏洞至今仍未修复

环境搭建

工具

小旋风ASP服务器 http://www.jb51.net/softs/35167.html#download 60度CMS http://down.chinaz.com/soft/23548.htm

搭建

安装好小旋风ASP服务器后,把60度CMS的所有文件复制到小旋风ASP服务器的site8001目录下,然后访问http://localhost:8001即可。

源码分析

我们先看一下后台登录页面(login.asp)的源代码

action=replace(trim(request("Action")),"'","''")
if action="logout" then

session("cmsid") = ""

session("cmsname") = ""

response.Cookies("cmsname") = ""

response.Cookies("cmsid") = ""

得知登录页面的两个Cookies值分别为cmsname和cmsid

接着往下看

if code <> session("code") then
  showmsg "验证码错误!","login.asp"

 end if

 set rs = conn.execute("select * from 60du_Admin where AdminName = '"&ReplaceBadChar(username)&"' and Password = '"&md5(password,32)&"'")

 if rs.eof then

  showmsg "用户名或密码错误!","login.asp"

 elseif rs("IsActive")=1 then

  showmsg "你的用户名已被锁定,你不能登陆!请联系管理员。","login.asp"

 else
session("cmsid") = rs("id")
  session("cmsname") = rs("AdminName")

  response.Cookies("cmsname") = rs("AdminName")

  response.Cookies("cmsid") = rs("id")

  ip=Request.ServerVariables("REMOTE_ADDR")

  Call conn.execute("update 60du_Admin set LoginTime='"&Now()&"',LoginIP='"&ip&"' where AdminName='"&username&"'",0)

  Call InsertLog(1, 0, UserName, ip, "登录成功", ComeUrl, "")

  showmsg 0,"index.asp"

可以看到,网页会把输入的管理员帐号和管理员ID分别赋值给cmsname和cmsid这两个cookies值

如果密码正确就会跳转到后台首页

并添加上述的两个cookies值

这时我们再来看一下后台首页(index.asp)的源代码

发现头部引用了check.asp文件

找到并打开看看

发现这是检查用户登录状态的文件,源代码如下

<!--#include file="../inc/md5.asp"--><%
'判断用户是否登陆

if session("cmsname")="" and instr(CStr(Request.ServerVariables("SCRIPT_NAME")),site_install&AdminPath&"/login.asp")=0 then

 if ReplaceBadChar(Trim(request.Cookies("cmsname")))="" then

  response.Redirect(site_install&AdminPath&"/login.asp")

 elseif Session("admin_id") =null then

     Response.Write("<script>alert('登陆超时!');parent.location = '"&site_install&AdminPath&"/login.asp';</script>")

 else

  ReplaceBadChar(Trim(session("cmsname")))=ReplaceBadChar(Trim(request.Cookies("cmsname")))

  ReplaceBadChar(Trim(session("cmsid")))=ReplaceBadChar(Trim(request.Cookies("cmsid")))

 end if

end if

%>

可以看到,网页虽然有验证用户登录状态,但只仅仅验证了Cookies的内容

只要两个Cookies的内容都对得上,就能访问后台首页

于是,造成了一个典型的Cookies欺骗漏洞

60度CMS的默认管理员为admin,默认管理员ID为1

所以只要根据这两个信息创建Cookies,我们就可以通过伪造Cookies来实现越权访问后台

漏洞利用

访问后台登录页面

使用firebug添加两个Cookies及其内容

分别是:cmsname=admin;cmsid=1

注意这里的日期一定要修改(比如说修改为2018年),否则Cookies无法添加

接着访问后台首页(index.asp),发现已经绕过验证,成功访问了后台主页,实现了Cookies欺骗。

挖掘经验

挖掘Cookies欺骗漏洞时,可以查看登录页面和主页面的源代码,找到有关验证用户身份的源代码,查看是否存在欺骗的可能。

总结

现在大家应该都已经了解,Cookies欺骗漏洞的危害非常大,所以Cookies欺骗漏洞是一定要防范的。

既然 Cookies 是不安全的,而我们又必须把用户登录信息存储下来,那么应该存储在什么地方呢? 我们注意到,在 ASP 中,除了 Cookies 外,还有 Session 可以储存信息。Session 是储存在服务器上的,不是客户端随随便便就能够更改的,所以具有极高的安全性。这样,大家就可以把所有 Cookies 的代码均换作 Session 了。

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2017-10-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏武培轩的专栏

Redis持久化

Redis是内存型数据库,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化。 Redis支持两种持久化的方式,一...

4165
来自专栏扎心了老铁

记录一次因为硬盘写满造成的redis无法连接

缘起: 今天早晨收到报警,服务不干活了,赶紧起来看问题。。。 为了尽快让服务可用,尝试重启服务,发现服务起不来,报错 redis connection fail...

3768
来自专栏菩提树下的杨过

[原创]web application中使用Profile应该注意的问题

1.如何在web application中正确使用Profile web application与website的一个不同之处在于,web applicat...

2178
来自专栏小李刀刀的专栏

[译]Laravel 5.0 之自定义错误页面

本文译自 Matt Stauffer 的系列文章. ---- 在以往版本的 Laravel 中,假如你想自定义错误页面——比如当用户访问不存在的页面时显示一张猫...

3755
来自专栏散尽浮华

redis持久化策略梳理及主从环境下的策略调整记录

redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化。可以不定期的通过异步方式保存到磁盘上(即“半持久化模式”...

44510
来自专栏Python攻城狮

Django教程(四)- Django模板及进阶

需求:编写注册提交,“密码”与“确认密码”不一致,显示密码不一样。成功后在另一个页面显示 代码操作:

992
来自专栏desperate633

深入理解Redis持久化Redis 持久化

本文翻译自官方文档 http://redis.io/topics/persistence 。

912
来自专栏技术博文

Redis持久化

Redis 提供了多种不同级别的持久化方式: RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)。 AO...

3504
来自专栏Laoqi's Linux运维专列

Redis的两种备份方式

1253
来自专栏晓晨的专栏

.NET Core 控制台应用程序使用异步(Async)Main方法

1013

扫码关注云+社区