佛山网站建设找千界,中小企业网站建设调研报告,外贸购物网站建站,wordpress主题字体更改escapeshellcmd escapeshellcmd(string $command): string command--要转义的命令。
escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec() 或 system() 函数#xff0c;或者 执行操作符 之前进行转义。 …escapeshellcmd escapeshellcmd(string $command): string command--要转义的命令。
escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec() 或 system() 函数或者 执行操作符 之前进行转义。
反斜线\会在以下字符之前插入#;|*?~^()[]{}$\、\x0A 和 \xFF。 和 仅在不配对儿的时候被转义。在 Windows 平台上所有这些字符以及 % 和 ! 字符前面都有一个插入符号^。 escapeshellarg escapeshellarg(string $arg): string arg--需要被转义的参数
escapeshellarg() 把字符串转义为可以在 shell 命令里使用的参数
escapeshellarg() 将给字符串增加一个单引号并且能引用或者转义任何已经存在的单引号这样以确保能够直接将一个字符串传入 shell 函数并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数。shell 函数包含exec()、system() 和执行运算符 。
在 Windows 上escapeshellarg() 用空格替换了百分号、感叹号延迟变量替换和双引号并在字符串两边加上双引号。此外每条连续的反斜线(\)都会被一个额外的反斜线所转义。 shell函数 shell 函数包含exec()、system() 和执行运算符 system()
在windows系统中system函数直接在控制台调用一个command命令。 执行运算符
PHP 支持一个执行运算符反引号
PHP 将尝试将反引号中的内容作为 shell 命令来执行并将其输出信息返回。使用反引号运算符“”的效果与函数 shell_exec() 相同 exec()
exec() 执行 command 参数所指定的命令。 exec(string $command, array $output null, int $result_code null): string|false command
要执行的命令。 output
如果提供了 output 参数 那么会用命令执行的输出填充此数组 result_code
如果同时提供 output 和 result_code 参数命令执行后的返回状态会被写入到此变量 参数注入 基本用法
?phpecho escapeshellarg(Hello);
// 输出值为Helloecho escapeshellarg(Hello\);
// 输出值为Hello\在命令行使用 echo Hello\只会输出 Hello 关键的话
引用自谈escapeshellarg绕过与参数注入漏洞 | 离别歌 这个字符串应该出现在“参数值”的位置而不是出现在参数选项option中。单引号并不是区分一个字符串是“参数值”或“选项”的标准 接下来我们好好理解一下这句话 参数和参数选项的区别
参数参数值是在命令行或函数调用中用来传递具体数据或信息给程序或函数的部分。它是某个参数的实际取值
参数选项参数选项是用来配置程序或函数行为的标志或开关。它不包含具体的数值而是用于启用或禁用某些功能
实例 Linux 中通常使用 - 或者 -- 来作为选项Option的标识符 而如果没有namecat就变成了参数 也可以取消这种差异我们在中间加--即可 总结
在了解“参数”和“选项”后我们可知在命令后使用 escapeshellarg 并不能阻止命令执行参数和选项并不依靠单引号
如 gitlist 0.6.0远程命令执行漏洞下面是该项目在执行过程中生成的命令
git grep -i --line-number -e --open-files-in-pagerid; master
# 其中 --open-files-in-pager 的参数会被执行。 escapeshellarg 可以逃逸并达到执行命令的关键
函数参数可控执行的命令中有执行命令的选项类似 “–open-files-in-pagerid;” 的等号形式 逃逸字符
例题
?php$payload ;
$code urldecode($payload);function filter($str)
{if (preg_match(/system|exec|passthru|shell_exec|pcntl_exec|bin2hex|popen|scandir|hex2bin|[~$.^_]|\[a-z]|\[a-z0-9]/i, $str)) {return false;} else {return true;}
}if (filter($code) 1) {eval($code . ;);
} else {die(18cm30p !! : );
}
在题目中过滤了很多命令执行的函数。还有两段比较关键的正则\[a-z]和\[a-z0-9]也就是字母无法和引号接触。
通常这种正则的绕过都是采用编码转义的方式来绕过的。 1.不可见字符又可以让 preg _match 函数中的正则检测失效 2.escapeshellcmd又可以将不可见字符消除 3.最终 eval 能执行正常的字符串。 文章内容参考见
谈escapeshellarg绕过与参数注入漏洞 | 离别歌
浅谈CTF中escapeshellarg的利用_escapeshellarg 绕过-CSDN博客
PHP: escapeshellarg - Manual