目录
主要思路是通过多次生成会话ID来摸索会话ID的规律。
LOW
通过步骤
1、按一下Generate按钮,burpsuite抓包,发现Response中Set-Cookie: dvwaSession=1
2、再次按下Generate按钮,burpsuite抓包,发现Request中Cookie头包含dvwaSession=1(其他两个值security=low; PHPSESSID=ufkhsgpocjvch99ejmu3ft1006是登录DVWA的时候服务器设置的cookie,与本关无关);
Response中Set-Cookie: dvwaSession=2
3、再次按下Generate按钮,burpsuite抓包,发现Request中Cookie头包含dvwaSession=2,Response中Set-Cookie: dvwaSession=3
4、根据以上可以判断,本关的cookie是从1开始每按一次Generate按钮,递增1
现实场景中遇到这种有规律的session id就可以用burpsuite爆破了。
本来我也想在dvwa模拟一下这种情况,但用另一台电脑试了一下,dvwa的这个dvwaSession字段并没有什么卵用:
如果cookie只设置 dvwaSession=3则无法绕过登录验证;
如果cookie设置为security=low; PHPSESSID=ufkhsgpocjvch99ejmu3ft1006,就可以跳过登录验证直接到上述网页,根本不需要dvwaSession
代码分析
代码的意思是:
如果没有变量$_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。
MEDIUM
通关步骤
1、Chrome浏览器按F12,调出开发者工具,找到Application--Storage--Cookies。
第1次按Generate按钮,dvwaSession值为1610882651
2、第2次按Generate按钮,dvwaSession值为1610883164
3、第3次按Generate按钮,dvwaSession值为1610883191
4、从以上三步的结果可以看出来,每次按Generate按钮生成的10位dvwaSession的值前6位是一样的,只有后4位不同,并且后4位是增长趋势的,每次增长的数量也不同。
合理推测可能与时间有关。
必应搜索一下时间戳转换工具,看看推测是否成立:
看到下图就感觉很靠谱了,毕竟前6位和刚刚生成的dvwaSession是一样的
第1个dvwaSession
第2个dvwaSession
第3个dvwaSession
从上面的结果基本可以看出来,要么dvwaSession就是按Generate按钮时候的时间戳,要么就是时间戳加减了什么值。
于是又对着时间戳转换器中现在的时间戳按了一次Generate按钮,产生的dvwaSession和当前时间戳基本上是一致的。
这种由时间戳产生的Session ID也是可以通过爆破来猜测的。
代码分析
time()函数返回自 Unix 纪元(January 1 1970 00:00:00 GMT)起的当前时间的秒数。
本关代码在用户按下Generate按钮之后,返回等于当前时间戳的dvwaSession值作为cookie
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
网上搜索一下 md5解密 ,网上的一般明文是位数不多的数字的还是能解出来的。
得到明文20
2、再次按下Generate按钮,dvwaSession的值更新
md5解密后是21
3、又一次按下Generate按钮,dvwaSession的值更新
md5解密后是22
4、至此,可以判断本关dvwaSession的值是md5加密的,并且明文是每按一次Generate按钮递增1的。
这种也可以爆破。
设置爆破位置:
设置payloads:
注意Payload Processing中要添加task Hash:MD5
具体方法是点击Add,然后如下图这样选择
代码分析
从代码可见,这关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。
退到home下(http://192.168.116.132/dvwa/),发现没有dvwaSession。
进入CSRF(http://192.168.116.132/dvwa/vulnerabilities/csrf/),也没有dvwaSession。
但是从上面几张图可见,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头所示:
IMPOSSIBLE
本关生成的cookie如下图Response报文的Set-Cookie头所示,由于设置了secure,因此该cookie仅可通过https传输,因此本关中客户端并没有收到服务器发来的cookie。
代码分析
本关cookie值计算采用的是SHA-1散列函数,并且计算时还通过mt_rand()函数,在基于时间(time()函数)的基础上引入了随机数,因此不具备可预测性。
除此之外,setcookie()函数的secure参数和httponly参数在本关都是true,增加了cookie的安全性。
总结
感觉dvwa的Weak Session ID基本就是在科普setcookie函数,以及一个道理:好的cookie是不可预测的cookie。
如果cookie可预测,就可以在其他用户创建了合法会话之后,通过预测(通常用到暴力破解)来冒用其他用户身份。
关于PHP中如何创建获取删除cookie,参见PHP Cookies
关于PHP的setcookie函数,参见setcookie