session文件包含漏洞
利用条件:
session的存储位置可以获取。
- 通过phpinfo的信息可以获取到session的存储位置。
通过phpinfo的信息,获取到session.save_path为/var/lib/php/session.
- 通过猜测默认的session存放位置进行尝试。
session中的内容可以被控制,传入恶意代码。
示例:
<?php
session_start();
$ctfs=$_GET['ctfs'];
$_SESSION["username"]=$ctfs;
?>
session_start()解释:
1.session的工作原理
(1)首先使用session_start()函数进行初始换
(2)当执行PHP脚本时,通过使用
S
E
S
S
I
O
N
超
全
局
变
量
注
册
s
e
s
s
i
o
n
变
量
。
(
3
)
当
P
H
P
脚
本
执
行
结
束
时
,
未
被
销
毁
的
s
e
s
s
i
o
n
变
量
会
被
自
动
保
存
在
本
地
一
定
路
径
下
的
s
e
s
s
i
o
n
库
中
,
这
个
路
径
可
以
通
过
p
h
p
.
i
n
i
文
件
中
的
s
e
s
s
i
o
n
.
s
a
v
e
p
a
t
h
指
定
,
下
次
浏
览
网
页
时
可
以
加
载
使
用
。
2.
s
e
s
s
i
o
n
s
t
a
r
t
(
)
做
了
哪
些
初
始
化
工
作
(
1
)
读
取
名
为
P
H
P
S
E
S
S
I
D
(
如
果
没
有
改
变
默
认
值
)
的
c
o
o
k
i
e
值
,
假
使
为
a
b
c
123
(
2
)
若
读
取
到
P
H
P
S
E
S
S
I
D
这
个
C
O
O
K
I
E
,
创
建
S
E
S
S
I
O
N
变
量
,
并
从
相
应
的
目
录
中
(
可
以
再
p
h
p
.
i
n
i
中
设
置
)
读
取
S
E
S
S
a
b
c
123
(
默
认
是
这
种
命
名
方
式
)
文
件
,
将
字
符
装
在
入
S
E
S
S
I
O
N
变
量
中
;
若
没
有
读
取
到
P
H
P
S
E
S
S
I
D
这
个
C
O
O
K
I
E
,
也
会
创
建
_SESSION超全局变量注册session变量。 (3)当PHP脚本执行结束时,未被销毁的session变量会被自动保存在本地一定路径下的session库中, 这个路径可以通过php.ini文件中的session.save_path指定,下次浏览网页时可以加载使用。 2.session_start()做了哪些初始化工作 (1)读取名为PHPSESSID(如果没有改变默认值)的cookie值,假使为abc123 (2)若读取到PHPSESSID这个COOKIE,创建_SESSION变量,并从相应的目录中(可以再php.ini中设置)读取SESS_abc123(默认是这种命名方式)文件,将字符装在入_SESSION变量中; 若没有读取到PHPSESSID这个COOKIE,也会创建
SESSION超全局变量注册session变量。(3)当PHP脚本执行结束时,未被销毁的session变量会被自动保存在本地一定路径下的session库中,这个路径可以通过php.ini文件中的session.savepath指定,下次浏览网页时可以加载使用。2.sessionstart()做了哪些初始化工作(1)读取名为PHPSESSID(如果没有改变默认值)的cookie值,假使为abc123(2)若读取到PHPSESSID这个COOKIE,创建SESSION变量,并从相应的目录中(可以再php.ini中设置)读取SESSabc123(默认是这种命名方式)文件,将字符装在入SESSION变量中;若没有读取到PHPSESSID这个COOKIE,也会创建SESSION变量,同时创建一个sess_abc321(名称为随机值)的session文件,同时将abc321作为PHPSESSID的cookie值返回给浏览器端。
漏洞分析
此php会将获取到的GET型ctfs变量的值存入到session中。当访问http://www.ctfs-wiki/session.php?ctfs=ctfs 后,会在/var/lib/php/session目录下存储session的值。session的文件名为sess+sessionid,sessionid可以通过开发者模式获取。
所以session的文件名为sess_akp79gfiedh13ho11i6f3sm6s6。到服务器的/var/lib/php/session目录下查看果然存在此文件,内容为:
username|s:4:"ctfs";
[root@c21336db44d2 session]# cat sess_akp79gfiedh13ho11i6f3sm6s6
username|s:4:"ctfs"
漏洞利用
通过上面的分析,可以知道ctfs传入的值会存储到session文件中,如果存在本地文件包含漏洞,就可以通过ctfs写入恶意代码到session文件中,然后通过文件包含漏洞执行此恶意代码getshell。当访问http://www.ctfs-wiki/session.php?ctfs=<?php phpinfo();?>后,会在/var/lib/php/session目录下存储session的值。
[root@6da845537b27 session]# cat sess_83317220159fc31cd7023422f64bea1a
username|s:18:"<?php phpinfo();?>";
攻击者通过phpinfo()信息泄露或者猜测能获取到session存放的位置,文件名称通过开发者模式可获取到,然后通过文件包含的漏洞解析恶意代码getshell。