赞
踩
相关过程:
通过目录扫描可以知道网站的备份网站在/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";}
相关知识点:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。