文章

Ping类-linux命令的绕过

本章主要是一些linux命令的绕过

<?php

function sanitize($s) {
    $s = str_replace(';', '', $s);
    $s = str_replace(' ', '', $s);
    $s = str_replace('/', '', $s);
    $s = str_replace('flag', '', $s);
    return $s;
}

if (isset($_GET['source'])) {
    highlight_file(__FILE__);
    die();
}

if (!isset($_POST['ip'])) {
    die('No IP Address');
}

$ip = $_POST['ip'];

$ip = sanitize($ip);

if (!preg_match('/((\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])/', $ip)) {
    die('Invalid IP Address');
}

system('ping -c 4 '.$ip. ' 2>&1');

?>

; :

:(分号):各种命令按从左到右的顺序执行,彼此之间不关心是否执行成功

| :

管道符:上一条命令的输出作为下一条命令的输入

在ping题型中127.0.0.1|ls因为 ping 命令的输出不会被 ls 命令所使用,所以 ls 命令只是按照其常规行为列出当前目录的内容,而与 ping 命令的输出无关。

$

$在命令参数后代表此命令将在后台进行,为后台进程

ping 127.0.0.1$lsping 127.0.0.1ls会几乎同时开始执行。ping命令会一直运行,直到您手动停止它(通常使用Ctrl + C)。而ls命令会在完成文件列表操作后结束。

默认情况下,进程是前台进程,这时就把Shell给占据了,我们无法进行其他操作。
对于那些没有交互的进程,很多时候,我们希望将其在后台启动,可以在启动参数的时候加一个’&'实现这个目的。

$$ :

与,只有左边命令为真时后面才会执行

shell 在执行某个命令的时候,会返回一个返回值,该返回值保存在 shell 变量 $? 中。

当 $? == 0 时,表示执行成功;
当 $? == 1 时(非0的数,返回值在0-255间),表示执行失败。

|| :

编码绕过

echo Y2F0IGZhbGcucGhw|base64 -d|bash //cat flag.php

License:  CC BY 4.0