Session劫持攻击
Session劫持攻击是指黑客劫持目标用户的session id来获取网站服务器上未经许可的存取信息,特别是窃取目标用户等的cookie数据,来取得网站的认可。
攻击步骤
代码展示
login3.php
<?php
header("Content-Type:text/html;charset=utf-8");
session_start();
if(isset($_POST['login'])){
$username = $_POST['username'];
$password = $_POST['password'];
$conn = mysql_connect("localhost","root","root");
mysql_select_db("admin",$conn);
$sql = "SELECT * FROM admin WHERE username='".$username."'";
$result = mysql_query($sql) or die(mysql_error());
if($row = mysql_fetch_row($result)){
$_SESSION['username'] = $username;
$_SESSION['password'] = $password;
$_SESSION['book'] = 1;
header("Location:http://127.0.0.1/PHP/member.php?user=".$username);
}
}
?>
<html>
<body>
<form method="post" name="form">
账号:<input type="text" name="username" id="username">
密码:<input type="password" name="password" id="password">
<input type="submit" name="login" id="login">
</form>
</body>
</html>
member.php
<?php
header("Content-Type:text/html;charset=utf-8");
session_start();
echo "访客的session id是".session_id()."<br />";
echo "访客".$_GET['user']."<br />";
echo "book的商品数量".$_SESSION['book']."<br />";
?>
attack.php
<?php
header("Content-Type:text/html;charset=utf-8");
session_start();
echo "访客的session id是".session_id()."<br />";
echo "访客".$_SESSION['username']."<br />";
echo "book的商品数量".$_SESSION['book']=2000 ."<br />";
?>
首先我们先登录网站获取一个session id的值
然后再访问attack.php,并将PHPSESSID的值输入进去
然后回到member.php页面,刷新页面发现book的商品数量变为了2000
修复方案
- 使用随机而且长度够大的数字或字符串来当做session id
- 将网页之间传递的数据使用某种形式进行封装,特别是session id
- 更改session名称
- 注销后即销毁session的所有数据
Session固定攻击
session 固定攻击是因为黑客固定住目标用户的session id,因此目标用户所使用的session可有攻击者指定。
攻击步骤
修复方案
- 不要从GET/POST变量中接受session id
- 调用session_start函数后,立即产生新的session id,并删除旧的session
- 将session id存放在cookie内
- 注销后即销毁session的所有数据
- 使用时间戳来记录session的使用时间,如果两次session的相差时间太长,就销毁session的所有数据
- 检查用户的IP地址,如果IP地址改变就产生一个新的session id,并且删除旧的session
总结
Session会话劫持主要是攻击者劫持了用户的session id,然后对该用户的数据进行恶意操作的过程;而Session固定攻击则是用户使用了攻击者事先准备好的session id,然后用户输入了敏感信息登录网站后,网站对该session id表示信任,攻击者就能使用该session id进行恶意操作。