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,都没有拦截:
- 通用网页调用本地应用程序方案(windows平台)
- vue、rollup、sass、requirejs组成的vueManager
- 顺序栈的实现和两栈共享空间
- 掌握这几个工具,做微信营销活动才能高大上!
- requirejs、vue、vuex、vue-route的结合使用,您认为可行吗?
- 日报:万达网科员工遭集体裁员,首例“花呗”套现案宣判
- cocos2d-x 学习笔录:将iOS项目编译成Andriod项目
- Oozie 快速入门
- 记Javascript一道题的理解
- DOM事件第一弹
- 【留言板】可编辑输入框操作总结
- 判断单链表是否存在环
- ECMAScript5.1的运算符、类型转换总结
- TCP编程函数和步骤
- 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 数组属性和方法
- Salesforce LWC学习(二十五) Jest Test
- 自建npm包-搭建,打包,调试,发布
- 你对排序算法了解多少
- 【大数据架构】大数据数据仓库与数据中台架构
- JavaScript中的内置对象、面向对象与原型
- Java.lang.Illegalaccessexception 或 java.lang.NoSuchMethodError
- Python 爬虫进阶必备 | 关于某电商 token 参数加密逻辑分析
- Python 爬虫进阶必备 | 某直播数据分析平台加密参数 sign 分析
- Python 爬虫进阶必备 | 某指数分析平台解密逻辑分析
- SpringBoot开发秘籍 - 事件异步处理
- Hive on Spark参数调优姿势小结
- 想跨端开发小程序?这个最流行的跨端框架一定要学习!
- 1分钟搞定 Nginx 版本的平滑升级与回滚
- 详解:如何在uni-app中选择一个合适的UI组件库
- Python处理HTTP请求之requests指北