加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

深入浅析PHP的session反序列化裂痕题目

发布时间:2021-01-18 19:54:57 所属栏目:编程 来源:网络整理
导读:在php.ini中存在三项设置项: 以上的选项就是与PHP中的Session存储和序列话存储有关的选项。 在行使xampp组件安装中,上述的设置项的配置如下: 在上述的设置中,session.serialize_handler是用来配置session的序列话引擎的,除了默认的PHP引擎之外,还存在
副问题[/!--empirenews.page--]

在php.ini中存在三项设置项:

以上的选项就是与PHP中的Session存储和序列话存储有关的选项。

在行使xampp组件安装中,上述的设置项的配置如下:

在上述的设置中,session.serialize_handler是用来配置session的序列话引擎的,除了默认的PHP引擎之外,还存在其他引擎,差异的引擎所对应的session的存储方法不沟通。

php_binary:存储方法是,键名的长度对应的ASCII字符+键名+颠末serialize()函数序列化处理赏罚的值

php:存储方法是,键名+竖线+颠末serialize()函数序列处理赏罚的值

php_serialize(php>5.5.4):存储方法是,颠末serialize()函数序列化处理赏罚的值

在PHP中默认行使的是PHP引擎,假如要修改为其他的引擎,只必要添加代码ini_set('session.serialize_handler','必要配置的引擎');。示例代码如下:

session 的目次在 /var/lib/php/sessions 中

在 php_serialize 引擎下,session文件中存储的数据为:

php 引擎下文件内容为:

php_binary 引擎下文件内容为:

因为name的长度是4,4在ASCII表中对应的就是EOT。按照php_binary的存储法则,最后就是names:6:"spoock";。(溘然发明ASCII的值为4的字符无法在网页上面表现,这个各人自行去查ASCII表吧)

PHP Session中的序列化危害

PHP中的Session的实现是没有的题目,危害首要是因为措施员的Session行使不妥而引起的。

假如在PHP在反序列化存储的$_SESSION数据时行使的引擎和序列化行使的引擎纷歧样,会导致数据无法正确第反序列化。通过全心结构的数据包,就可以绕过措施的验证可能是执行一些体系的要领。譬喻:

php文件如:

会见后获得session文件中的内容如下:

但此时模仿在其他页面行使差异的php引擎来读取时的内容如下:(默认行使php引擎读取session文件)

a; } } // var_dump($_SESSION);

会见该页面输出xx

object(A)#1 (1) { ["a"]=> string(2) "xx" } }

这是由于当行使php引擎的时辰,php引擎会以|作为作为key和value的脱离符,那么就会将 a:1:{s:4:"ryat";s:30:" 作为SESSION的key,将 O:1:"A":1:{s:1:"a";s:2:"xx";} 作为value,然后举办反序列化,最后就会获得A这个类。

这种因为序列话化和反序列化所行使的纷歧样的引擎就是造成PHP Session序列话裂痕的缘故起因。裂痕在加载行使php引擎的页面时session去读session中的内容并反序列化导致裂痕触发,不必要任何输出

GCTF上的一道session反序列化裂痕说明:

index.php中内容为:

代码审计2

在php中,常常会行使序列化操纵来存取数据,可是在序列化的进程中假如处理赏罚不妥会带来一些安详隐患。

query.php 中的内容为:

username == $USERNAME && $this->password == $PASSWORD){ //歉仄 $this->username =='aaaaaaaaaaaaaaaaa' && $this->password == 'bbbbbbbbbbbbbbbbbb'){ return 'key is:{'.$this->token.'}'; } } } class TOPB{ public $obj; public $attr; function __construct(){ $this->attr = null; $this->obj = null; } function __toString(){ $this->obj = unserialize($this->attr); $this->obj->token = $FLAG; if($this->obj->token === $this->obj->ticket){ return (string)$this->obj; } } } class TOPC{ public $obj; public $attr; function __wakeup(){ $this->attr = null; $this->obj = null; } function __destruct(){ echo $this->attr; } } */

思绪如下:

这题中我们结构一个TOPC,在析构的时辰则会挪用echo $this->attr;

将attr赋值为TOPB工具,在echo TOPB的时辰会自动挪用__tostring把戏要领

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读