这道题有点东西网页一段计算框,只有加和减数字,但是永远到大不了20,页面也没啥特别的,准备看源码,但是打不开,我以为是环境坏掉了,看wp别人也这样,只不过大佬的开发者工具可以打开,我的就不行
最后试了一下,你要么就在网页右上角更多工具里面手动打开,要么就另外打开一个网页,然后先打开开发者工具再加载题目url
在代码此处有一段src标签,好像是一个JavaScript的代码,但是利于工具看的时候,页面并没有对应回显,看起来是个路径,可以访问一下
js看不懂,但是在最后又一段base64加密的字符串,我还以为flag就拿到了
解密后才发现依旧是一个文件,应该也可以访问 ,保险起见我还是去提交了一下,果然是错误的哈哈
代码审计
访问后是一段php代码
1. 第一行代码`error_reporting(0);`用于禁止错误报告。
2. 然后,通过`include("flag.php")`包含了一个名为`flag.php`的文件。
3. 接下来,定义了一个名为`nss`的类,其中有一个名为`ctf()`的静态方法。包含了hint2.php
4. 在接下来的代码中,通过`isset($_GET['p'])`检查`$_GET['p']`是否存在。如果存在,就进入下一层判断。
5. 在第6行代码中,使用`preg_match()`函数对`$_GET['p']`进行正则匹配,判断其是否含有字母`n`或`c`。如果匹配成功,就输出`"no"`并结束脚本的执行。
6. 在第7行代码中,使用了`call_user_func()`函数,根据`$_GET['p']`的值调用对应的函数。`call_user_func()`函数用于调用一个回调函数。这里回调函数的名称由`$_GET['p']`指定。
hint2.php是可以直接访问的,但是完全看不懂有啥关联
一开始想的是直接用命令执行,但是不行,后来查看了wp,才得知我们要利用的东西就是nss类,一开始我看直接就可以访问hint2.php我还以为就没他啥事儿了呢,
这里还要学习一个新的运算符 ::双冒号运算符
我们可以直接利用双冒号运算符去访问类中的方法,因为正则表达式中匹配到了n和c,但是用到的修饰符是/m多文本匹配,所以我们可以采用大小写看能否绕过,所以构造payload
得到hint2.php文件的数据,根据提示修改payload,访问后看源码得到flag
::双冒号运算符
在PHP中,::是一个双冒号运算符,也被称为范围解析操作符或静态访问操作符。它用于访问类中的静态属性、静态方法和常量,或调用父类的静态方法。
在类名后面使用`::`,可以直接访问类的静态成员或调用静态方法,而无需创建类的实例。这使得我们无需实例化一个类就可以访问和操作类级别的成员。
1. 访问静态属性:
class MyClass {
public static $myStaticProperty = 10;
}
echo MyClass::$myStaticProperty; // 输出 10