$_session无法存储变量怎么回事_PHP-Session利用总结
$_session无法存储变量怎么回事_PHP-Session利用总结

原创: 合天智汇
原创投稿活动:重金悬赏 | 合天原创投稿等你来
0x00 前言
最近刷题碰到好几个关于php代码审计中相关的问题,之前没有做过系统的总结,在此补一下锅。
0x01 基础知识
这里主要讲讲传统的PHP中的“服务端”。至于什么是服务端,什么是客户端,可以看看P神的**客户端 导致的安全问题
概念:在计算机中,尤其是在网络应用中,称为“会话控制”。 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 对象。当会话过期或被放弃后,服务器将终止该会话。
机制:内容一般以文件的形式存储于服务器中,而本地浏览器会存储一个与服务器中文件对应的值,存储的是键值为“”的值,用户在访问web应用时,每次跳转发生http请求时,会自动把这个存储的值发送过去,因此web应用的所有页面都可以获取到这个值,也就可以通过获取服务器中存储的值,当用户关闭浏览器后,存储的自动清除,一般服务器存储的文件也会在30分钟后自动清除。
比如在wamp环境下,index.php如下:

首先理解一下()
当会话自动开始或者通过 () 手动开始的时候, PHP 内部会依据客户端传来的来获取现有的对应的会话数据(即文件), PHP 会自动反序列化文件的内容,并将之填充到 $ 超级全局变量中。如果不存在对应的会话数据php session id 变化,则创建名为 SID(客户端传来的)的文件。如果客户端未发送,则创建一个由32个字母组成的,并返回set-。
可以看到请求中对应的:
在服务器端,即/wamp/tmp下我们就可以发现一个生成的记录的文件,因为也没有记录什么会话信息,因此该文件是一个空文件。

补充一下关于php-相关配置的说明
在php.ini中对存在许多配置php session id 变化,这里我们通过来说明几个重要的点。

说明如下:
session.save_path="" --设置session的存储路径session.save_handler="" --设定用户自定义存储函数,如果想使用PHP内置会话存储机制之外的可以使用本函数(数据库等方式),默认files以文件存储session.auto_start boolen --指定会话模块是否在请求开始时启动一个会话,默认为0不启动session.serialize_handler string --定义用来序列化/
常见的php-存放位置
/var/lib/php5//var/lib/php7//var/lib/php//tmp//tmp//
0x02 可能导致的攻击面
0x03 序列化攻击

要了解序列化攻击,先来了解一下机制中对序列化是如何处理的。
在php中存在三种序列化处理引擎
.对应存储格式php键名 + 竖线 + 经过()函数序列化处理的值键名的长度对应的ASCII字符 + 键名 + 经过()函数序列化处理的值( php >= 5.5.4 )经过()函数序列化处理的数组
本地测试如下:

文件内容分别对应结果为
test|s:7:"CoCo1er";tests:7:"CoCo1er";a:1:{s:4:"test";s:7:"CoCo1er";}
攻击利用原理
千万条,原理第一条。
(这里补充说一点$_session无法存储变量怎么回事_PHP-Session利用总结,PHP中的的实现是没有的问题,危害主要是由于程序员的使用不当而引起的。如下)
使用不同引擎来处理文件
如果在PHP在反序列化存储的$数据时使用的引擎和序列化使用的引擎不一样,会导致数据无法正确第反序列化。通过精心构造的数据包,就可以绕过程序的验证或者是执行一些系统的方法。例如:
在这么一种情况下:
假如我们使用引擎时进行数据存储时的序列化,可以得到内容
$_SESSION[‘key’] = ‘Boby’;a:1:{s:3:”key”;s:4:”Boby”;}
这时我们的解析采用了另一种引擎:php
思考一下这时会发生什么情况?(php引擎中以竖线来分隔键和值)
如果像上面我们的换一下,传入内容以及得到的存储内容如下:
$_SESSION['key'] = '|O:4:"User":0:{}';a:1:{s:3:"key";s:16:"|O:4:"User":0:{}";}
这时候a:1:{s:3:”key”;s:16:”被当作了key,
而后续的O:4:”User”:0:{}”;}被当作了value从而被反序列化。这里可能有人会问了,为什么会被反序列化?
看看官方文档

这里可能还会有人问?那串value不符合”正常”的被反序列化的字符串规则。这个也不用担心,这里提到一个的特性,之前也做题也遇到过。在执行的时候,如果字符串前面满足了可被反序列化的规则即后续的不规则字符会被忽略。
如果不太好理解不如直接来看一个在线测试用例:

总结一下,在php以引擎生成,然而又以php引擎来解析时,我们通过传入类似$
‘name’

= |序列化内容 这种形式的即有可能触发反序列化漏洞。当然这里只是提到了能够找到反序列化利用的点,至于能不能真正触发反序列化漏洞还需要结合当前环境以及一些魔术函数中是否存在可利用点。这就涉及到php反序列化漏洞的利用知识点了,这里也就不详细讲了。关于反序列化攻击的复杂利用方式,可以参考中的’s 一题。
没有$变量赋值
从上面的情况中我们可以发现我们对的赋值可控。那如果代码中不存在对$变量赋值的情况下如何利用呢?来看下面一个点。
php还存在一个机制,即自动在$中创建一个键值对,值中刚好存在用户可控的部分。
写入的方式主要是利用PHP中 来进行设置,具体为,在上传文件时,如果POST一个名为的变量,就可以将的值赋值到中。
//上传表单
既然filename字段能够写入session中那么就满足了session可控条件,后续的利用条件同上面所述的情景一致,两种不同引擎先后作用导致了恶意的序列化字符串被解析。
0x04 文件包含
这个也是一个比较旧的知识点了,其实不仅是文件包含,仔细想想php session id 变化,理论上只要能够在文件中写入php代码,再被包含进来不都可以实现嘛?只不过在这里我们的可控点是文件,如果能向其中写入php代码,也是可以实现文件包含漏洞利用的。
作为文件包含的利用这里就不展示了,网上关于这个的基础资料早就烂大街了。
值得一提的是,往往现在的CTF出题不会仅限于文件包含这一个点来出题,而是利用诸如+lfi的形式来入题获取源码等。而且可能加入来限制路径,此时就需要熟悉了解的机制,通过函数来改变save路径来利用。这个思路是在XCTF Final中出现的一题中的考点。感兴趣的同学可以去找到环境复现一波。
0x05 伪造用户登录
前几天正好3CTF出了一个这个考点,这里以那个题目来说明一下利用方式。(由于没有提供复现环境$_session无法存储变量怎么回事_PHP-Session利用总结,此处也只能限于“纸上谈兵”,希望大家能够理解一下利用原理即可。)
**利用前提:**可控;知道存储格式。
这里的考题是多个攻击面的组合。题面index.php下提示要以admin登录。
0x06 逻辑漏洞
很遗憾这个点也没有可以复现的环境。(官方买断…)这个是上两周unctf中出现的一道web题考点。这个逻辑漏洞处在重置密码处。过程大致如下。
密码重置分为三个步骤。
这里存在的逻辑漏洞在于第一个页面的填写用户名处,猜测后台有设置。类似:
$
‘name’
= $_POST
'name'
利用方式:重置admin密码。
这里逻辑漏洞产生的原因在于对填写验证码后没有对相关用户绑定做记录,在最后一步重置密码时没有对的可靠性进行检查就直接执行了功能。而我们都知道存储在服务器端,因此我们再开一个页面即可完成对单一文件内容的修改(保证在同一个下)。
0x07 总结
这里仅仅是记录了自己关于PHP的机制相关的学习,举的都是自己最近在CTF题中接触到的点,但关于的利用点怎么可能只有这几个?遇到了再补充学习吧。限于篇幅没有展开讲拓展利用,但是说白了,拓展利用就是多个复杂知识点的综合。我认为只有把原理性的问题搞清楚了才有可能去理解复杂的组合攻击。另外如果文中有什么理解表达错误的地方还望师傅们指正。
声明:笔者初衷用于分享与普及网络知识,若读者因此作出任何危害网络安全行为后果自负,与合天智汇及原作者无关!
1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299
资源库 - 资源分享下载网 » $_session无法存储变量怎么回事_PHP-Session利用总结
常见问题FAQ
- 关于资源售价和售后服务的说明?
- 代码有没有售后服务和技术支持?
- 有没有搭建服务?
- 链接地址失效了怎么办?
- 关于解压密码

