在web应用开发中,通过调用代码或系统函数去提高应用灵活性、简洁性,而忽略用户输入是否可以被控制时,所产生的漏洞。可以获取服务器权限、获取敏感数据、写入恶意shell。
产生原因
代码层过滤不严、系统自身漏洞、调用第三方组件存在的漏洞
PHP命令执行
System函数:
<?php
$cmd = $_GET["cmd"]; //获取参数
$last_line = system($cmd,$text); //执行命令
echo '</br>';
echo $last_line; //输出结果
?>
Exec函数:
<?php
$cmd = $_GET["cmd"]; //获取参数
echo exec($cmd); //输出结果
?>
Shell_exec函数:
<?php
$cmd = $_GET["cmd"]; //获取参数
$cmd_text = shell_exec($cmd);
echo $cmd_text; //输出结果
?>
Passthru函数:
<?php
$cmd = $_GET["cmd"]; //获取参数
passthru($cmd,$cmd_text);
echo $cmd_text; //输出结果
?>
Popen函数:
<?php
$cmd = $_GET["cmd"]; //获取参数
$cmd_text = popen($cmd,'w'); //设置写入模式
pclose ($cmd_text); //输出结果
?>
常用绕过方式
空格绕过:${IFS}、重定向符<>、%09
黑名单绕过:拼接、base64编码、单双引号、反斜线、$1/$@
读文件绕过:采取其他命令执行(More、Less等)
通配符绕过:?单字符,*任意字符,[...]任意字符
内联执行绕过:反引号命令执行
常见防御手段
减少或禁用执行命令函数disable_function(php.ini文件中);
输入时,过滤参数,进行敏感字符转义;
参数值尽量使用引号,在拼接前调用addslashe转义;