界面让我想起来之前做过的一个SQL Injection题目,好像也是猫猫在玩毛线。
1
尝试查看响应,直接http://xxx/flag.php
或者http://xxx/index.php
都得不到任何东西。然后再去看看说的话。
“备份”。
|
|
不过如果是类似我这样的人,文件命名就会很随意。
随机排列组合上述“常用”,运气好,一会就有,运气不好可能没有。
所以用扫描工具。开了dirsearch在后台扫描。看见了很多有上述后缀名的文件。
不过扫描有点慢(可能因为开的全扫描),所以扫描的时候在这里打字。现在还没扫描好我打算先去吃晚饭了(bushi)。
2
扫描结束,很多文件,不过可以根据文件大小来判断,dirsearch还贴心标色区别,所以就是那个万紫丛中一点绿的www.zip
。
在原网址输入后会下载一个zip文件,打开,里面重点有flag.php
和'class.php
两个文件(之前就尝试输入文件名但return all blank),用vscode打开,代码审计。(…)
3
dogdogdog
|
|
刘备砸碗GIF
再看
|
|
大概是在讲有个private用户nonono和密码yesyes的设定,但外来输入会被__wakeup()重置为guest
,但如果username是admin,就会返回flag。
于是我就构建了?username=
这样的,发现,不知道要跟在哪一个php后面…
所以找专业人士(等以后学了php审计再来更新)分析一下:
-
include 'flag.php';
:该语句用于包含一个名为 “flag.php” 的文件。这意味着代码中可能存在一个存储着敏感信息(如密钥、密码等)的变量。
-
error_reporting(0);
:该语句禁止显示 PHP 错误报告。这可以防止攻击者通过错误信息来寻找潜在的安全漏洞。
-
class Name
:定义了一个名为Name
的类。
-
private $username = 'nonono';
和private $password = 'yesyes';
:类中的私有成员变量$username
和$password
被初始化为默认值。
-
public function __construct($username, $password)
:该构造函数接受两个参数$username
和$password
,并将它们赋值给对应的成员变量。通过构造函数,实例化对象时可以传入不同的用户名和密码。
-
function __wakeup()
:该魔术方法在反序列化操作时会被调用。在这个例子中,__wakeup()
方法将用户的用户名设置为 “guest”。
-
function __destruct()
:该魔术方法在对象销毁时会被调用。在这段代码中,析构函数判断密码是否为 100。如果不是,则输出一条警告信息,并显示用户的用户名和密码(可能是攻击者恶意构造的)。如果密码为 100 并且用户名为 “admin”,则输出存储在$flag
变量中的敏感信息;否则输出友好的信息,并结束程序。
catch me if you can
文件里面还有一个index.php
,也看了看,
|
|
-
include 'class.php';
:该代码行将引入名为 “class.php” 的 PHP 文件。include
用于在 PHP 中包含指定的文件,以便在当前脚本中使用该文件中定义的类、函数和变量。
-
$select = $_GET['select'];
:该代码行将从 GET 请求中获取名为 “select” 的参数值,并将其赋给变量$select
。GET 请求的参数通常是通过 URL 的查询字符串(query string)传递的,例如http://example.com?select=value
。
-
$res=unserialize(@$select);
:该代码行将尝试对$select
变量进行反序列化操作,并将结果赋给变量$res
。unserialize()
是一个 PHP 函数,用于将字符串转换回原始的 PHP 值(对象、数组等)。@
符号用于抑制可能出现的错误或警告信息。
在这个过程中,它包含了一个潜在的安全风险。由于它使用了 unserialize()
函数来反序列化用户输入的数据,而用户可以通过构造恶意数据来执行任意的 PHP 代码。
反序列化
具体的,我们下次再说,因为实在还没学。