一、漏洞原理简介:
当php.ini配置文件中设置的"session.serialize_handler",与php后端页面中的"session.serialize_handler",设置不一致时,就有可能造成反序列化漏洞
例如:
php.ini配置文件中设置的"session.serialize_handler"为php_serialize,而在php后端程序中编写了如下代码进行设置:
ini_set('session.serialize_handler', 'php');
二、session反序列化漏洞实例
我们就由一题cft题来讲解session反序列化漏洞
题目地址:
http://web.jarvisoj.com:32784/index.php
源码分析:
根据源码可以得知通过GET方式传入phpinfo的值,当phpinfo有值就会实例化OowoO类,当类被实例化时会自动调用__construce()构造方法,在构造方法中对mdzz属性进行了赋值为phpinfo(),而当对象被销毁时会自动调用__destruct()方法,在此方法中利用eval()函数将字符串作为代码执行,所以会执行输出phpinfo相关信息。
从phpinfo中可以看到session.serialize_handler默认是php_serialize,而题目使用的是php,反序列化和序列化使用的处理器不同,由于格式的原因会导致数据无法正确反序列化,那么就可以通过构造伪造任意数据进行反序列化漏洞利用
因为题目中没有能操作$_SESSION的地方,所以可以利用php的upload_progress机制:
所以利用的思路为:
需要先构造上传文件的表单将请求提交到index.php中,然后表单中通过POST传入一个与session.upload_process.name相同的变量名,后端会自动将POST的这个同名变量作为键进行序列化然后存储到session文件中,下次请求就会自动反序列化session文件,从中取出这个键,触发payload
1、构造如下表单:
2、然后访问此表单,随便上传文件后利用burp抓包:
3、然后我们可以构造序列化payload:
修改mdzz属性的是为payload即可,由于题目环境开启了disable_funtions,所以这里利用如下函数进行列目录:
session_start();
class OowoO
{ public $mdzz="print_r(scandir(dirname(__FILE__)));";
}
$obj = new OowoO();
echo serialize($obj);
执行并获取序列化后的内容:
为防止双引号被转义,在双引号前加上反斜杠:
|O:5:"OowoO":1:{s:4:"mdzz";s:36:"print_r(scandir(dirname(__FILE__)));";}
除此之外还要加上" | ",因为php处理器的存储格式如下:
然后将序列化的内容替换上传文件请求包中的filename字段,发包后可以看到当前目录内容:
目录已经被列出来了,接下来就是找flag,在目录中发现一个疑似flag文件的命名,所以我们可以通过获取index.php文件的绝对路径,从而获取相同目录下flag文件的绝对路径,从而读取其中flag的内容:
通过网站根目录可以得出绝对路径就是:
/opt/lampp/htdocs/Here_1s_7he_fl4g_buT_You_Cannot_see.php
然后可以通过file_get_contents()获取flag文件内容:
|O:5:"OowoO":1:{s:4:"mdzz";s:88:"print_r(file_get_contents("/opt/lampp/htdocs/Here_1s_7he_fl4g_buT_You_Cannot_see.php"));";}
点个赞和在看吧,欢迎转发!
相关推荐: 【红蓝对抗】内网不出网机器上线CobaltStrike
场景提出已渗透至内网,获取到DMZ区出网机器CS权限发现内网不出网(此时又分为两种情况:1、内网和DMZ区互通;2、DMZ可通内网但内网不通DMZ),根据以上叙述可以简单搭建测试环境。给出简单拓扑:C2服务器:123.56.108.135跳板机(双网卡):19…
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论