漏洞原理
- 当用户第一次访问服务程序时,服务器端会给用户创建一个独立的会话
Session
并且生成一个SessionID
。 SessionID
在响应浏览器的时候会被加载到cookie
中,并保存到浏览器中。- 当用户再一次访问服务程序时,请求中会携带着
cookie
中的SessionID
去访问服务器。 - 服务器会根据这个
SessionID
去查看是否有对应的Session
对象,有则使用,没有就新创建一个Session
。
漏洞介绍
- 如果
SessionID
的构造原理太简单,就很容易被别人仿造。 - 仿造了
SessionID
之后应用到cookie
,即可无登录访问被害者服务。
漏洞复现
- 使用
DVWA
靶场的Weak Session IDs
作为演示场景。
Low
代码
1 |
|
审计
- 使用
POST
上传参数时候,设置SessionID
。 - 若设置过,则使用上一次的
SessionID
直接+1
,若未设置,则初始化为0
。 - 这样的
SessionID
太过简单,并且很容易冲突,无法标识单一个体。
攻击
- 找到每次
dvwaSession
的变化规律,使用BurpSuite
抓包查看dvwaSession
。 使用他人的
dvwaSession
以及其他cookie
内容,尝试删除cookie
后登录。能够登录,说明
cookie
构造成功(虽然是自己已经看到的)。
Medium
代码
1 |
|
审计
- 使用时间函数获取当前时间作为
cookie
,故同一时间的会话将会发生冲突。 - 其余设置同
Low
。
time( ) : int 返回当前的
GMT
时间,即Unix
纪元起到现在的秒数。
攻击
- 使用时间戳在线转换器构造时间点,诱骗受害者在该时间点击,形成
SessionID
碰撞(感觉不太可能)。 - 或者在受害者最近一次登录后,通过获取其登入时间点,构造时间戳。
使用预测的
dvwaSession
登入即可。
High
代码
1 |
|
审计
- 基本内容同
Low
,在累加的基础上增加了md5
加密。
setcookie( string
$name
, string$value
= “” , int$expires
= 0 , string$path
= “” , string$domain
= “” , bool$secure
=false
, bool$httponly
=false
) : bool 即定义一条cookie
,名为name
,值为value
,失效期为expires
(GMT
时间),path
为有效的服务器路径,domain
为有效的域名,secure
表示是否建立HTTPS
连接,httponly
表示是否只通过HTTP
协议访问。
攻击
- 获取现有
dvwaSession
后,使用网上的md5在线加解密工具得到明文。
- 找到明文规律后,构造
dvwaSession
实现无登录访问。
漏洞防御
- 使用
DVWA
的Impossible
级别进行审计。
代码
1 |
|
审计
- 使用
SHA1
加密,使得SessionID
难以破译。 - 明文内容为随机数+
GMT
时间+字符串,增加了伪造的难度。 - 但仍存在
SessionID
冲突的情况。
sha1( string
$string
, bool$binary
=false
) : string计算字符串的SHA-1
散列,binary
为TRUE
时为二进制,FALSE
时为十六进制。mt_rand( int
$min
, int$max
) : int 使用Mersenne Twister的算法生成随机数,若有参数则介于min
和max
,若无参数则生成0
到mt_getrandmax()之间的随机数。