ctf通关录-Web_php_unserialize
打开题目所在的网页:(做ctf题时最喜欢有源码了)
简单分析一下
首先一个Demo类,类里面定义了私有属性file值,然后构造函数把值赋值给当前的对象的,然后析构函数会执行highlight_file这个函数,这个函数就是打印输出指定文件的代码,然后还有个__wakeup方法,会被当前对象file属性重新赋值成index.html
然后就是GET接受传递进来的Var参数值,再base编码,然后再正则匹配。这里匹配 O:数字 C:数字这类都给你打印STOPhacking,然后没有匹配到就会反序列化
逻辑大概就这样的:很简单!
说一下在这个类中反序列化中方法执行的顺序吧,首先构造函数=》__wakeup函数=>析构函数
其实反序列化其实别没有那么难,你得了解原理,然后构造exp生成poc才会理所当然!
先看看我的exp吧
<?php
class Demo {
private $file = 'fl4g.php';
}
$ctf = new Demo();
$b = serialize($ctf);
//string(49) "O:4:"Demo":1:{s:10:"Demofile";s:8:"fl4g.php";}"
$b = str_replace('O:4', 'O:+4',$b);//绕过preg_match
$b = str_replace(':1:', ':2:',$b);//绕过wakeup
echo base64_encode($b)
?>
网上很多师傅会把整个类写进去,然后构建对象,然后反序列化,其实构造exp时,类中的方法时多余的,因为序列化并不会把方法也存储进去,只会存储类的属性和值,所有只需要写上属性就可以
然后重点来了,反序列漏洞的实质,讲讲在下对此漏洞的理解
我们看一下序列化的字符串O:4:“Demo”:1:{s:10:“Demofile”;s:8:“fl4g.php”;}
类名:Demo 属性:Demofile 值:flag.php
当服务器端接受到这个字符串然后反序列时就会检查,会发现是Demo这个类,那么服务器就看自己的类有没有Demo这个类,刚好,有,然后他就会以自己Demo的方法类来反序列化。
这里就是漏洞的根本所在,服务器会傻乎乎的把自己的类来给攻击者用,攻击者也就利用服务器中的类来达到目的
所有我们也就是利用这点来执行某些特定的攻击,这就是我的理解,我觉得比网上的那些要易懂一些。
那么怎么达到攻击目的?
控制类中方法的执行流程
就拿此次题目来说,我们构建好了序列化的字符串传入进去,然后反序列化。
构造函数=》__wakeup函数=>析构函数 然后执行结果你会发现还是index.html这个网页
因为__wakeup这个方法执行了,把对象中的file属性值又变回index.html
所有我们要想法跳过这个方法,怎么跳过嘞
SugarCRM v6.5.23 PHP反序列化 对象注入漏洞 这个漏洞会帮助我们跳过__wakeup方法
当序列化字符串中的属性个数大于实际类属性的个数,在反序列化时就会跳过__wakeup方法
还有个问题就是怎么绕过正则匹配?
因为正则匹配这样的字符
O:数字
这写死了,也给我们提供绕过的可能。0:+4这样就不会被匹配了,也不影响反序列
最好把序列化的字符串base64编码一下就好
然后顺利拿到Flag
如有不对,请指出!