原创稿件征集
邮箱:edu@antvsion.com
QQ:3200599554
黑客与极客相关,互联网安全领域里
的热点话题
漏洞、技术相关的调查或分析
稿件通过并发布还能收获
200-800元不等的稿酬
在前些时间,国赛上再一次遇到了服务器本地文件包含session
的漏洞,这是个老生常谈的东西了,但还是常常可以碰到,而我们想利用session
来getshell
往往还需要一些特殊的方法,借此机会,研究一番
基础知识
PHP SESSION的存储
SESSION会话存储方式
在Java
中,用户的session是存储在内存中的,而在PHP
中,则是将session以文件的形式存储在服务器某个文件中,我们可以在php.ini
里面设置session
的存储位置session.save_path
在很多时候服务器都是按照默认设置来运行的,假如我们发现了一个没有安全措施的session
文件包含漏洞时,我们就可以尝试利用默认的会话存放路径去包含getshell
,因此总结常见的php-session
的默认存储位置是很有必要的
默认路径
/var/lib/php/sess_PHPSESSID
/var/lib/php/sessions/sess_PHPSESSID
/tmp/sess_PHPSESSID
/tmp/sessions/sess_PHPSESSID
session
文件的存储路径是分为两种情况的
一是没有权限,默认存储在/var/lib/php/sessions/
目录下,文件名为sess_[phpsessid]
,而phpsessid
在发送的请求的cookie
字段中可以看到(一般在利用漏洞时我们自己设置phpsessid
)
二是phpmyadmin
,这时的session
文件存储在/tmp
目录下,需要在php.ini
里把session.auto_start
置为1,把session.save_path
目录设置为/tmp
与 SESSION 有关的几个 PHP 选项
session.serialize_handler
一是
php
,服务器在配置文件或代码里面没有对session进行配置的话,PHP默认的会话处理方式就是session.serialize_handler=php
这种模式机制,这种模式只对用户名的内容进行了序列化存储,没有对变量名进行序列化,我们可以看作是服务器对用户会话信息的半序列化存储二是
session.serialize_handler=php_serialize
,这种处理模式在PHP 5.5
后开始启用,与上一种类似,但无论是用户名的内容还是变量名等都进行了系列化,可以看作是服务器对用户会话信息的全序列化存储三是
php_binary
,其存储方式是,键名的长度对应的ASCII字符+键名+经过serialize()函数序列化处理的值
常见就是以上三种,还有一些其他的比如session.serialize_handler = wddx
等这里就不展开赘述了
对比上面session.serialize_handler
的两种处理模式,可以看到他们在session处理上的差异,但我们编写代码不规范时对session的处理采用了多种情况,那么在攻击者可以利用的情况下,很可能会造成session反序列化漏洞。
session.auto_start
默认是off
状态,如果开启这个选项,则PHP在接收请求的时候会自动初始化Session,不再需要执行session_start()
。
session.use_strict
默认是0
,此时用户是可以自己定义Session ID
的。比如,我们在Cookie里设置PHPSESSID=flag,PHP将会在服务器上创建一个文件:/tmp/sess_flag
。即使此时用户没有初始化Session,PHP也会自动初始化Session,并产生一个键值.
因为sessid
的可控,我们很容易借此达到我们getshell
的目的,但是我们还存在session.upload_progress.cleanup
session.upload_progress.cleanup
默认开启,一旦读取了所有POST数据,它就会清除进度信息,所以我们一般都要通过条件竞争来进行文件上传
session.upload_progress.enabled
默认情况下是开启的,但也当该配置开启时,我们今天要讲的重点才得以引出
Session Upload Progress
Session Upload Progress
即 Session 上传进度,是php>=5.4
后开始添加的一个特性。官网对他的描述是当 session.upload_progress.enabled
选项开启时(默认开启),PHP 能够在每一个文件上传时 监测上传进度。这个信息对上传请求自身并没有什么帮助,但在文件上传时应用可以发送一个POST
请求到终端(例如通过XHR)来检查这个状态。
当一个上传在处理中,同时POST一个与INI中设置的session.upload_progress.name
同名变量时,上传进度可以在 $_SESSION
中获得。当PHP检测到这种POST请求时,它会在 $_SESSION
中添加一组数据,索引是 session.upload_progress.prefix
与 session.upload_progress.name
连接在一起的值。
下面给出一个php官方文档的一个进度数组的结构的样例:
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?


微信扫码登录