BUUCTF——[极客大挑战2019]PHP1

文章讲述了如何通过PHP反序列化过程中的漏洞利用,利用CVE-2016-7124绕过`__wakeup()`函数,通过私有变量的URL编码技巧获取flag。详细讲解了涉及的知识点,如私有属性的序列化处理和绕过策略。
摘要由CSDN通过智能技术生成

相关过程:

通过目录扫描可以知道网站的备份网站在/www.zip里,即存在网站源码泄露

毫无疑问,这道题考的是PHP反序列化

经过代码审计之后,就是需要通过select参数名来传递一个序列化的查询参数,并且username对应的值为admin,password对应的值为100。但在unserialize成功后会调用__wakeup()将username对应的值变为guest从而使我们无法通过__destruct()拿到flag。那么关键就在于对__wakeup()方法的绕过,这里可以利用CVE-2016-7124。首先我们先获得这个Name对象的序列化字符串:

而又因为:

这里的$username和$password属性是通过private修饰的,即它们是私有变量,而私有变量在被序列化后,在它的类名和字段名(属性名)前面是存在空字符的(url编码为%00),而若通过echo将其打印出来则空字符会被过滤掉,但是在属性名长度字段上还是会将空字符也计算在内,所以这里我们需要手动将空字符加上去,修改后的payloa如下:

O:4:"Name":2:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}

然后就是绕过__wakeup()函数,由CVE-2016-7124可知当反序列化中的属性个数大于实际类中的属性个数时__wakeup()将被绕过,最终payload如下:

O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}

相关知识点:

  1. 通过private定义的属性在被序列化后在类名和属性名前面会存在空字符
  2. PHP中的urldecode()函数会将%00解码成空字符而不会将其直接过滤掉,同理urlencode()也可以识别字符串中的空字符并将其编码为%00。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

&_@

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

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

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

打赏作者

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

抵扣说明:

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

余额充值