PHP漏洞全解(七)-Session劫持
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PHP漏洞全解(七)-Session劫持
2012-04-12 15:42 DoDo DoDo's Blog我要评论(0)字号:T | T
本文主要介绍针对PHP网站Session劫持。
session劫持是一种比较复杂的攻击方法。
大部分互联网上的电脑多存在被攻击的危险。
这是一种劫持tcp协议的方法,所以几乎所有的局域网,都存在被劫持可能。
AD:
服务端和客户端之间是通过session(会话)来连接沟通。
当客户端的浏览器连接到服务器后,服务器就会建立一个该用户的 session。
每个用户的session都是独立的,并且由服务器来维护。
每个用户的session是由一个独特的字符串来识别,成为session id。
用户发出请求时,所发送的http表头内包含session id 的值。
服务器使用http表头内的session id来识别时哪个用户提交的请求。
session保存的是每个用户的个人数据,一般的web应用程序会使用session来保存通过验证的用户账号和密码。
在转换不同的网页时,如果需要验证用户身份,就是用session内所保存的账号和密码来比较。
session的生命周期从用户连上服务器后开始,在用户关掉浏览器或是注销时用户 session_destroy函数删除session数据时结束。
如果用户在20分钟内没有使用计算机的动作,session 也会自动结束。
php处理session的应用架构
会话劫持
会话劫持是指攻击者利用各种手段来获取目标用户的session id。
一旦获取到session id,那么攻击者可以利用目标用户的身份来登录网站,获取目标用户的操作权限。
攻击者获取目标用户session id的方法:
1)暴力破解:尝试各种session id,直到破解为止。
2)计算:如果session id使用非随机的方式产生,那么就有可能计算出来
3)窃取:使用网络截获,xss攻击等方法获得
会话劫持的攻击步骤
实例
1.//login.php
2.
3.session_start();
4.if (isset($_POST["login"]))
5.{
6.$link = mysql_connect("localhost", "root", "root")
7.or die("无法建立MySQL数据库连接:" . mysql_error());
8.mysql_select_db("cms") or die("无法选择MySQL数据库");
9.if (!get_magic_quotes_gpc())
10.{
11.$query = "select * from member where username=’" . addslashe
s($_POST["username"]) .
12."’ and passw ord=’" . addslashes($_POST["password"]) . "’";
13.}
14.else
15.{
16.$query = "select * from member where username=’" . $_POST["u
sername"] .
17."’ and password=’" . $_POST["password"] . "’";
18.}
19.$result = mysql_query($query)
20.or die("执行MySQL查询语句失败:" . mysql_error());
21.$match_count = mysql_num_rows($result);
22.if ($match_count)
23.{
24.$_SESSION["username"] = $_POST["username"];
25.$_SESSION["password"] = $_POST["password"];
26.$_SESSION["book"] = 1;
27.mysql_free_result($result);
28.mysql_close($link);
29.header("Location: http://localhost/index.php?user=" .
30.$_POST["username"]);
31.}
…..
1.//index.php
2.
3.// 打开Session
4.session_start();
5.
6.访客的 Session ID 是:echo session_id(); ?>
7.
8.
9.访客:echo htmlspecialchars($_GET["user"], ENT_QUOTES); ?>
10.
11.
12.book商品的数量:
echo htmlspecialchars($_SESSION["book"], ENT_QUOTES); ?>
13.如果登录成功,使用
14.$_SESSION["username"] 保存账号
15.$_SESSION["password"] 保存密码
16.#_SESSION["book"] 保存购买商品数目
登录以后显示
开始攻击
1.//attack.php
2.php
3. // 打开Session
4. session_start();
5. echo "目标用户的Session ID是:
" . session_id() . "<br />";
6. echo "目标用户的username是:
" . $_SESSION["username"] . "<br />";
7. echo "目标用户的password是:
" . $_SESSION["password"] . "<br />";
8. // 将book的数量设置为2000
9. $_SESSION["book"] = 2000;
10.?>
提交http://localhost/attack.php?PHPSESSID=5a6kqe7cufhstuhcmhgr9nsg45此ID为获取到的客户session id,刷新客户页面以后
客户购买的商品变成了2000
session固定攻击
黑客可以使用把session id发给用户的方式,来完成攻击
http://localhost/index.php?user=dodo&PHPSESSID=1234 把此链接发送给dodo这个用户显示
然后攻击者再访问 http://localhost/attack.php?PHPSESSID=1234 后,客户页面刷新,发现
商品数量已经成了2000
防范方法
1)定期更改session id
函数 bool session_regenerate_id([bool delete_old_session])
delete_old_session为true,则删除旧的session文件;为false,则保留旧的session,默认false,可选
在index.php开头加上
session_start();
session_regenerate_id(TRUE);
……
这样每次从新加载都会产生一个新的session id
2)更改session的名称
session的默认名称是PHPSESSID,此变量会保存在cookie中,如果黑客不抓包分析,就不能猜到这个名称,阻挡部分攻击
session_start();
session_name("mysessionid");
……
3)关闭透明化session id
透明化session id指当浏览器中的http请求没有使用cookies来制定session id时,sessioin id使用链接来传递;打开php.ini,编辑
e_trans_sid = 0
代码中
int_set("e_trans_sid", 0);
session_start();
……
4)只从cookie检查session id
e_cookies = 1 表示使用cookies存放session id
e_only_cookies = 1 表示只使用cookies存放session id,这可以避免session固定攻击
代码中
int_set("e_cookies", 1);
int_set("e_only_cookies", 1); p>
5)使用URL传递隐藏参数
session_start();
$seid = md5(uniqid(rand()), TRUE));
$_SESSION["seid"] = $seid;
攻击者虽然能获取session数据,但是无法得知$seid的值,只要检查seid的值,就可以确认当前页面是否是web程序自己调用的。