session,cookie认证会话中的安全问题

2019-04-04 约 4220 字 预计阅读 9 分钟

声明:本文 【session,cookie认证会话中的安全问题】 由作者 小猪佩琪 于 2019-03-08 09:01:00 首发 先知社区 曾经 浏览数 870 次

感谢 小猪佩琪 的辛苦付出!

前言

在互联网中,对于用户来说不仅仅是单向信息传输,更重要的是信息交互,但是在web中,http协议是无状态的,当一个请求等到了服务器的回应之后,两者连接便中断了,而第二个请求发出后,服务端并不知道你和第一个请求的关系,所以没办法持续保持身份信息,每个http请求对于服务器来说,如果没有身份认证,那么对服务器来说所有人的请求都是一样无区别的。所以在互联网中,在所有需要信息双向交互的地方就需要身份认证,对于不同的身份给予不同的权限,此时就用到会话这个概念。

为什么需要会话

首先要理解tcp的三次握手,一般在TCP三次握手就创建了一个会话,在会话中可以传递信息,等TCP关闭连接就关闭会话了。HTTP协议是基于TCP协议的,所以http会话也是在TCP关闭连接后就关闭会话,而在http1.1中,一般一个连接就只能处理一个请求,所以在需要权限身份认证的时候就需要有一种凭证,才能使得每次请求服务器都知道是你,相当于建立了连续的会话,也就是每次的请求都带有自己的身份凭证。

简单点,会话就是让你在信息交互的时候让对方知道你是谁,并且一直知道你是谁,但是服务器不是人,没有自我辨别的功能,这时候需要一种凭证,也就是session。站在客户端角度,在你每次登录帐号密码之后,会有一串类似于短秘钥之类的东西,他只属于你,证明你的身份。站在服务器端,在php中,在你进行身份认证之后,会在服务器端保存一个以PHPSESSID为名的文件来储存你的身份,账号等各种信息,在用户每次提交带有session的请求时,自动去搜索这个以session命名的文件,查看里面的反序列化信息(也就是你的身份等信息)。

php中的session

在上面我们提到了php中的session,那么一旦phpsessid泄露,相当于别人也可以使用你的身份,而且一般session在浏览器关闭后也不会注销,仅仅是你已经丢失了你的sessionid,但是服务端并未立刻失效。
但是在php中并不是在登录之后才会给PHPSESSID,而是在

session_start();

开始之后,http响应头部信息会返回 set-cookie:PHPSESSID=xxxxxxx,浏览器便会自动创建这个cookie,并且关联这个域名。同时,也在服务器端创建一个以Session ID命名的文件,此时你并没有登录,但是已经给了你相应的session,这时候带着账号密码去登录,登录成功后,Session ID才能匹配你的信息,否则不登录,在服务端创建的session文件内容为空,登录成功后,在服务端以你的phpsessid创建关于你信息的文件,当你带着这个phpsessid继续访问的时候,就会从服务端文件里查找关于你的信息,是否是管理员,还是普通用户,这属于后端代码编写不作讨论。

而在服务器端,会有一个sess_……………… 命名的文件保存用户信息。


这里后台代码仅仅简单写了一个用户权限功能,实际上会记录更全面的用户信息,而里面的信息全部被序列化存储。

session劫持

要明白session劫持,首先需要清楚session id的存储位置,sessionid不仅仅存储在cookie中,也可能存储在post get(很少见),或者由url重写来完成,还有一部分存储在隐藏域中,一般首选是存储在cookie中,当禁用了cookie传递之后就会重写在url里,在url里传递很容易暴露造成更多的安全问题,在允许cookie传递的时候首选cookie,在php中提供了session.use_only_cookies选项,

session劫持实际上就是自己的PHPSESSID被攻击者以某种方式获取,然后在会话的有效期内,利用被攻击者的身份登录网站,来达到身份劫持,伪装成合法用户。一般PHPSESSID存储在cookie中,XSS攻击也会造成session劫持。

session成功劫持一般需要几个步骤,

1.用户访问的平台是使用session来进行身份认证。
2.用户已经使用账号密码登录该平台,随即该用户会得到一个sessionid。
3.通过劫持获取到sessionid,并且在sessionid的有效期内使用(未注销前)。

那么如何获得sessionid是关键,接下来会谈到,一般可以使用

1.劫持:XSS劫持,局域网嗅探,会话固定结合,任意文件读取漏洞等等。
2.爆破:直接通过大流量爆破出sessionid(一般是不太可能)。
3.得到session生成规则,并且得到签名通过计算获取。

规则爆破

通过知道规则来进行爆破,不过这种方法基本上是没可能的局限性太多,且概率极小,php中的sessionid举例而言。生成规则如下。

PHPSESSID生成
生成规则是根据hash_func散列来生成的,相关的参数有:

  • 客户端IP
  • 当前时间(秒)
  • 当前时间(微秒)
  • PHP自带的随机数生产器

秒微秒可以爆破,随机数也可能是伪随机,客户端IP也可以某种手段获取,但是四种同时精准获取,难度极大,但是不排除有成功的可能性。根据生成规则,也有可能爆破出,但是相对来说几乎不太可能。

利用XSS或者文件读取

利用xss反弹到的cookie,来伪造身份登录。

使用被攻击者的PHPSESSID,rv3kprfodknmqdrnf0cuial8r6


即可利用管理员的session来登录,前提是必须在会话有效期内使用。

或者利用任意文件读取,XXE等来进行读取文件名来获取sessionid,服务端保存的都是在有效期内的session。

会话固定劫持

会话固定也属于劫持的一种,或者说他是通过攻击者诱导使用固定的sessionid。会话固定的流程主要为

1.攻击者通过构造url参数或者表单传递来固定sessionid。
2.诱使用户使用攻击者构造的参数来登陆。
3.在用户登录之后,攻击者直接使用自己之前构造的固定sessionid来登陆。

会话固定漏洞并不常见,并且在早期通常是使用url来传递sessionid,这样更极大方便了攻击者,因为只要简单构造一条url,并且对于用户是很正常的url,例如,www.taobao.com?sessionid=test123,在用户使用这条url去登陆的时候就会固定了sessionid,就可能造成会话固定劫持漏洞。重置sessionid可由如下。

1.通过xss漏洞,可以通过js设置cookie中的sessionid。document.cookie="sessionid=test123"
2.通过url传递,直接构造url-->www.taobao.com?sessionid=test123
3.使用Set-Cookie的HTTP响应头部设置Cookie。攻击者可以使用一些方法在Web服务器的响应中加入Set-Cookie的HTTP响应头部,通过自己的服务器页面绑定sessionid。

接下来我们通过一个简单的php认证来做一次会话固定劫持,后端对身份验证代码如下。

<?php session_start();?>
if($_POST['zhanghao'] == $username && $_POST['mima'] == $password)
    {

    $_SESSION["name"]=$username;
    }

if ($_SESSION['name'] == "")
{
    echo "<script>alert('对不起,你没有权限');location.href='index.php'</script>";
}

此时攻击者构造一个表单页面。通过js来设置cookie造成会话固定攻击。此时使用户登陆。

<html>  
    <meta charset="utf-8"  content="text/html; charset=gb2312"/>
      <!-- CSRF PoC - generated by Burp Suite Professional -->
      <body>
      <script>history.pushState('', '', '/')</script>
        <form action="http://127.0.0.1/login.php" method="POST">
        用户名称:<input type="text" name="zhanghao"><br/><br/>
        用户密码:<input type="password" name="mima"><br/><br/>
          <input type="hidden" name="denglu" value="™»½•" />
          <input type="submit" value="Submit request" />
          <meta http-equiv='Set-Cookie' content='PHPSESSID=22333'>
        </form>
        <script type='text/javascript'> document.cookie='PHPSESSID=123456789' </script>
      </body>
    </html>

此时抓包可以看到,提交的SESSID是我们构造的,而且服务器端暂时未创建123456789的用户session,然后用户点击提交。

可以看到服务器端成功创建了我们构造的session,然后攻击者便可以通过PHPSESSID=123456789造成合法登陆,由此便造成了一次完整的会话固定劫持,当然如果是url传递将更加方便,直接在url里加入自己的sessionid,用户点击正常的url登陆即可。

cookie造成的一些安全隐患

在session身份认证中,一切用户的session都会存储在服务器,但是如果一旦用户量达到一个上限,那么对于服务器的荷载也是巨大的,但是在cookie实现身份认证中,并不会存储在服务器,而是存储在用户的客户端,cookie的出现是一次重大的变革,也是一项非常有争议的技术,原因就是因为他的透明性以及信息量,很容易泄露用户的隐私。

在session如果不设置过期时间,在服务器上就会一直存在,永远不会注销,在cookie中如果不设置过期时间,则在关闭浏览器时销毁该cookie,session会给服务器造成很大的负载,但是cookie并不存在这个问题,它将信息保存在了每个用户的客户端。淘宝便是使用了cookie存储一部分信息。

信息泄露

cookie中存取了大量用户的信息,如身份id,浏览次数,手机号,等一些隐私信息,截取了某平台的cookie信息,存储的信息量非常多,Cookie的主要功能是实现用户个人信息的记录,它最根本的用途是帮助Web站点保存有关访问者的信息,可是一旦泄露除了信息泄露,攻击者无疑也可以通过用户身份登录,无疑也是很大的隐患。

Cookie以纯文本的形式在浏览器和服务器之间传送,大多明文的形式被非法用户截获之后无疑是身份被盗取了,并且身份的信息也被盗取了,通过xss漏洞很容易获得cookie,如果没有做好防护措施,便会使用户的信息泄露。

越权

在cookie的身份认证中,极容易造成越权,切大多数越权修改参数都是在cookie中修改,大多数cookie中会有用户的userid,如果未合理的处理或者多重认证,很容易造成越权。在某安全公司的一次测试中,正是由于一次id的接口错误的设置,导致数万用户的平行越权,遍历ID,造成信息的泄露。危害可见一斑。

参考:https://blog.csdn.net/h_mxc/article/details/50542038
参考:https://blog.csdn.net/u010084228/article/details/78269345

关键词:[‘安全技术’, ‘WEB安全’]


author

旭达网络

旭达网络技术博客,曾记录各种技术问题,一贴搞定.
本文采用知识共享署名 4.0 国际许可协议进行许可。

We notice you're using an adblocker. If you like our webite please keep us running by whitelisting this site in your ad blocker. We’re serving quality, related ads only. Thank you!

I've whitelisted your website.

Not now