有一道题目如下:对该段php代码拟定一个长度不大于13的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 10:03:51 浏览: 268
这是一道比较典型的 PHP 代码审计与漏洞利用题目。根据题目描述,我们需要构造一个长度不大于13的payload,然后获取webshell。
首先来分析一下这段代码:
1. error_reporting(0); :禁止输出 PHP 错误信息。
2. highlight_file(FILE); :将代码高亮输出。
3. if (isset($_GET['debug'])) { // disable function phpinfo(); exit; } :当存在 GET 参数 debug 时,禁止 phpinfo 函数的执行,直接结束程序。
4. function count_string_char($str) { ... } :定义了一个函数,用于计算字符串中有多少个不同的字符。
5. if (isset($_POST['cmd']) { ... } :当存在 POST 参数 cmd 时,执行后续操作。
从代码中可以看出,存在一个可以执行任意命令的漏洞。我们需要构造一个payload,让服务器执行我们的命令,然后获取webshell。
首先,我们需要使用 POST 方法提交命令。由于存在字符串去重的处理,我们需要避免重复字符。因此,我们选择使用数字0-9和字母a-f组成的16进制字符串,避免重复字符的同时,也能够满足我们的需求。
接下来,我们需要构造一个命令,来获取webshell。由于此处的命令执行函数没有被禁用,我们可以使用反弹shell的方法,将一个绑定了反弹shell的命令提交到服务器上,从而获取webshell。
最终,我们可以构造出如下payload:
```php
<?php
system($_GET['cmd']);
?>
```
将其编码成16进制字符串,再使用POST方法提交到服务器上,即可获取webshell。完整payload如下:
```
cmd=73797374656d28245f4745545b27636d64275d293b&submit=Submit
```
其中,cmd参数对应的值为system($_GET['cmd']);的16进制表示。
阅读全文