360webscan检测脚本绕过-通过白名单path_info

  1. /**
  2. * 拦截目录白名单
  3. */
  4. function webscan_white($webscan_white_name,$webscan_white_url_t=array()) {
  5. $url_path=$_SERVER['PHP_SELF'];
  6. $url_var=$_SERVER['QUERY_STRING'];
  7. if (preg_match("/".$webscan_white_name."/is",$url_path)==1) {
  8. return false;
  9. }
  10. foreach ($webscan_white_url_t as $webscan_white_url) {
  11. foreach ($webscan_white_url as $key => $value) {
  12. if(!empty($url_var)&&!empty($value)){
  13. if (stristr($url_path,$key)&&stristr($url_var,$value)) {
  14. return false;
  15. }
  16. }
  17. elseif (empty($url_var)&&empty($value)) {
  18. if (stristr($url_path,$key)) {
  19. return false;
  20. }
  21. }
  22. }
  23. }
  24. return true;
  25. }

这个函数在后面的过滤中起着至关重要的作用,因为过滤的时候判断如果webscan_white返回false就不执行过滤。

也就是说,我们如果能让这个函数返回false,那么就能轻松绕过360webscan的过滤。

那我们来看这个函数,这个函数第一个字段是白名单内容,我们在webscan_cache.php中可以找到:

  1. //后台白名单,后台操作将不会拦截,添加"|"隔开白名单目录下面默认是网址带 admin /dede/ 放行
  2. $webscan_white_directory='admin|\/dede\/|\/install\/';

然后再看到下面:

  1. $url_path=$_SERVER['PHP_SELF'];
  2. $url_var=$_SERVER['QUERY_STRING'];
  3. if (preg_match("/".$webscan_white_name."/is",$url_path)==1) {
  4. return false;
  5. }

当$_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中含有白名单字段即可。

比如我们提交一个含有敏感字符union select的查询,被360拦截了:


那我们修改一下path_info,其中带有白名单字段“/admin/”:



果断页面变了,绕过了拦截。不过这个时候css和js也变了(因为基地址有问题),但并不影响sql语句和xss的执行,注入什么的还是能继续的。