2019极客大挑战 PHP

界面让我想起来之前做过的一个SQL Injection题目,好像也是猫猫在玩毛线。

1

尝试查看响应,直接http://xxx/flag.php或者http://xxx/index.php都得不到任何东西。然后再去看看说的话。

“备份”。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10

常用备份格式有

tar.gz,zip,rar,tar

  

常见的网站源码备份文件名:

web,website,backup,back,www,wwwroot,temp

不过如果是类似我这样的人,文件命名就会很随意。

随机排列组合上述“常用”,运气好,一会就有,运气不好可能没有。
所以用扫描工具。开了dirsearch在后台扫描。看见了很多有上述后缀名的文件。
不过扫描有点慢(可能因为开的全扫描),所以扫描的时候在这里打字。现在还没扫描好我打算先去吃晚饭了(bushi)。

2

扫描结束,很多文件,不过可以根据文件大小来判断,dirsearch还贴心标色区别,所以就是那个万紫丛中一点绿的www.zip

在原网址输入后会下载一个zip文件,打开,里面重点有flag.php'class.php两个文件(之前就尝试输入文件名但return all blank),用vscode打开,代码审计。(…)

3

dogdogdog

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12

//flag.php

  

<?php

$flag = 'Syc{dog_dog_dog_dog}';

?>

  

刘备砸碗GIF

再看

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80

//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();

  

        }

    }

}

?>

大概是在讲有个private用户nonono和密码yesyes的设定,但外来输入会被__wakeup()重置为guest,但如果username是admin,就会返回flag。

于是我就构建了?username=这样的,发现,不知道要跟在哪一个php后面…

所以找专业人士(等以后学了php审计再来更新)分析一下:

    1. include 'flag.php';:该语句用于包含一个名为 “flag.php” 的文件。这意味着代码中可能存在一个存储着敏感信息(如密钥、密码等)的变量。
    1. error_reporting(0);:该语句禁止显示 PHP 错误报告。这可以防止攻击者通过错误信息来寻找潜在的安全漏洞。
    1. class Name:定义了一个名为 Name 的类。
    1. private $username = 'nonono';private $password = 'yesyes';:类中的私有成员变量 $username$password 被初始化为默认值。
    1. public function __construct($username, $password):该构造函数接受两个参数 $username$password,并将它们赋值给对应的成员变量。通过构造函数,实例化对象时可以传入不同的用户名和密码。
    1. function __wakeup():该魔术方法在反序列化操作时会被调用。在这个例子中,__wakeup() 方法将用户的用户名设置为 “guest”。
    1. function __destruct():该魔术方法在对象销毁时会被调用。在这段代码中,析构函数判断密码是否为 100。如果不是,则输出一条警告信息,并显示用户的用户名和密码(可能是攻击者恶意构造的)。如果密码为 100 并且用户名为 “admin”,则输出存储在 $flag 变量中的敏感信息;否则输出友好的信息,并结束程序。

catch me if you can

文件里面还有一个index.php,也看了看,

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12

//其中一段

<?php

    include 'class.php';

    $select = $_GET['select'];

    $res=unserialize(@$select);

    ?>
    1. include 'class.php';:该代码行将引入名为 “class.php” 的 PHP 文件。include 用于在 PHP 中包含指定的文件,以便在当前脚本中使用该文件中定义的类、函数和变量。
    1. $select = $_GET['select'];:该代码行将从 GET 请求中获取名为 “select” 的参数值,并将其赋给变量 $select。GET 请求的参数通常是通过 URL 的查询字符串(query string)传递的,例如 http://example.com?select=value
    1. $res=unserialize(@$select);:该代码行将尝试对 $select 变量进行反序列化操作,并将结果赋给变量 $resunserialize() 是一个 PHP 函数,用于将字符串转换回原始的 PHP 值(对象、数组等)。@ 符号用于抑制可能出现的错误或警告信息。

在这个过程中,它包含了一个潜在的安全风险。由于它使用了 unserialize() 函数来反序列化用户输入的数据,而用户可以通过构造恶意数据来执行任意的 PHP 代码。

反序列化

参考

具体的,我们下次再说,因为实在还没学。

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy