php原生类,PHP原生类反序列化

在做BJDCTF中的题目XSS之光的时候遇到了PHP原生类的反序列化,以前没有了解过,现在来学习一波。

基础知识

首先还是来回顾一下序列化中的魔术方法,下面也将以此进行分类来进行研究。

当对象被创建的时候调用:__construct

当对象被销毁的时候调用:__destruct

当对象被当作一个字符串使用时候调用(不仅仅是echo的时候,比如file_exists()判断也会触发):__toString

序列化对象之前就调用此方法(其返回需要是一个数组):__sleep

反序列化恢复对象之前就调用此方法:__wakeup

当调用对象中不存在的方法会自动调用此方法:__call

看一下当前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下载源码后只有简单的两行。

20200403005821025063.png

这里要利用魔法方法 __toString来实现xss,而__toString中Error 和 Exception类 会造成XSS  但是Error只适于php7下造成xss,Exception php5和php7都适用

用burp抓包发现是php5.6的,因此是Exception。

20200403005821149078.png

于是先用下面的exp看看有没有弹窗。

exp:

$a = unserialize($_GET[‘lemon‘]);

echo $a;

20200403005821319966.png

然后本题的exp:

$a = new Exception("");

echo urlencode(serialize($a));

20200403005821363908.png

flag就在cookie和url上面

在这里学下xss相关知识:

#实现恶意跳转

参考博客:

感谢大佬!!!菜鸡受教了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值