PHP中的设置
PHP5.2以上版本已支持HttpOnly参数的设置,同样也支持全局的HttpOnly的设置,在php.ini中
-----------------------------------------------------
session.cookie_httponly = true <?php header("Set-Cookie: hidden=value; httpOnly"); ?> 测试不可用 PHP V5.5
-----------------------------------------------------
设置其值为1或者TRUE,来开启全局的Cookie的HttpOnly属性,当然也支持在代码中来开启:
-----------------------------------------------------
<?php ini_set("session.cookie_httponly", 1);
// or session_set_cookie_params(0, NULL, NULL, NULL, TRUE);
?>
-----------------------------------------------------
Cookie操作函数setcookie函数和setrawcookie函数也专门添加了第7个参数来做为HttpOnly的选项,开启方法为:
-------------------------------------------------------
setcookie("abc", "test", NULL, NULL, NULL, NULL, TRUE);
setrawcookie("abc", "test", NULL, NULL, NULL, NULL, TRUE);
-------------------------------------------------------
对于PHP5.1以前版本以及PHP4版本的话,则需要通过header函数来变通下了:
-------------------------------------------------------------
<?php header("Set-Cookie: hidden=value; httpOnly"); ?>
PHP漏洞之session会话劫持
本文主要介绍针对PHP网站Session劫持。session劫持是一种比较复杂的攻击方法。大部分互联网上的电脑多存在被攻击的危险。这是一种劫持tcp协议的方法,所以几乎所有的局域网,都存在被劫持可能。
服务端和客户端之间是通过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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
//login.php
session_start
(
)
;
if
(
isset
(
$
_POST
[
"login"
]
)
)
{
$
link
=
mysql_connect
(
"localhost"
,
"root"
,
"root"
)
or
die
(
"无法建立MySQL数据库连接:"
.
mysql_error
(
)
)
;
mysql_select_db
(
"cms"
)
or
die
(
"无法选择MySQL数据库"
)
;
if
(
!
get_magic_quotes_gpc
(
)
)
{
$
query
=
"select * from member where username=’"
.
addslashes
(
$
_POST
[
"username"
]
)
.
"’ and password=’"
.
addslashes
(
$
_POST
[
"password"
]
)
.
"’"
;
}
else
{
$
query
=
"select * from member where username=’"
.
$
_POST
[
"username"
]
.
"’ and password=’"
.
$
_POST
[
"password"
]
.
"’"
;
}
$
result
=
mysql_query
(
$
query
)
or
die
(
"执行MySQL查询语句失败:"
.
mysql_error
(
)
)
;
$
match_count
=
mysql_num_rows
(
$
result
)
;
if
(
$
match_count
)
{
$
_SESSION
[
"username"
]
=
$
_POST
[
"username"
]
;
$
_SESSION
[
"password"
]
=
$
_POST
[
"password"
]
;
$
_SESSION
[
"book"
]
=
1
;
mysql_free_result
(
$
result
)
;
mysql_close
(
$
link
)
;
header
(
"Location: http://localhost/index.php?user="
.
$
_POST
[
"username"
]
)
;
}
|
//index.php
session_start();// 打开Session
访客的 Session ID 是:echo session_id();
访客:echo htmlspecialchars($_GET[“user”], ENT_QUOTES);
book商品的数量:echo htmlspecialchars($_SESSION[“book”], ENT_QUOTES);
如果登录成功,使用
$_SESSION[“username”] 保存账号
$_SESSION[“password”] 保存密码
#_SESSION[“book”] 保存购买商品数目
开始攻击
1
2
3
4
5
6
7
|
//attack.php
session_start
(
)
;
// 打开Session
echo
"目标用户的Session ID是:"
.
session_id
(
)
.
""
; //还原攻击对象的SESSION信息
echo
"目标用户的username是:"
.
$
_SESSION
[
"username"
]
.
""
;
echo
"目标用户的password是:"
.
$
_SESSION
[
"password"
]
.
""
;
// 将book的数量设置为2000
$
_SESSION
[
"book"
]
=
2000
;
|
提交 http://www.91ri.org/ 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,编辑session.use_trans_sid = 0
代码中
int_set(“session.use_trans_sid”, 0);
session_start();
4)只从cookie检查session id【不明白】
session.use_cookies = 1 表示使用cookies存放session id
session.use_only_cookies = 1 表示只使用cookies存放session id,这可以避免session固定攻击
代码中
int_set(“session.use_cookies”, 1);
int_set(“session.use_only_cookies”, 1);
5)使用URL传递隐藏参数
session_start();
$seid = md5(uniqid(rand()), TRUE));
$_SESSION[“seid”] = $seid;
攻击者虽然能获取session数据,但是无法得知$seid的值,只要检查seid的值,就可以确认当前页面是否是web程序自己调用的。