0x00 前言

早上浏览sec-news,发现锦行信息安全发布了一篇文章《【漏洞分析】 织梦前台任意用户密码修改》,看完之后就想着自己复现一下。

该漏洞的精髓是php的弱类型比较,'0.0' == '0',也有一定的限制,只对没有设置安全问题的用户有效(默认是没有设置的)。

0x01 漏洞版本

我复现的是DedeCMS V5.7 SP2正式版,2018-01-09发布的,其他的没测。应该算是最新版本的一个0day了。

0x02 漏洞影响

该漏洞允许攻击者修改任意前台用户密码。

0x03 漏洞利用条件

1,开启会员模块

2,攻击者拥有一个正常的会员账号

3,目标没有设置安全问题

0x04 漏洞分析

问题出现在/member/resetpasswordd.php  文件中。dedecms 用的是全局变量解析

一步步看:

这里先接受了一个id变量,用来查询用户。

接下来看到

这里是整个漏洞的核心所在,从数据库中获取safequestion,然后与传过来的数据进行判等。用的是双等号,又因为用户没有设置安全问题,数据库里面默认存的是0。

通过php弱类型的转换'0.0' == '0'了。(内部运算:先是把0.0(浮点数(0.0)转换为int(0),然后字符串('0')转换为int(0),最后 0==0 ,所以相等了。)

直接传0是不行的,因为前面有一个empty的判断,当然你也可以利用十六进制比如:0x0

其内不转换和上面的是一样的。

接下来跟进sn函数(记住这里我们的send默认为N)

继续跟进newmail函数

可以看到当send为N时,直接在前端页面返回了验证码。(而我们这里刚好默认就是N,见前文)
又因为用户id是我们可以控制的,safequestion(默认情况)下可以绕过。

那么也就达成了修改前台任意用户密码的效果。

0x05 漏洞复现

因为这里的模块属于会员模块,包含了member.login.class.php。需要登录才能操作。

那么我先注册一个用户,担任攻击者,再注册另外一个用户担任目标。

请求url应该是这样的:

http://127.0.0.1/dedecms/member/resetpassword.php?dopost=safequestion&safequestion=0.0&id={userid}

test为攻击者,用户id为2,密码:test。test1为目标,用户id为3,修改密码为:hacker

下面就演示一下用test修改test1用户的过程。

Step1: 登陆test用户

Step2:发送请求url

Step3:请求修改页URL:

http://127.0.0.1/dedecms/member/resetpassword.php?dopost=getpasswd&id=3&key=Dj7PeiRm

Step4:修改用户test1的密码为hacker

Step5: 用修改之后的密码登陆进行验证

验证成功。

0x06  思考与总结

虽然说整个漏洞的关键是那一处弱类型比较,也是php的特性与及开发人员对于特性的掌握不够全面所致。漏洞危害其实不太,dede多用于内容,没有什么用户交互而言。如果需要提供用户交流平台,大多数应该会用discuz。

但我觉得对于用户的权限划分不明才是这个漏洞的根本,可以归根为越权。用户id竟然可以直接由用户控制传输,倘若通过session,那么就算用户安全问题没有设置,可以用弱类型比较,最后也仅限于修改自己的密码。

php的弱类型一直是一个问题,特别是早期没有那么重视安全的时候。多少问题都是出在那里。

【漏洞分析】dedecms有前提前台任意用户密码修改的更多相关文章

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

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

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

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

  3. Metinfo4.0 /member/save.php 任意用户密码修改

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

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

  5. Windows下GIT的用户密码修改

    Windows下GIT的用户密码修改

  6. 通达OA 前台任意用户登录漏洞复现

    漏洞描述 通达OA是一套办公系统.通达OA官方于4月17日发布安全更新.经分析,在该次安全更新中修复了包括任意用户登录在内的高危漏洞.攻击者通过构造恶意请求,可以直接绕过登录验证逻辑,伪装为系统管理身 ...

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

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

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

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

  9. mysql用户密码修改,用户添加、删除及设置权限

    一下的示例所用用户名和密码为:test,111111 Mysql密码修改: Mysql修改密码需要root的权限,先执行mysql -uroot -p(密码); 1)使用set password方式来 ...

随机推荐

  1. 1.python的安装

    1.python 安装实验所用为系统自带,退出为exit() 或ctrl +D命令 2.一般装pyhton2.7 ,3.5的版本有更多特效.不用在版本上太多纠结.python官网https://www ...

  2. Swift开发教程--使用Storyboard进行界面跳转

    使用storyboard结合代码来做确实能够给开发带来非常多的便利. 在实践的过程中,我们常常会遇到界面的跳转问题. 通过控件和界面的建立的"连接"就能够了. 假设是navigat ...

  3. Android实战简易教程-第三十四枪(基于ViewPager和FragmentPagerAdapter实现滑动通用Tab)

    上一段时间写过一篇文章<基于ViewPager实现微信页面切换效果> 里面实现了相似微信Tab的页面.可是这样的实现方法有个问题.就是以后全部的代码逻辑都必须在MainActivity中实 ...

  4. 【蓝牙低功耗BLE】控制GPIO来点亮LED

    这节讲一下最简单的,也是最基础的东西.CC2540的IO操作,把PORT口当做GPIO来用,废话不多说,往下看. 1.硬件电路 硬件电路时最简单的,用一根GPIO去控制LED灯.因为GPIO作为out ...

  5. or1200处理器的异常处理类指令介绍

    下面内容摘自<步步惊芯--软核处理器内部设计分析>一书 我们在计算机体系结构的学习中知道:中断实质上包含由外部事件引起的硬中断(又称外中断)和由内部预先安排的特定指令或内部异常引起的软中断 ...

  6. xml基本语法(2)

    本节要点: 了解XML的文档声明 了解XML的元素.命名规则.属性.元素内容.处理指令等概念 1 XML文档声明 表示该文档是一个XML文档,以及遵循哪个XML版本的规范. 规范:<?xml 版 ...

  7. mysql并行复制降低主从同步延时的思路与启示

    一.缘起 mysql主从复制,读写分离是互联网用的非常多的mysql架构,主从复制最令人诟病的地方就是,在数据量较大并发量较大的场景下,主从延时会比较严重. 为什么mysql主从延时这么大? 回答:从 ...

  8. Tomcat配置(二):tomcat配置文件server.xml详解和部署简介

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  9. JavaScript操作符(一元操作符)

    JavaScript操作符包括算术操作符.位操作符.关系操作符和相等操作符.只能操作一个值的操作符叫做一元操作符. 递增和递减操作符 递增和递减操作符有两个版本:前置型和后置型.前置型操作符位于要操作 ...

  10. 【java】实现Interface java.lang.Comparable<T>接口的int compareTo(T o)方法实现对象数组或链表或集合的排序,和挽救式对象比较器Interface java.util.Comparator<T>

    package 对象比较排序; import java.util.Arrays; class A implements Comparable<A>{ private String name ...