漏刻有时采用PHP-MVC结构,在参数传递过程中,已做参数过滤。
如正常的访问路径如下:
http://test.com/?m=Surveyor&a=apply
在实际进行脚本攻击的时候会使用
跨站脚本攻击 (XSS)
http://test.com/?m=Surveyor&a=apply<script>alert(1)</script>
如果调用的方法未进行安全过滤,则在访问的过程中会弹出javascript弹窗,则表明存在漏洞。
漏洞为害
1.窃取管理员帐号或Cookie,入侵者可以冒充管理员的身份登录后台。使得入侵者具有恶意操纵后台数据的能力,包括读取、更改、添加、删除一些信息。
2.窃取用户的个人信息或者登录帐号,对网站的用户安全产生巨大的威胁。例如冒充用户身份进行各种操作。
3.网站挂马。先将恶意攻击代码嵌入到Web应用程序之中。当用户浏览该挂马页面时,用户的计算机会被植入木马。
解决方案
- 1.表单提交或者url参数传递前,对需要的参数进行过滤;
- 2.增加前后端验证机制;
后端安全过滤函数
解决参数在传送的过程中,使用
/** * 安全过滤函数 * * @param $str * @return $string */ function safe_replace($str) { $string = str_replace('%20', '', $str); $string = str_replace('%27', '', $string); $string = str_replace('%2527', '', $string); $string = str_replace('*', '', $string); $string = str_replace('"', '"', $string); $string = str_replace("'", '', $string); $string = str_replace('"', '', $string); $string = str_replace(';', '', $string); $string = str_replace('<', '', $string); $string = str_replace('>', '', $string); $string = str_replace("{", '', $string); $string = str_replace('}', '', $string); $string = str_replace('\\', '', $string); return $string; } /* * 变量传递值函数 * @param $str 变量值 */ function get_param($str) { $string = safe_replace($_GET[$str]); if ($string == '0') { $val = '0'; } else { $val = !empty($string) ? $string : null; } return $val; }
SQL注入漏洞
http://test.com/index.php?m=Manager&a=examineAdmin&act=examine&pro_id=914&pro_types=1
- m=Manager,使用get_param过滤;
- a=examineAdmin,使用get_param过滤;
- act=examine,使用get_param过滤;
- pro_id=914,使用get_safe过滤;
- pro_types=1,使用get_safe过滤;
//判断是否是整数类型 function get_safe($str) { $num = $_GET[$str]; if (is_numeric($num)) { return $num; } else { redirect("index.php?m=Pop&a=tips&act=tips&tips_id=7"); } }
逻辑漏洞
漏洞说明:使用默认密码登录系统后,在强制修改密码时,存在手机验证码验证机制,但手机验证码可以使用bp拦截工具进行获取。从而得到修改密码的功能。获取验证码时抓包再进行抓回包
在登录平台、忘记密码时,系统采用手机短信验证码功能。系统生成验证码是,采用的cookies,而非session全局变量,由此导致浏览器端可以通过F12或bp拦截工具获取系统的验证码而不通过手机。
解决方案:
session_start(); $rmdCode = rand(111111, 999999);//随机验证码 $_SESSION['code'] = $rmdCode;
//登录成功后自动销毁; session_destroy();
密码强度
增加密码强度,强制注册时必须包含必须同时包含字母和数字且至少6位。
,pass: [/(?=.*[0-9])(?=.*[a-zA-Z]).{6,30}/, '密码必须同时包含字母和数字且至少6位']
@lockdata.cn