DVWA通关--弱会话ID(Weak Session IDs)

目录

LOW

通过步骤

代码分析

MEDIUM

通关步骤

代码分析

HIGH

通关步骤

代码分析

IMPOSSIBLE

代码分析

总结


主要思路是通过多次生成会话ID来摸索会话ID的规律。

LOW

通过步骤

1、按一下Generate按钮,burpsuite抓包,发现Response中Set-Cookie: dvwaSession=1

DVWA通关--弱会话ID(Weak Session IDs)

DVWA通关--弱会话ID(Weak Session IDs)

2、再次按下Generate按钮,burpsuite抓包,发现Request中Cookie头包含dvwaSession=1(其他两个值security=low; PHPSESSID=ufkhsgpocjvch99ejmu3ft1006是登录DVWA的时候服务器设置的cookie,与本关无关);

Response中Set-Cookie: dvwaSession=2

DVWA通关--弱会话ID(Weak Session IDs)

DVWA通关--弱会话ID(Weak Session IDs)

3、再次按下Generate按钮,burpsuite抓包,发现Request中Cookie头包含dvwaSession=2,Response中Set-Cookie: dvwaSession=3

DVWA通关--弱会话ID(Weak Session IDs)

DVWA通关--弱会话ID(Weak Session IDs)

4、根据以上可以判断,本关的cookie是从1开始每按一次Generate按钮,递增1

现实场景中遇到这种有规律的session id就可以用burpsuite爆破了。

本来我也想在dvwa模拟一下这种情况,但用另一台电脑试了一下,dvwa的这个dvwaSession字段并没有什么卵用:

如果cookie只设置 dvwaSession=3则无法绕过登录验证;

DVWA通关--弱会话ID(Weak Session IDs)

如果cookie设置为security=low; PHPSESSID=ufkhsgpocjvch99ejmu3ft1006,就可以跳过登录验证直接到上述网页,根本不需要dvwaSession

DVWA通关--弱会话ID(Weak Session IDs)

代码分析

代码的意思是:

如果没有变量$_SESSION['last_session_id'],则变量值设置为0,变量值加1;如果有变量$_SESSION['last_session_id'],则变量值加1。然后向用户发送名为dvwaSession,值为$_SESSION['last_session_id']的HTTP cookie。

也就是说,名为dvwaSession的cookie的值从1开始每按一次Generate按钮递增1。

setcookie()函数的作用是向客户端发送一个 HTTP cookie。

DVWA通关--弱会话ID(Weak Session IDs)

MEDIUM

通关步骤

1、Chrome浏览器按F12,调出开发者工具,找到Application--Storage--Cookies。

第1次按Generate按钮,dvwaSession值为1610882651

DVWA通关--弱会话ID(Weak Session IDs)

2、第2次按Generate按钮,dvwaSession值为1610883164

DVWA通关--弱会话ID(Weak Session IDs)

3、第3次按Generate按钮,dvwaSession值为1610883191

DVWA通关--弱会话ID(Weak Session IDs)

4、从以上三步的结果可以看出来,每次按Generate按钮生成的10位dvwaSession的值前6位是一样的,只有后4位不同,并且后4位是增长趋势的,每次增长的数量也不同。

合理推测可能与时间有关。

必应搜索一下时间戳转换工具,看看推测是否成立:

看到下图就感觉很靠谱了,毕竟前6位和刚刚生成的dvwaSession是一样的

DVWA通关--弱会话ID(Weak Session IDs)

第1个dvwaSession

DVWA通关--弱会话ID(Weak Session IDs)

第2个dvwaSession

DVWA通关--弱会话ID(Weak Session IDs)

第3个dvwaSession

DVWA通关--弱会话ID(Weak Session IDs)

从上面的结果基本可以看出来,要么dvwaSession就是按Generate按钮时候的时间戳,要么就是时间戳加减了什么值。

于是又对着时间戳转换器中现在的时间戳按了一次Generate按钮,产生的dvwaSession和当前时间戳基本上是一致的。

这种由时间戳产生的Session ID也是可以通过爆破来猜测的。

代码分析

time()函数返回自 Unix 纪元(January 1 1970 00:00:00 GMT)起的当前时间的秒数。

本关代码在用户按下Generate按钮之后,返回等于当前时间戳的dvwaSession值作为cookie

DVWA通关--弱会话ID(Weak Session IDs)

HIGH

通关步骤

先提醒一下这关的一个重要的注意事项,含剧透:

做这关的时候我遇到一个问题,就是服务器生成的cookie发到客户端来之后,浏览器上并不能看到,也就是说生成的cookie是非法或者无效的。

后来经过调试代码发现,这关发来的cookie是包含path参数的,但是这关path参数的值在代码里面是写死的,值是"/vulnerabilities/weak_id/",这样一来,除非dvwa的代码直接就在网站根目录下,也就是说,比如http://192.168.116.132就能访问到dvwa的登录页面,这时这关生成的cookie的path才是正确的。

而我在根目录下还有个DVWA目录,这个目录里面是dvwa的代码,我访问http://192.168.116.132/dvwa才能访问到dvwa的登录页面,那这时这关生成的cookie的path就不对了,正确的应该是"/dvwa/vulnerabilities/weak_id/"。

1、按下Generate按钮,生成了名为dvwaSession,值为98f13708210194c475687be6106a3b84的cookie。

这个cookie看起来是32位十六进制,也就是128位二进制,有可能是md5

DVWA通关--弱会话ID(Weak Session IDs)

网上搜索一下 md5解密 ,网上的一般明文是位数不多的数字的还是能解出来的。

得到明文20

DVWA通关--弱会话ID(Weak Session IDs)

2、再次按下Generate按钮,dvwaSession的值更新

DVWA通关--弱会话ID(Weak Session IDs)

md5解密后是21

DVWA通关--弱会话ID(Weak Session IDs)

3、又一次按下Generate按钮,dvwaSession的值更新

DVWA通关--弱会话ID(Weak Session IDs)

md5解密后是22

DVWA通关--弱会话ID(Weak Session IDs)

4、至此,可以判断本关dvwaSession的值是md5加密的,并且明文是每按一次Generate按钮递增1的。

这种也可以爆破。

设置爆破位置:

DVWA通关--弱会话ID(Weak Session IDs)

设置payloads:

DVWA通关--弱会话ID(Weak Session IDs)

注意Payload Processing中要添加task Hash:MD5

DVWA通关--弱会话ID(Weak Session IDs)

具体方法是点击Add,然后如下图这样选择

DVWA通关--弱会话ID(Weak Session IDs)

代码分析

DVWA通关--弱会话ID(Weak Session IDs)

从代码可见,这关dvwaSession的值和上文猜测的一样,也是从1开始递增,并经过md5加密的。

除此之外,从代码中可见,这关setcookie()函数的参数很多,我们来一个一个看一下。

setcookie()函数的定义如下(具体可见setcookie):

setcookie ( string $name , string $value = "" , int $expires = 0 , string $path = "" , string $domain = "" , bool $secure = false , bool $httponly = false ) : bool

name:

cookie名称。这里是"dvwaSession"。

value:

cookie值,存储于用户电脑。这里是$cookie_value。

expires:

Cookie的过期时间。如果设置成零,或者忽略参数, Cookie 会在会话结束时过期(也就是关掉浏览器时)。这里是time()+3600,表示1小时后过期。

path:

Cookie 有效的服务器路径。 设置成 '/' 时,Cookie 对整个域名 domain 有效。 如果设置成 '/foo/', Cookie 仅仅对 domain 中 /foo/ 目录及其子目录有效(比如 /foo/bar/)。 默认值是设置 Cookie 时的当前目录。

这里是"/dvwa/vulnerabilities/weak_id/"。

为了理解这个参数,可以做一个实验。

登录dvwa后,进入本关,按下Generate按钮,生成一个名为dvwaSession的cookie。

DVWA通关--弱会话ID(Weak Session IDs)

退到home下(http://192.168.116.132/dvwa/),发现没有dvwaSession。

DVWA通关--弱会话ID(Weak Session IDs)

进入CSRF(http://192.168.116.132/dvwa/vulnerabilities/csrf/),也没有dvwaSession。

DVWA通关--弱会话ID(Weak Session IDs)

但是从上面几张图可见,path值为 '/' 时,Cookie 对整个域名 domain 有效(上图的PHPSESSID),path值为/dvwa时,在其子目录下也是有效的(上图的security)。

domain:

Cookie 的有效域名/子域名。 设置成子域名(例如 'www.example.com'),会使 Cookie 对这个子域名和它的三级域名有效(例如 w2.www.example.com)。 要让 Cookie 对整个域名有效(包括它的全部子域名),只要设置成域名就可以了(这个例子里是 'example.com')。这里是$_SERVER['HTTP_HOST']。

secure:

设置这个 Cookie 是否仅仅通过安全的 HTTPS 连接传给客户端。这里是false,也就是说可以通过http传递cookie给客户端。

httponly:

设置成 true时,Cookie 仅可通过 HTTP 协议访问,无法通过类似 JavaScript 这样的脚本语言访问。可有效减少 XSS 攻击时的身份窃取行为。这里是false,也就是可以通过脚本语言访问cookie。

本关生成的cookie如下图Response报文的Set-Cookie头所示:

 

DVWA通关--弱会话ID(Weak Session IDs)

IMPOSSIBLE

本关生成的cookie如下图Response报文的Set-Cookie头所示,由于设置了secure,因此该cookie仅可通过https传输,因此本关中客户端并没有收到服务器发来的cookie。

DVWA通关--弱会话ID(Weak Session IDs)

DVWA通关--弱会话ID(Weak Session IDs)

代码分析

本关cookie值计算采用的是SHA-1散列函数,并且计算时还通过mt_rand()函数,在基于时间(time()函数)的基础上引入了随机数,因此不具备可预测性。

除此之外,setcookie()函数的secure参数和httponly参数在本关都是true,增加了cookie的安全性。

DVWA通关--弱会话ID(Weak Session IDs)

总结

感觉dvwa的Weak Session ID基本就是在科普setcookie函数,以及一个道理:好的cookie是不可预测的cookie。

如果cookie可预测,就可以在其他用户创建了合法会话之后,通过预测(通常用到暴力破解)来冒用其他用户身份。

关于PHP中如何创建获取删除cookie,参见PHP Cookies

关于PHP的setcookie函数,参见setcookie

上一篇:DVWA-csp Bypass


下一篇:DVWA笔记:利用文件包含漏洞(低级)获取webshell