当前位置:   article > 正文

BUUCTF——[极客大挑战2019]PHP1_[极客大挑战 2019]php 1

[极客大挑战 2019]php 1

相关过程:

通过目录扫描可以知道网站的备份网站在/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。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/464261
推荐阅读
相关标签
  

闽ICP备14008679号