1.代码注入
1.1 命令注入
命令注入是指应用程序执行命令的字符串或字符串的一部分来源于不可信赖的数据源,程序没有对这些不可信赖的数据进行验证、过滤,导致程序执行恶意命令的一种攻击方式。
问题代码:
$dir = $_POST['dir']
exec("cmd.exe /c dir" + $dir);
修复方案:
(1)程序对非受信的用户输入数据进行净化,删除不安全的字符。
(2)限定输入类型, 创建一份安全字符串列表,限制用户只能输入该列表中的数据。 修复例子:
//方式1 if (!preg_match('/^[\w\.:\-]+$/', $dir) ){ // Handle error } $cmd = filter_var($cmd, FILTER_VALIDATE_REGEXP, array("options" => array("regexp" => getCommandFilterReg()))); ... $msg = escapeshellarg($msg); //方式2 function cmd_arg($cmd, $filter='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.') { $filter_chars = str_split($filter); $filter_chars = array_combine($filter_chars, $filter_chars); $cmd_chars = str_split($cmd); $ret = ''; foreach ($cmd_chars as $v) { $ret .= isset($filter_chars[$v]) ? $filter_chars[$v] : ''; } return $ret; } $cmd = cmd_arg($cmd);
1.2 js动态代码注入
(1)主要是前端使用了eval函数来解析服务端的响应
evalResponse: function() { try { return eval((this.transport.responseText )); } catch (e) { this.dispatchException(e); }
修复方案: a.不要使用eval函数,使用自定义函数替换
function _dhtmlxEvalData( code ) { var script; if ( code ) { var data_key = '_process_json_data_'+parseInt( rand(0,1000000000000)); code = 'window["'+data_key+'"]=('+code+');' // If the code includes a val