if(!preg_match("/flag/i", $c)){ eval($c); }
时间: 2024-04-19 09:24:51 浏览: 287
这段代码的作用是,首先使用正则表达式检查变量 `$c` 的值中是否包字符串 "flag"(不区分大小)。如果 `$c` 中不包含 "",则执行 `eval($c)`。`preg_match()` 函数用于进行正则表达式匹配。在这里,使用了 `/flag/i` 作为正则表达式模式,其中 `i` 表示不区分大小写。如果 `$c` 的值中包含字符串 "flag",`preg_match()` 返回真(true),否则返回假(false)。当 `preg_match()` 的返回值为假时,即 `$c` 中不包含 "flag",则条件为真,进入条件语句块。
在条件语句块中,使用 `eval()` 函数执行变量 `$c` 中的代码。`eval()` 函数将 `$c` 中的字符串作为 PHP 代码进行解析和执行。这意味着,如果变量 `$c` 中包含有效的 PHP 代码,将会被执行。
需要注意的是,使用 `eval()` 函数执行动态代码存在安全风险,因为它可以执行任意的 PHP 代码。建议谨慎使用,并确保 `$c` 的来源可信,以防止代码注入等安全问题。
相关问题
有一道题目如下:长度不大于13,且只能使用$和_,获取其flag:<?php error_reporting(0); highlight_file(FILE); if (isset($_GET['debug'])) { // disable function phpinfo(); exit; } function count_string_char($str) { $arr = []; foreach (str_split($str) as $value) { if (!in_array($value, $arr)) { array_push($arr, $value); } } return sizeof($arr); } if (isset($_POST['cmd']) && is_string($_POST['cmd'])) { $cmd = $_POST['cmd']; $c = count_string_char($cmd); if ($c > 13) { die("$c too long"); } if ( preg_match('/[a-z0-9]|<|>|?|[|]|*|@|||^|~|&|\s/i', $cmd) ) { die("nonono"); } eval( "print($cmd);" ); } else { exit(); }
这是一道 PHP 命令注入的题目。通过注入命令,可以绕过代码中的限制,并最终获取 flag。
首先,我们来分析代码。这段代码开启了 PHP 的错误报告并输出当前文件的源代码。然后,如果 URL 中带有 debug 参数,就会禁用 phpinfo 函数并退出。
接下来是一个 count_string_char 函数,它的作用是返回一个字符串中不同字符的个数。在主函数中,如果接收到了 POST 请求中的 cmd 参数,就会通过 preg_match 函数判断该参数是否符合要求,即只包含 $ 和 _ 字符,并且长度不大于 13。如果符合要求,则会执行 eval 函数并传入该参数。
那么,我们可以尝试构造一个恶意的命令来获取 flag。首先,我们需要绕过长度限制。可以利用多个 $ 和 _ 字符组合成一个长的变量名,例如:
```
$$$$$$$$$$$$_flag
```
接下来,我们尝试注入一个命令来读取 flag 文件。我们可以使用 file_get_contents 函数来读取文件内容,如下所示:
```
file_get_contents('flag.php');
```
将以上两个命令结合起来,构造出以下的 payload:
```
$$$$$$$$$$$$_flag = file_get_contents('flag.php');
```
将该 payload 发送到 POST 请求中的 cmd 参数,即可成功获取 flag。
注意:在实际环境中,绝不能将 eval 函数用于接收用户输入的命令。这是非常危险的行为,可能会导致代码执行任意命令的漏洞。
这是一道CTF题 ,请仔细阅读以下php代码,设计一种攻击方式获取其flag,<?php error_reporting(0); highlight_file(__FILE__); if (isset($_GET['debug'])) { // disable function phpinfo(); exit; } function count_string_char($str) { $arr = []; foreach (str_split($str) as $value) { if (!in_array($value, $arr)) { array_push($arr, $value); } } return sizeof($arr); } if (isset($_POST['cmd']) && is_string($_POST['cmd'])) { $cmd = $_POST['cmd']; $c = count_string_char($cmd); if ($c > 13) { die("$c too long"); } if ( preg_match('/[a-z0-9]|<|>|\\?|\\[|\\]|\\*|@|\\||\\^|~|&|\s/i', $cmd) ) { die("nonono"); } eval( "print($cmd);" ); } else { exit(); }
该 PHP 代码存在一个命令注入漏洞,攻击者可以通过该漏洞获取 flag。
攻击方式:
1. 模拟正常请求
首先,我们可以通过正常的 HTTP 请求来测试该脚本的行为。当我们访问该脚本时,它会输出当前的 PHP 代码,并且不会执行任何其他操作。
2. 利用 debug 参数
我们可以在 URL 中添加一个名为 debug 的 GET 参数,从而触发其中的代码。该参数将调用 `phpinfo()` 函数并退出,因此我们可以在浏览器中看到当前 PHP 环境的信息。
3. 利用 cmd 参数
我们可以在 POST 请求中添加一个名为 cmd 的参数,并将其设置为要执行的命令。该脚本使用 `isset()` 函数检查该参数是否存在,但它没有对该参数进行任何过滤或验证,因此我们可以在该参数中注入任何命令。
例如,我们可以使用以下命令:
```
curl -d "cmd=ls" -X POST http://example.com/your-script.php
```
这将列出当前目录中的所有文件。同样地,我们可以通过向 `cmd` 参数注入其他命令来执行任意操作,包括获取 flag。
例如,如果 flag 存储在 `/var/www/html/flag.txt` 中,我们可以使用以下命令:
```
curl -d "cmd=cat /var/www/html/flag.txt" -X POST http://example.com/your-script.php
```
这将输出 flag 内容。因此,攻击者可以通过利用该命令注入漏洞来获取 flag。
阅读全文