今天来谈谈cookies欺骗是怎么回事以及如何避免。

用户在登录之后通常会保存用户信息,以便在其他需要权限的页面去验证用户信息是否具有访问权限。

有同学说我在登录的时候已经很注意SQL注入问题了,还有什么不安全的地方么?

当然有!这个要首先谈一个问题,那就是用户身份验证的流程 如下图:

因此我们可以看出,一个页面是否能够被访问,判断依据是通过存储信息区域中用户的信息来判断的

而登录页面的作用就是 验证 用户输入的用户名+密码的组合是否在数据库中存在,如果存在则把信息保存在存储信息的区域,以便各个页面去判断权限

OK,理清这个思路之后我们的重点就来了,那个信息存储区域对于我们来说至关重要,一般常见的有两种形式,session和cookies

session和cookies同样都是针对单独用户的变量(或者说是对象好像更合适点),不同的用户在访问网站的时候 都会拥有各自的session或者cookies,不同用户之间互不干扰。

他们的不同点是:

1,存储位置不同

session在服务器端产生,比较安全,但是如果session较多则会影响性能

cookies在客户端产生,安全性稍弱

2,生命周期不同

session生命周期 在指定的时间(如20分钟)到了之后会结束,不到指定的时间,也会随着浏览器进程的结束而结束。

cookies默认情况下也随着浏览器进程结束而结束,但如果手动指定时间,则不受浏览器进程结束的影响。

由于如果用户信息使用session保存的话,用户信息往往会丢失而需要重新登录,使用cookies的话则可以长时间有效比较利于用户体验,那session的情况我们不讨论,下面说说使用cookies保存用户信息的情况。

我们首先创建两个页面分别是Login.aspx和Main.aspx。Login.aspx用于获取并保存用户信息到cookies中,Main.aspx则用户验证用户是否有权访问本页面,我们在本例中设定,登录用户有权访问,匿名(未登录)用户,拒绝访问。

首先来看Login.aspx 我们先创建两个按钮

“获取登录状态”按钮会 把信息保存到cookies中,这里仅保存UID,然后重定向到Main.aspx

“未获取登录状态”按钮 直接重定向到Main.aspx 进行匿名访问

Login.aspx.cs 程序代码:

     protected void Page_Load(object sender, EventArgs e)
{
//每次加载登录页面 清理UID 清除登录状态
Response.Cookies["uid"].Value = "";
}
protected void Button1_Click(object sender, EventArgs e)
{
//验证步骤略过,假设用户通过验证并且得到如下信息: int uid = ; //用户唯一ID
string username = "admin"; //用户名
string userpwd = ""; //用户密码 //接下来要保存用户登录状态
Response.Cookies["uid"].Value = uid.ToString(); //跳转到登录后的页面
Response.Redirect("Main.aspx"); }
protected void Button2_Click(object sender, EventArgs e)
{
//未经验证直接进入Main.aspx
Response.Redirect("Main.aspx");
}

在Main.aspx中进行验证用户是否已经登录

     protected void Page_Load(object sender, EventArgs e)
{
CheckLogin();
} private void CheckLogin()
{
if (Request.Cookies["uid"] != null && GetUserInfo(int.Parse(Request.Cookies["uid"].Value), "") != "")
{
Response.Write(GetUserInfo(int.Parse(Request.Cookies["uid"].Value), "username") + "已登录");
}
else
{
Response.Write("您尚未登陆,<a href='login.aspx'>点此登录</a>");
}
} /// <summary>
/// 模拟一个获取用户信息的方法
/// 然而实际操作中需要通过ID查询数据库来获取用户信息
/// 这里为了方便演示就直接return固定的值了
/// </summary>
/// <param name="uid"></param>
/// <param name="key"></param>
/// <returns></returns>
private string GetUserInfo(int uid, string key)
{
if (uid == ) //这里只设置uid为1的用户,其他的UID的用户不存在
{
switch (key)
{
case "username": return "admin";
case "password": return "";
default: return "null";
}
}
else
{
return "";
}
}

OK,我们来测试一下,点击获取登录状态,实际上相当于用admin,123456这个组合来登录。

好的,登录成功,我们再来测试下匿名登录,点击未获取登录状态

事情好像比我们想象的要顺利,目前来说我们想要的效果已经都实现了,但是事实上真的是这样吗,显然不是!

我们刚才说过,cookies是在客户端产生,也就是我们自己的电脑上保存的

另一方面,Main.aspx这个页面判断 你是否能够访问的依据就是 cookies中的值是多少,如果是1,则认为你当前身份是UID为1的用户,如果是5,则认为你当前身份是UID为5的用户。

那么我们考虑一个事情,如果把我的cookies中的UID修改掉,比如改成35,是不是可以直接绕过登录页面,就可以以UID为35的用户身份登录呢?

事实上确实是这样,这也就是标题中所说的cookies欺骗。由于cookies是客户端产生我们可以很容易的修改,因此产生安全隐患。

下面就来实际测试一下,首先下载一款软件 老兵cookies欺骗工具 界面如下图:

在Address中输入我们项目的访问地址,然后连接

然后正常操作一遍,分别点击 获取登录状态  和  未获取登录状态

   

发现我们正常操作是正常的判断,下面重点来了,我们要修改cookies值 点击未获取登录状态 一样可以被授权访问

登录成功了,那么我们应该如何避免这样的问题呢?

正确的做法是,把密码同时存入cookies(当然实际操作时候需要MD5加密保存,这里为了方面演示使用明文保存),然后在Main.aspx验证时候,同时验证UID和密码是否匹配即可。

我们来修改一下代码:

Login页面

 protected void Page_Load(object sender, EventArgs e)
{
//每次加载登录页面 清理UID 清除登录状态
Response.Cookies["uid"].Value = "";
Response.Cookies["pwd"].Value = "";
}
protected void Button1_Click(object sender, EventArgs e)
{
//验证步骤略过,假设用户通过验证并且得到如下信息: int uid = ; //用户唯一ID
string username = "admin"; //用户名
string userpwd = ""; //用户密码 //接下来要保存用户登录状态
Response.Cookies["uid"].Value = uid.ToString();
Response.Cookies["pwd"].Value = userpwd;
//跳转到登录后的页面
Response.Redirect("Main.aspx"); }
protected void Button2_Click(object sender, EventArgs e)
{
//未经验证直接进入Main.aspx
Response.Redirect("Main.aspx");
}

Main页面

 private void CheckLogin()
{
if (Request.Cookies["uid"] != null && Request.Cookies["pwd"] != null && GetUserInfo(int.Parse(Request.Cookies["uid"].Value), "") != "")
{
if (Request.Cookies["pwd"].Value == GetUserInfo(int.Parse(Request.Cookies["uid"].Value), "password"))
{
Response.Write(GetUserInfo(int.Parse(Request.Cookies["uid"].Value), "username") + "已登录");
}
else
{
Response.Write("您尚未登陆,<a href='login.aspx'>点此登录</a>");
}
}
else
{
Response.Write("您尚未登陆,<a href='login.aspx'>点此登录</a>");
}
}

这样改动之后,用户如果再以修改cookies企图绕过验证的话,那么他除了修改UID之外,还必须修改pwd为正确的密码。

有同学问:那如果他就是把PWD改成正确的密码了呢?

这位同学...你的密码都别别人窃取了...那么再安全的程序代码也救不了你....

本文中案例源码及相关工具下载:http://files.cnblogs.com/webconfig/Cookies%E6%AC%BA%E9%AA%97.rar

感谢小伙伴们的热烈讨论,按照 @老牛吃肉 和其他同类观点的用户的建议,我尝试做了另一方案,做下补充。

使用DES把UID加密放在cookies中,在验证阶段解密验证。

http://www.cnblogs.com/webconfig/p/3624831.html

本文出自 低调码农的笔记簿 http://www.cnblogs.com/webconfig/p/3623343.html 转载请注明出处,如有谬误不当之处,欢迎指正拍砖,不胜感谢!!

Cookies欺骗分析与防护的更多相关文章

  1. 再谈Cookies欺骗

    在上一篇关于cookies欺骗的随笔中,提到的解决方案是把密码MD5加密之后存入cookies中,确实这种方法实现了效果,不过把密码留在客户端等待着去被破解不是一个合适的方法,在此也感谢 @老牛吃肉 ...

  2. Bugku-CTF之cookies欺骗

    Day22 cookies欺骗 http://123.206.87.240:8002/web11/ 答案格式:KEY{xxxxxxxx} 本题要点:cookie欺骗.base64编码传参  

  3. TRITON恶意软件简单分析与防护方案

    一.攻击简介 2017年12月,安全研究人员发现了一款针对工控系统安全仪表系统(SIS)的恶意软件"TRITON",该软件以施耐德电气Triconex安全仪表控制系统为目标展开攻击 ...

  4. NetSarang软件中nssock2.dll模块被植入恶意代码技术分析与防护方案

    原文地址:http://blog.nsfocus.net/nssock2-dll-module-malicious-code-analysis-report/ NetSarang是一家提供安全连接解决 ...

  5. 60cms Cookies欺骗漏洞审计

    源码地址:https://files.cnblogs.com/files/ssooking/60cms.zip 运行60cms目录下的Netbox.exe即可开启Asp Web服务,默认端口80 环境 ...

  6. 东哥讲义2 - 基于TCP,UDP协议的攻击,分析与防护

    TCP SYN FLOOD 攻击 正常的TCP三次握手过程: 处于SYN FLOOD攻击状态时的三次握手过程: 查看示例:x_syn.c文件,一个实现了自定义mac,ip,tcp头部的syn floo ...

  7. ARP欺骗分析

    (作者原创,欲转载请说明出处)1.arp介绍    arp:地址解析协议;将IP地址映射为MAC地址.2.为什么要有arp    平时上网我们都知道要有一个IP地址才能上网,那arp用来干嘛的呢?如果 ...

  8. Yii2-设置和获取、删除Cookies空值分析(有代码)

    Yii2-设置和获取,删除Cookies空值或值没有变化 原因: 1.不要使用相同的request url, 否则需要刷新才能获取值 可在不同的动作中设置和调用 2.不要在函数中使用exit来中止脚本 ...

  9. BurpSuite intuder里保存所有网页的特定内容:以bugku的cookies欺骗为例题

    这题里想读取index.php只能一行一行的读,通过控制line参数的值.如下: 正常的writeup都是写个爬虫,但我觉得burp肯定有自带这种功能,不用重造轮子.经过学习后发现以下步骤可以实现. ...

随机推荐

  1. jquery ajax(3).post

    .post返回文本数据 $(function(){ $("#send").click(function(){ $.post("post1.php", { use ...

  2. HTML&CSS基础学习笔记1.29-灵活地使用样式

    灵活的使用样式 使用样式的感觉很棒吧! 刚我们使用的内联样式是给具体的标签加上样式,如果有多个标签的时候,我们用内联样式给标签加样式的时候就需要一个个的加过来,这样就很麻烦. 而如果我们使用内部样式表 ...

  3. STM8S学习笔记-时钟控制2

    今天把时钟系统的最后部分,时钟安全系统(CSS)和时钟输出功能(CCO),做一个简答的说明. 1.时钟安全系统(以下简称CSS) CSS功能很简单,就是监控HSE是否实效(如果系统使用HSE作为主时钟 ...

  4. 转:memset用法详解

    功 能 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,   块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作,   其返回值为指向S的指针.   [编辑本段 ...

  5. 极简易版专家聊天程序--JAVA练手

    呵呵,用JAVA包开发SOCKET连接,是很简单的呢~~~ DailyAdviceServer.java import java.io.*; import java.net.*; public cla ...

  6. Silverlight闹钟

    一:截图 二:XAML代码 <UserControl x:Class="SilverlightClock.MainPage" xmlns="http://schem ...

  7. jQuery deferred学习笔记

    简介 在jQuery1.5.0版本引入,为了实现Deferred对象,jQuery改写了ajax.是由jQuery.Deferred()方法创建的链式对象. $.Deferred在jQuery代码自身 ...

  8. Java高级特性之反射学习总结

    老规矩我们还是先提出几个问题,一门技术必然要能解决一定的问题,才有去学习掌握它的价值 一. 什么是反射? 二.反射能做什么? 一. 什么是反射? 用在Java身上指的是我们可以于运行时加载.探知.使用 ...

  9. F - Warm up - hdu 4612(缩点+求树的直径)

    题意:有一个无向连通图,现在问添加一条边后最少还有几个桥 分析:先把图缩点,然后重构图为一棵树,求出来树的直径即可,不过注意会有重边,构树的时候注意一下 *********************** ...

  10. python模块之bsddb: bdb高性能嵌入式数据库 1.基础知识

    转自:http://blog.csdn.net/zhaoweikid/article/details/1665741 bsddb模块是用来操作bdb的模块,bdb是著名的Berkeley DB,它的性 ...