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()函数序列化后的值
好了,接下我们进入题目看一看:
重要的一步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,因此可能会造成漏洞
搜索document可以看到当前网站的路径
搜索session可以看到session有关内容
还有一个重要的参数session.upload_progress.enabled需要设置为on
接下来我们就需要开始思考了,怎么才可以调用到类OowoO中的eval()函数执行任意代码呢?
1.首先这里面没有任何一个可以进入的入口。我们要利用php反序列化必须要有序列化、反序列化函数啊?
2.可是这里面貌似啥都没有啊???
3.并且我们利用的是session的反序列化漏洞啊?怎么才能改变session呢??
接下来就要放大招了233333
放一个原理图(因为自己也只是大致懂了一点):
参考链接: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添进去。这个就要遇到这个漏洞了。。
原理就是这个,看的一知半解。。
构造上传界面
随便上传一个文件。进行抓包。
将上述的区域改为我们构造的payload:(注意用php_serialize 的格式)
因为session_start()是在index.php使用的,所以我们也可以用其中的类,因此就可以使用eval()函数了。。
paylaod:
filename="|O:5:\"OowoO\":1:{s:4:\"mdzz\";s:38:\"print_r(scandir(\"/opt/lampp/htdocs\"));\";}" ##注意将filename双引号里面的引号转义
后面的就差不多都是利用这种构造的。。
其实还想执行命令的。。。但是不行。。。因为。。
禁用了很多的函数。。。