会话固定攻击(Session Fixation)
⚡️会话固定攻击(session fixation attack)是利用应用系统在服务器的会话ID固定不变机制,借助他人用相同的会话ID获取认证和授权,然后利用该会话ID劫持他人的会话以成功冒充他人,造成会话固定攻击。
整个攻击流程:
-
攻击者Attacker能正常访问该应用网站。
-
应用网站服务器返回一个会话ID给他。
-
攻击者Attacker用该回话ID构造一个该网站链接发给受害者Victim。
-
受害者Victim点击该链接。
-
携带攻击者的会话ID和用户名密码正常登陆了该网站,会话成功建立。
-
攻击者Attacker用该会话ID成功冒充并劫持了受害者Victim的会话。
👉了解更多
攻击分析:
攻击的整个过程,会话ID没变过,所以导致此漏洞。
🏡攻击修复: -
登录重建会话
每次登录后都重置会话ID,并生成一个新的会话ID,这样攻击者就无法用自己的会话ID来劫持会话,核心代码如下:
// 会话失效
session.invalidate();
// 会话重建
session=request.getSession(true);
- 禁用客户端访问cookie
此方法也避免了配合XSS攻击来获取Cookie中的会话信息以达成会话固定攻击。在Http响应头中启用HttpOnly属性,或者在tomcat容器中配置。
CSRF
⚡️CRSF(Cross-site request forgery)跨站请求伪造,不攻击网站服务器,而是冒充用户在站内的正常操作,以你的名义发送恶意请求(包括虚拟货币转账、发送邮件、购买商品…),造成个人隐私泄露以及财产安全问题。
攻击分析:
通常是由于服务器没有对请求头做严格过滤引起的。
🏡攻击修复(服务端):
- Cookie Hashing(所有表单都包含同一个伪随机值)
理论上攻击者不能获得第三方的Cookie(理论上),所以表单中的数据就构造失败。
<?php
//构造加密的Cookie信息
$value = “DefenseSCRF”;
setcookie(”cookie”, $value, time()+3600);
?>
在表单里增加Hash值,以认证这确实是用户发送的请求。
<?php
$hash = md5($_COOKIE[\\\'cookie\\\']);
?>
<form method=”POST” action=”transfer.php”>
<input type=”text” name=”toBankId”>
<input type=”text” name=”money”>
<input type=”hidden” name=”hash” value=”<?=$hash;?>”>
<input type=”submit” name=”submit” value=”Submit”>
</form>
然后在服务器端进行Hahs值验证
<?php
if(isset($_POST[\\\'check\\\'])) {
$hash = md5($_COOKIE[\\\'cookie\\\']);
if($_POST[\\\'check\\\'] == $hash) {
doJob();
} else {
//...
}
} else {
//...
}
?>
这个方法个人觉得已经可以杜绝99%的CSRF攻击了,那还有1%呢…由于用户的Cookie很容易由于网站的XSS漏洞而被盗取,这就另外的1%。
- 验证码
每次的用户提交都需要用户在表单中填写一个图片上的随机字符串,Hmmm这个方案完全可以解决CSRF,但是易用性似乎不大好,而且听闻验证码图片的使用设计了一个被称为MHTML的Bug,可能在某些版本的微软IE中受影响。 - One-Time Tokens(不同表单包含一个不同的伪随机值)
在实现One-Time Tokens时,需要注意一点,就是"并行会话的兼容"。如果用户在一个站点上同时打开了两个不同的表单,CSRF保护措施不应该影响到他对任何表单的提交。考虑一下如果每次表单被装入时站点生成一个伪随机值来覆盖以前的伪随机值将会发生什么情况:用户只能成功地提交他最后打开的表单,因为所有其他的表单都含有非法的伪随机值。必须小心操作以确保CSRF保护措施不会影响选项卡式的浏览或者利用多个浏览器窗口浏览一个站点。
Vulnerable JavaScript Library
⚡️第三方 JavaScript 的安全问题.
- jQuery
- jQuery UI
🏡攻击修复:
更换最新版本的js文件。
其他:
👉第三方JavaScript响应的危险jQuery行为