由于开发人员编写源码,没有针对代码中可执行的特殊函数入口做过滤,导致客户端可以提交恶意构造语句提交,并交由服务器端执行。命令注入攻击中WEB服务器没有过滤类似system(),eval(),exec()等函数是该漏洞攻击成功的最主要原因。
<?php
$log_string =$_GET[‘log’];
system("echo \"".date("Y-m-d H:i:s ")." ".$log_string."\" >> /logs/".$pre."/".$pre.".".date("Y-m-d").".log");}
?>
恶意用户只需要构造xxx.php?log='id'形式的URL,即可通过浏览器在远程服务器上执行任意系统命令
·建议假定所有输入都是可疑的,尝试对所有输入提交可能执行命令的构造语句进行严格的检查或者控制外部输入,系统命令执行函数的参数不允许外部传递。
·不仅要验证数据的类型,还要验证其格式、长度、范围和内容。
·不要仅仅在客户端做数据的验证与过滤,关键的过滤步骤在服务端进行。
·对输出的数据也要检查,数据库里的值有可能会在一个大网站的多处都有输出,即使在输入做了编码等操作,在各处的输出点时也要进行安全检查。
·在发布应用程序之前测试所有已知的威胁。