这个 漏洞暴露出一个细节问题,可能会影响很多cms。这个靠大家发掘了。 借用cmseasy中的360webscan来说明。 其中有一个白名单函数:
/** * 拦截目录白名单 */ function webscan_white($webscan_white_name,$webscan_white_url_t=array()) { $url_path=$_SERVER['PHP_SELF']; $url_var=$_SERVER['QUERY_STRING']; if (preg_match("/".$webscan_white_name."/is",$url_path)==1) { return false; } foreach ($webscan_white_url_t as $webscan_white_url) { foreach ($webscan_white_url as $key => $value) { if(!empty($url_var)&&!empty($value)){ if (stristr($url_path,$key)&&stristr($url_var,$value)) { return false; } } elseif (empty($url_var)&&empty($value)) { if (stristr($url_path,$key)) { return false; } } } } return true; }
这个函数在后面的过滤中起着至关重要的作用,因为过滤的时候判断如果webscan_white返回false就不执行过滤。 也就是说,我们如果能让这个函数返回false,那么就能轻松绕过360webscan的过滤。 那我们来看这个函数,这个函数第一个字段是白名单内容,我们在webscan_cache.php中可以找到: //后台白名单,后台操作将不会拦截,添加"|"隔开白名单目录下面默认是网址带 admin /dede/ 放行 $webscan_white_directory='admin|\/dede\/|\/install\/'; 然后再看到下面: $url_path=$_SERVER['PHP_SELF']; $url_var=$_SERVER['QUERY_STRING']; if (preg_match("/".$webscan_white_name."/is",$url_path)==1) { return false; }
当$_SERVER['PHP_SELF']中能正则匹配出'admin|\/dede\/|\/install\/'的时候,就返回false,就绕过了检测。 然后再给大家说明一下$_SERVER['PHP_SELF']是什么: PHP_SELF指当前的页面地址,比如我们的网站: http://www.leavesongs.com/hehe/index.php 那么PHP_SELF就是/hehe/index.php。 但有个小问题很多人没有注意到,当url是PATH_INFO的时候,比如 http://www.leavesongs.com/hehe/index.php/phithon 那么PHP_SELF就是/hehe/index.php/phithon 也就是说,其实PHP_SELF有一部分是我们可以控制的。 说到这里大家应该知道怎么绕过360webscan了吧?只要PHP_SELF中含有白名单字段即可。 这也可以发散到很多cms上,php_self也是可控变量,注意过滤。 官网的demo不知道为何不成功,但是我 下载了最新版20140118,本地搭建。 比如我们提交一个含有敏感字符union select的查询,被360拦截了: |
-
上一篇: 浅谈WAF的绕过(附绕过安全狗的方法) - 网站安全
下一篇: 我是如何让菜刀无视安全狗的 - 网站安全 - 自学
还没有人抢沙发呢~