点击上方蓝色字体,关注我们
PHP session序列化及反序列化处理器
在php中存储session时存储的数据结结构是有区别的,正常情况下,session是以键值对的形式存在。
demo这里设置处理方式是php的,它会去存储一个session,开一个标签,session是存储在temp目录里,一个session及它存储位置是怎么判断呢?来看这个phpinfo.php,session发现存储的位置:
然后去访问一个E,传递一个值a=123:
那么它这里就会生成一个session的文件,里面保存了一个session可以看到session的值:
可以肯定是在序列化之后生成的序列,读取session过程中会触发一个反序列化。反序列化的数据来源是session中存在的文件。序列化生成的序列是由session放进去的,反序列化也是一样的,好像并没有什么办法去操纵他。继续往下看。这里我们用的是php的处理方式php_serialize,然后我们再看第2个php_serialize,如果说在这里的时候,我们就对他传入一个session,我这里换成一个2,去传一下,我们再去看session文件,比如a等于123传进去,如果是php的话,它会键名+竖线+经过serialize()函数反序列生成的序列。接下来php_serialize再来传一下,它的session结构不一样了,这个的话刚好一个直接序列化之前的内容,序列化生成的序列直接放在里面,二者会有区别。
如果说序列是一个反序列化,那么在读取群里直接把序列做一个反序列化。如果你是php的处理方式,可以直接读取session的内容,以竖线作为分隔符,把竖线后面的内容拿来做一个反序列化,所以会有这样的一个效果同时也可能会引发配置问题,在这次session初始化设置中设置处理方式,可以知道它是在什么情况下去实现的。配置类似题目特征也是非常明显的,后面我们也会拿一道例题来讲一下,用这个参数去设置php的处理方式。
安全问题如果用php_serialize是直接把整个序列化之后的字符串放在里面的。如果在两个文件中用不同的方式去处理对应的session,那么它就有可能造成一个安全问题。
使用php会生成一个竖线,它就是一个序列那么其实你在这里看到的时候,只要能控制里面的序列,就能让它实现一个反序列化的影响,但是实际上不管任何一种,进去的序列和出来的序列其实都是同一个序列,是没有办法去实现一个控制的。
如果说存在两种方式,就是一次一整套文件中都存在两个文件,这两个文件对session的处理方式是不一样的,那么就有可乘之机。为什么这样说?
可以理解一下,就当存储的时候是php_serialize处理的,在调用php去处理,那么这时候一开始我们去注入的数据就是一个比如说是A等于一个竖线,那么接下来它生成的需求就会变成这样子。
然后再对应到用php去处理时,就会把后面这个东西作为一个序列去读取出来,然后对这个字符串做一个反序列化,这个到时候其实我们就已经实现了可控的序列,不再局限于session生成的格式序列,此时就可以对它实现一个反序列化的攻击。这就是一个session的demo,这个地方,通过php_serialize去传入一个序列。
最初我们先传一个A会生成一个session,session中肯定是存在竖线,这个序列中一定要包含一个竖线,那么对内利用的class是不是就是这个class生成一个反序列化的序列,去定义一个变量,然后去给他的内容去改变一下。
在我们去执行一下,就会有这个序列,我们就把序列给传进去。这个序列的话,我们传进去的时候,一个竖线我们去执行一下,生成一个session,我们就可以看接下来我去对做存取出来的时候,我再去访问,这个地方其实它是有选项配置的。 一道16年的CTF题目这是道反序列化的题目,去访问时会存一个session,以php的方式处理会存在一个竖线(在index中它的处理方式是php),保存的session是存在一个竖线加序列,存入的是serialize的过程。
你会发现像这个地方,我这个地方是这样操作的,但在phpinfo中,它又存在这样一个行为,Session_start这个位置是处理保存session的一个方式,它这个时候是phpserialize,对应过来在phpinfo这个页面中,所谓的php的方式就是所以他直接放了一个序列,那么其实对我们刚才讲的思路就非常简单,如果说你知道bug,你只要对这个页面通过访问页面去生成一个session,访问这个页面触发反序列化实现攻击,但是会有非常多的问题,例如因为session从我的请求中去读取参数保存进去,像现在会发现session都不可控没办法去操纵session,其实这个地方也是一个比较难的地方,但是之前讲文件包含的时候,讲到过一个情形,就是能够显示一个文件上传进度的过程。 phpsession upload progress选上传进度参数默认开启,生成一个部分可控的session,我们这边也是用这种方式去生成一个session,还有一个问题就是这里开启了另外一个参数,方便演示session把它设置成clean up,不会去立马删掉文件上传进度的文件。这个页面当然就不是这个页面了,我去生成的是通过传这个页面,然后放出文件。
先开个bp提到查询试一下,目前是没有文件的。直接传上去之后会生成一个session:
这个就是上传文件中的字段,说明了我们能够去控制session传入参数。
phar反序列化在Blackhat2018有国外的安全研究院提出来的一种新型的攻击方式,主要是在实际中找到几个漏洞案例,但是这个漏洞在2017年的时候就有人提出来利用了。
实现文件包含时的一个利用,对它做一个反序列化,特点就是利用不需要用到unserialize的过程去做一个反序列化,就能够就做一个触发。
首先要有一个phar文件,那就是这段代码去可以生成一个phar的文件。
这边就会看到一个phar这文件拿来其实就是说可以看到它的16进制,你在这边就会看到反序列化之后的就序列化之后生成序列化串。
这串东西在某些特定函数中去传入这个文件的话,它就会触发一个反序列化,这边的话他就给出了一些看起来好像没有无害的函数,examples of so far harmless looking code。
这边最主要是来给大家演示一下它的一个效果。
在官方手册中也提到过phar文件对反序列化的利用,不需要unserialize函数去触发反序列化,但它同样与传统那种序列化的序列可以去反序列化。
戳”阅读原文“,我们一起进步