360webscan防注入脚本全面绕过
360webscan防注入脚本全面绕过
Phithon
2014 二月 10 15:46
阅读:21031
昨天几个朋友聊到了某个cms里用的360webscan脚本,问我怎么绕过。其实之前一直没有研究过正则的绕过,当然这次也不是正则的绕过,但最终目的是达到了,全面绕过了360webscan对于注入与xss的防护。
当然360忽略了,于是我也就公开了呗。反正厂商都不重视安全,我们也没必要重视了。
使用360webscan的一大cms就是cmseasy,我们就借用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/';
返回来看我们的这个函数:
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;
}
当$_SERVER['PHP_SELF']中能正则匹配出'admin|/dede/|/install/'的时候,就返回false,就绕过了检测。 然后再给大家说明一下$_SERVER['PHP_SELF']是什么: PHP_SELF指当前的页面绝对地址,比如我们的网站: https://www.leavesongs.com/hehe/index.php 那么PHP_SELF就是/hehe/index.php。 但有个小问题很多人没有注意到,当url是PATH_INFO的时候,比如 https://www.leavesongs.com/hehe/index.php/phithon 那么PHP_SELF就是/hehe/index.php/phithon 也就是说,其实PHP_SELF有一部分是我们可以控制的。 说到这里大家应该知道怎么绕过360webscan了吧?只要PHP_SELF中含有白名单字段即可。 这也可以发散到很多cms上,php_self也是可控变量,注意过滤。
来测试一下看看,在本地搭建一个cmseasy,最新版20140118,提交一个含有敏感字符union select的查询,被360拦截了:
那我们修改一下path_info,其中带有白名单字段“/admin/”:
果断页面变了,绕过了拦截。不过这个时候css和js也变了(因为基地址有问题),但并不影响sql语句和xss的执行,注入什么的还是能继续的。 我们再随便试一个不知什么版本的cmseasy,都没有拦截:
- 用Raspberry Pi Zero打造「即插即用」的Web服务器
- Spring Cloud(七)服务网关 Zuul Filter 使用
- 基于Metronic的Bootstrap开发框架经验总结(1)-框架总览及菜单模块的处理
- Spring Cloud(六)服务网关 zuul 快速入门
- Docker Registry Server 搭建,配置免费HTTPS证书,及拥有权限认证、TLS 的私有仓库
- Ubuntu 17.04 编译安装 Nginx 1.9.9 配置 https 免费证书
- 基于Metronic的Bootstrap开发框架经验总结(2)--列表分页处理和插件JSTree的使用
- Docker Image 解决镜像无法删除的问题
- Docker Hub 仓库使用,及搭建 Docker Registry
- 基于Metronic的Bootstrap开发框架经验总结(3)--下拉列表Select2插件的使用
- Docker 容器操作
- Ubuntu 17.04 x64 安装 Docker CE 初窥 Dockerfile 部署 Nginx
- 基于Metronic的Bootstrap开发框架经验总结(4)--Bootstrap图标的提取和利用
- WebView 的 input 上传照片的兼容问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法