PHPINFO(jarvisoj)

今天做题的时候做了这一道。。刷新了对反序列化的认识。。

这道题考察了关于session序列化选择器的漏洞。。
参考文章:https://www.jb51.net/article/107101.htm
首先先介绍一下,关于session反序列化的三种机制:

首先在php.ini中关于session的设置:

session.save_path=""       #设置session的储存路径
session.save_handler=""     #设定用户自定义存储函数,如果想使用PHP内置会话存储机制之外的可以使用本函数(数据库等方式)
session.auto_start   boolen    #指定会话模块是否在请求开始时启动一个会话,默认为0不启动
session.serialize_handler   (php | php_serialize | php_binary)     #定义用来序列化/反序列化的处理器名字。默认使用php(重漏洞原因)

下面介绍session三种序列化的机制。。

php #键名+竖线(|)+经过serialize()函数处理过的值
php_serialize #经过serialize()函数处理过的值,会将键名和值当作一个数组序列化
php_binary  #键名的长度对应的ascii字符+键名+经过serialize()函数序列化后的值

好了,接下我们进入题目看一看:
PHPINFO(jarvisoj)
重要的一步ini_set('session.serialize_handler', 'php');,选择session序列化处理器。
然后分析代码得知:如果没有传phpinfo这个参数,那么就显出源码,否则的话就执行phpinfo()–>信息收集
首先先了解一下此漏洞的成因:如果设置的session序列化选择器与默认的不同的话就可能会产生漏洞。

我们先看看一下phpinfo()中的信息吧。

几个关键点:

查看版本,注意:在php 5.5.4以前默认选择的是php,5.5.4之后就是php_serialize,这里面是php_serialize,同时意识到
在index界面的时候,设置选择的是php,因此可能会造成漏洞

PHPINFO(jarvisoj)

搜索document可以看到当前网站的路径

PHPINFO(jarvisoj)

搜索session可以看到session有关内容

PHPINFO(jarvisoj)

还有一个重要的参数session.upload_progress.enabled需要设置为on

PHPINFO(jarvisoj)

接下来我们就需要开始思考了,怎么才可以调用到类OowoO中的eval()函数执行任意代码呢?

1.首先这里面没有任何一个可以进入的入口。我们要利用php反序列化必须要有序列化、反序列化函数啊?
2.可是这里面貌似啥都没有啊???
3.并且我们利用的是session的反序列化漏洞啊?怎么才能改变session呢??

接下来就要放大招了233333

放一个原理图(因为自己也只是大致懂了一点):

PHPINFO(jarvisoj)参考链接:http://www.91ri.org/15925.html
https://chybeta.github.io/2017/07/05/jarvisoj-web-writeup/#PHPINFO

也就是需要上传一个文件,然后将文件名修改为我们的自己设计的序列化后的payload。。。。
讲一下序列化的原理吧:
虽然我们在index.php中声明了选择php序列化选择器,但是这只是影响生成的session,而当session_start(),使用时,php就将session默认文件夹中的session进行反序列化。注意进行反序列化的时候会使用原来默认的序列化处理器。。反言之,只要我们将构造好的session放入session中,在session_start()后,就将session反序列化,就可以产生了漏洞。。

问题是怎么将构造好的session添进去。这个就要遇到这个漏洞了。。

PHPINFO(jarvisoj)

原理就是这个,看的一知半解。。

构造上传界面

PHPINFO(jarvisoj)

随便上传一个文件。进行抓包。

PHPINFO(jarvisoj)

将上述的区域改为我们构造的payload:(注意用php_serialize 的格式)
PHPINFO(jarvisoj)

因为session_start()是在index.php使用的,所以我们也可以用其中的类,因此就可以使用eval()函数了。。

paylaod:

filename="|O:5:\"OowoO\":1:{s:4:\"mdzz\";s:38:\"print_r(scandir(\"/opt/lampp/htdocs\"));\";}"   ##注意将filename双引号里面的引号转义

后面的就差不多都是利用这种构造的。。

其实还想执行命令的。。。但是不行。。。因为。。
PHPINFO(jarvisoj)

禁用了很多的函数。。。