安恒429|web 3 session反序列化

WBOY
풀어 주다: 2016-06-23 13:09:24
원래의
1281명이 탐색했습니다.

之所以单独的把他拿出来呢,是因为之前接触到的反序列化的洞和题目已经挺多了的,包括p总出的三个白帽啊,某ctf的一些题目都涉及到这个方面的东西。

但是呢,在这道题目里找到了一些新的东西,值得自己思考一下

参考了资料 http://drops.wooyun.org/tips/3909

和p总的提示:

session的序列化是指,存储到session文件中的是经过序列化的字符串,而我们能访问到的$_SESSION是已经被解析的变量

首先我们要了解,php在session存储和读取数据时,都会有一个序列化和反序列化的过程。

而反序列化中会调用对象的magic方法,比如__destruct(),__wakeup()等,都是很常见的东西,不予赘述了。

那么这里有一个配置选项 session.serialize_handler

可以用ini_set或者在php.ini中加以设置

有下面几种用于处理序列化的处理器类型

处理器 对应的存储格式

php 键名 + 竖线 + 经过 serialize() 函数反序列处理的值

php_binary 键名的长度对应的 ASCII 字符 + 键名 + 经过 serialize() 函数反序列处理的值

php_serialize

(php>=5.5.4) 经过 serialize() 函数反序列处理的数组

对于php处理器,如果我们先用php_serialize加以序列化,那么对于这样的一个字符串

a:1:{s:4:"test";s:20:"|O:8:"stdClass":0:{}";}
로그인 후 복사

最后会被解释为:键名为 a:1:{s:4:"test";s:20:"的一个对象

而php处理器序列化,则是把$_SESSION的每个键值都 单独拿出来,比如$_SESSION['test']

就是test|序列化的值

而php_serialize则会直接将整个session数组序列化。最后存储的是一整个数组的序列化数值

那么这样就好理解了,如果在处理器session.serialize_handler=php_serialize的情况下

我们构造带有竖线的字符串,在其他处理器为php的地方,就可以反序列化出伪造的对象。

而我们这里明显是需要去操作session的,文章中为了测试使用的是

$_SESSION['ryat'] = $_GET['ryat'];
로그인 후 복사

然而很多时候没有这个条件的,怎么办呢

http://php.net/manual/zh/session.upload-progress.php

php为了提供一个上传进度的数据

$n=ini_get("session.upload_progress.name");

会把它存储在$_SESSION["$n"] 当中。

这样我们构造一个文件上传页,就可以成功写入session了

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!