[红日安全]Web安全Day12 – 会话安全实战攻防

杀马特。学长 韩版系。学妹 提交于 2020-03-18 17:23:58

本文由红日安全成员: ruanruan 编写,如有不当,还望斧正。

大家好,我们是红日安全-Web安全攻防小组。此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供大家练习,我们给这个项目起了一个名字叫 Web安全实战 ,希望对想要学习Web安全的朋友们有所帮助。每一篇文章都是于基于漏洞简介-漏洞原理-漏洞危害-测试方法(手工测试,工具测试)-靶场测试(分为PHP靶场、JAVA靶场、Python靶场基本上三种靶场全部涵盖)-实战演练(主要选择相应CMS或者是Vulnhub进行实战演练),如果对大家有帮助请Star鼓励我们创作更好文章。如果你愿意加入我们,一起完善这个项目,欢迎通过邮件形式(sec-redclub@qq.com)联系我们。

1.会话安全概述

1.1 什么是会话

session会话机制是一种服务器端机制,它使用类似于哈希表(可能还有哈希表)的结构来保存信息。当程序需要为客户端的请求创建会话时,服务器首先检查客户端的请求是否包含会话标识符(称为会话ID)。如果包含它,它先前已为此客户端创建了一个会话。服务器根据会话ID检索会话(无法检索,将创建新会话),如果客户端请求不包含会话ID,则为客户端创建会话并生成与会话关联的会话ID。 session id应该是一个既不重复也不容易被复制的字符串。会话ID将返回给客户端以保存此响应。

1.2常见会话问题

1.2.1会话预测

即预测应用程序的身份验证模式的会话ID值。通过分析和理解会话ID生成过程,攻击者可以预测有效的会话ID值并获得对应用程序的访问权限。

1.2.2会话劫持

通过利用各种手段获取用户Session ID后,使用该Session ID登录网站,获取目标用户的操作权限。

1.2.3会话重用

用户退出系统后,服务器端Session未失效,攻击者可利用此Session向服务器继续发送服务请求。
测试方法:登录后将会话注销,再次重放登录时的数据包仍然可正常登录系统。

1.2.4会话失效时间过长

应用系统的会话失效时间过长。导致服务器性能受损,且由于过长的失效时间会导致可以被多次利用。
测试方法:系统登录后会话长时间不失效,使用系统功能,仍可正常使用。

1.2.5会话固定

在用户进入登录页面,但还未登录时,就已经产生了一个session,用户输入信息,登录以后,session的id不会改变,也就是说没有建立新session,原来的session也没有被销毁)。攻击者事先访问系统并建立一个会话,诱使受害者使用此会话登录系统,然后攻击者再使用该会话访问系统即可登录受害者的账户。
测试方法:系统登录前和登录后,用户的seesion保持不变。

2.危害

攻击者可利用漏洞绕过身份验证提升权限。

3.测试方法

3.1测试靶场介绍

下面介绍两个测试靶场,DVWA靶场和WebGoat靶场。

3.1.1 DVWA

3.1.1.1 靶场介绍

DVWA (Damn Vulnerable Web Application) 是用 PHP+MySQL 编写的一套用于漏洞检测和教学的程序,支持多种数据库,包括了 SQL 注入、XSS 等一些常见的安全漏洞。

3.1.1.2 安装过程

下载地址:http://www.dvwa.co.uk/
下载后解压放到WWW目录,配置好本地域名
修改config.inc.php.dist配置文件中的数据库密码,并且把文件后缀.dist去掉
然后访问配置的本地域名,下拉点击Create Database。

然后登录默认管理员账户:admin/password,出现下图即为安装成功。

3.1.2 WebGoat

WebGoat是OWASP组织研制出的用于进行web漏洞实验的Java靶场程序,用来说明web应用中存在的安全漏洞。WebGoat运行在带有java虚拟机的平台之上,当前提供的训练课程有30多个,其中包括:跨站点脚本攻击(XSS)、访问控制、线程安全、操作隐藏字段、操纵参数、弱会话cookie、SQL盲注、数字型SQL注入、字符串型SQL注入、web服务、Open Authentication失效、危险的HTML注释等等。
Docker方式安装过程:
(1)安装Docker
apt install apt-get install docker.io
(2)查看Docker版本
docker –version
(3)下载WebGoat容器
docker pull webgoat/webgoat-7.1
(4)运行WebGoat
docker run -p 8080:8080 -t webgoat/webgoat-7.1
访问http://127.0.0.1:8080/WebGoat/login,出现下图页面

3.2手工测试

下面采用DVWA靶场进行手工测试。

3.2.1 Low

3.2.1.1 测试过程

使用Firefox登录,默认管理员账户:admin/password
先点击DVWA Security选择测试等级Low,再在Weak Session IDs进行测试。
点击generate生成新的dvwasessionid,多点击几次可以发现,每生成一个dvwasessionid,sessionid+1


点击generate再刷新

此时使用Google浏览器在未登录时访问http://quan.dvwa.net/vulnerabilities/weak_id/时抓包,然后构造Cookie:
dvwaSession=1; PHPSESSID=ba55268a6a3a174b7939898fe1bb06ae; security=low
(PHPSESSID的值改为Firefox的PHPSESSID),即可进入已登陆页面。

3.2.1.2 源码分析

<?php 
$html = ""; 
if ($_SERVER['REQUEST_METHOD'] == "POST") { 
    if (!isset ($_SESSION['last_session_id'])) { 
        $_SESSION['last_session_id'] = 0; 
    } 
    $_SESSION['last_session_id']++; 
    $cookie_value = $_SESSION['last_session_id']; 
    setcookie("dvwaSession", $cookie_value); 
} 
?>

从第4行可以知道,当last_session_id不存在时,令它为0;存在last_session_id时,每次加一,last_session_id即dvwaSession。

3.2.2 Medium

3.2.2.1 测试过程

同样使用Firefox登录管理员账户,先点击DVWA Security选择测试等级Medium,再在Weak Session IDs进行测试。
点击generate生成新的dvwasessionid,用Cookiemanager查看Cookie可以发现,生成的dvwasessionid很明显就是一个当前时间的时间戳。


欺骗用户在某个时间点击generate,就能构造这个时间范围的Cookie:
dvwaSession=1566965958;PHPSESSID=ba55268a6a3a174b7939898fe1bb06ae; security=medium

3.2.2.2 源码分析

<?php 
$html = ""; 
if ($_SERVER['REQUEST_METHOD'] == "POST") { 
    $cookie_value = time(); 
    setcookie("dvwaSession", $cookie_value); 
} 
?>

从第4行代码可以知道,确实就是用时间做的值。

3.2.3 High

3.2.3.1 测试过程

同样使用Firefox登录管理员账户,先点击DVWA Security选择测试等级Medium,再在Weak Session IDs进行测试。
点击generate生成新的dvwasessionid,用Cookiemanager查看Cookie可以发现,生成的dvwasessionid进行了加密。

看着好像是MD5,我们试着用MD5解密一下。


再生成一个sessionid并解密,观察特点好像就是Low等级的MD5加密版。


找到cookie生成规律后就可以构造payload:
Cookie:dvwaSession=e4da3b7fbbce2345d7772b0674a318d5;PHPSESSID=9igf4g7mcnegrv91ro6eq4msj1; security=high

3.2.3.2 源码分析

<?php 
$html = ""; 
if ($_SERVER['REQUEST_METHOD'] == "POST") { 
    if (!isset ($_SESSION['last_session_id_high'])) { 
        $_SESSION['last_session_id_high'] = 0; 
    } 
    $_SESSION['last_session_id_high']++; 
    $cookie_value = md5($_SESSION['last_session_id_high']); 
    setcookie("dvwaSession", $cookie_value, time()+3600, "/vulnerabilities/weak_id/", $_SERVER['HTTP_HOST'], false, false); 
}
?>

根据源码可知,与Low等级的代码相比较,只是多了MD5加密这一步。并且从setcookie()函数可以知道cookie有效期为当前时间到未来一小时内。

3.2.4 Impossible

3.2.4.1 测试过程

同样使用Firefox登录管理员账户,先点击DVWA Security选择测试等级Medium,再在Weak Session IDs进行测试。
点击generate生成dvwasessionid,值为ed880adbdf1fc68b92185e9c5032d5d575bfaee2。尝试MD5失败。遂查看源码。

3.2.4.2 源码分析

<?php 
$html = ""; 
if ($_SERVER['REQUEST_METHOD'] == "POST") { 
    $cookie_value = sha1(mt_rand() . time() . "Impossible"); 
    setcookie("dvwaSession", $cookie_value, time()+3600, "/vulnerabilities/weak_id/", $_SERVER['HTTP_HOST'], true, true); 
} 
?>

根据第4行代码可以看出,先是连接随机数和时间戳,然后又进行sha1加密,一般破解不出。

4.CMS实战演练

下面采用XiaoCMS和YxCMS对会话固定漏洞进行实战演练。

4.1 XiaoCMS

4.1.1CMS介绍

XiaoCms 企业建站版基于 PHP+Mysql 架构 是一款小巧、灵活、简单、易用的轻量级 cms。能满足各种企业站 博客 等中小型站点。

4.1.2 CMS安装

CMS版本:XiaoCMSv1.0
下载地址:http://www.a5xiazai.com/php/108347.html
测试环境:win10、PHP5.2.17、Mysql5.5.53
放到www目录下,正确填写数据库信息,然后next即可。

4.1.3 CMS漏洞介绍

漏洞发生在此处文件:\core\library\session.class.php
漏洞成因:已经存在sessionid时将该sessionid设置为当前sessionid,没有重新生成。
代码分析:

从20行的代码可以知道,如果设置了session_id,那么就会调用session_id()方法将该session_id设置为当前的session_id,而且这个session_id可以用POST方法传输得到。

4.1.4 CMS实战演示

测试步骤:
先注册一个只有几个权限的普通管理员账号:quan(其实注册普通用户就行,但是我没找到)
然后用Google浏览器登录quan账号,用Firefox登录admin账号
分别获取相应session_id,得到quan的ssession_id=57049dc90ccd7226302dc8efbb8f2ce0
直接在火狐浏览器用hackbar测试访问:
http://quan.xiaocms.net/admin/?xiaocms
POST:session_id=57049dc90ccd7226302dc8efbb8f2ce0

也可以构造测试POC:

<html>
    <body>
    <form action="http://quan.xiaocms.net/admin/" method="post">
    <input type="hidden" name="session_id" value="57049dc90ccd7226302dc8efbb8f2ce0">
    <input type="submit" >
    </form>
</body>
</html>

存为html文件,然后用Firefox打开,点击提交查询。

此时打开Google浏览器,可以看到quan管理员的首页状态

因为quan是管理员用户,所以刷新一下,直接变成超级管理员admin
如果是普通会员用户访问http://quan.xiaocms.net/admin/?xiaocms即可

4.2 YxCMS

4.2.1 CMS介绍

Yxcms是一款高效,灵活,实用,免费的企业建站系统,基于PHP和mysql技术,让您拥有更加专业的企业建站和企业网站制作服务。

4.2.2 CMS安装

放入www目录下,一直next即可

4.2.3 CMS漏洞介绍

漏洞发生在此处文件:yxcms/protected/include/lib/common.function.php
漏洞成因:已经存在sessionid时将该sessionid设置为当前sessionid,没有重新生成。
代码分析:

从644行代码可以知道,存在session_id时调用session_id()函数将该session设置为当前,
并且可以从request()函数得到。
再看一下request函数包括哪些方法

支持挺多的方法传输参数,当然是GET方法最nice~

4.2.4 CMS实战演示

后台登陆地址:http://quan.yxcms146.net/index.php?r=admin/index/login
管理员账户:admin/123456
演示过程:
注册一个普通会员用户quan,然后用Google浏览器登录quan账号,用Firefox登录admin账号

得到PHPSESSID为5fcb75b7b1cda3d797b1cf7ac1cc0be1
直接在admin管理页面加上&sessionid=5fcb75b7b1cda3d797b1cf7ac1cc0be1并访问
在Google浏览器访问http://quan.yxcms146.net/index.php?r=admin/index/index
即可获取admin管理员会话

5.防御方法

5.1服务器端在Set-Cookie时在Cookie的值后面加上一段防篡改的验证串,然后再发送到客户端

5.2用户退出系统后,服务器端应清空此用户的Session信息

5.3服务器端设置Session的存活时间,超过存活时间强制销毁Session

5.4在用户提供的认证信息(例如用户名和密码)、相应的权限级别发生变化时,服务器端应重新生成SessionID,并强制失效之前的会话

海量安全课程   点击以下链接   即可观看 

http://qiyuanxuetang.net/courses/

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!