新型php漏洞挖掘之debug导致的安全漏洞(Edusoho)
【过年了,每天发一篇以前的存货,一共七篇。】
现代cms框架(laraval/symfony/slim)的出现,导致现今的php漏洞出现点、原理、利用方法,发生了一些变化,这个系列希望可以总结一下自己挖掘的此类cms漏洞。
今天这个漏洞是Edusoho的一个user表dump漏洞。
首先,我简要说明一下漏洞原理。
【漏洞源码下载: https://mega.nz/#!4chVWCAB!xBVyC9QqxMCmeuLu3rGx__PwgkLe_a5NWUITLS3QzuM 】
0x01 开启DEBUG模式造成的隐患
Edusoho开启调试模式以后将会在程序出错后输出debug信息,其中包括当前环境中所有变量的值。默认的index.php是不开启debug的,但/api/index.php将会开启debug:
跟进一下框架的异常处理方法。Index.php里注册了异常处理:
ErrorHandler::register();
ExceptionHandler::register();
这里用的是Symfony框架自带的异常处理类:use SymfonyComponentDebugExceptionHandler;
跟进:
调用了set_exception_handler注册的异常处理方法。不断跟进,发现该类的getContent方法是输出错误内容的方法:
可见,这个异常类,将异常对象的”args”属性输出了。
认真学习过php异常处理类的同学应该知道,异常类的getTrace方法( http://php.net/manual/zh/exception.gettrace.php )是可以获取到当前上下文中所有变量的。
所以,这里这个debug模式,等于说可以将当前函数中定义的所有变量输出。那么试想,假设当前函数在出异常前,从数据库或文件中读取到了一些『敏感』信息,那么输出这个异常是不是就可以dump出这个『敏感变量』了呢?
明显这个猜想是可行的。
那么,我只需要在/api下找到一处出错的代码,并且当前函数中有敏感信息的地方,即可触发成一个『大漏洞』。
很幸运的是我找到了好几处。最简单的一处,/api/src/user.php:373
这个$follwers
变量是一个未定义的变量呀,所以一定会触发错误。
正好,当前函数中有user、follwings两个变量,user变量是指定的用户,follwings是它关注的用户。
所以,在报错输出调试信息以后,将会完全打印出这两个变量的值。而这两个变量都是从数据库user表里取出的数据,其中包含用户的所有信息(邮箱、密码hash、交易密码hash、salt、session、IP地址、昵称、登录时间等)。
另外,$follwings
变量里也有这些信息,我只要批量关注所有人,这个漏洞就变成了一个dump数据库user表的漏洞。
0x02 利用方式一,直接获取任意用户user表信息
访问 http://demo.edusoho.com/api/users/{用户id}/followings 即可,如 http://demo.edusoho.com/api/users/5/followings
0x03 利用方式二,利用社交属性批量获取信息
利用方式二,首先关注你想获取密码的人,比如我关注了这四个,分别是Id为1、2、3、4的用户,其中1、4是管理员:
我的id是15670,直接访问 http://demo.edusoho.com/api/users/15670/followings ,即可获取我关注的所有人的所有信息,包括密码等:
诸如此处的地方还有一个。
http://demo.edusoho.com/api/users/1/friendship?toIds[]=a 通过传入数组制造warning:
其他位置肯定不止,还可能泄露其他信息,我就不一一挖掘了,只为证明问题存在。
这个漏洞已经私下里报给官方了,所以demo站已经修复。但搜索“powered by edusoho” 还是能找到很多存在漏洞的站,在时间上这个漏洞还是属于一个0day。
比如这个站:
http://mooc.sinepharm.com/api/users/1/followings
- 运行shell脚本时报错"[[ : not found"解决方法
- 关于表联结方法(二) (r4笔记第23天)
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(一)设计一套好的RESTful API
- XSS分析及预防
- 关于ORA-01779问题的分析和解决 (r4笔记第22天)
- 想看爱奇艺VIP视频?一个python脚本帮你搞定
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十四)Redis缓存正确的使用姿势
- 关于shell中的pl/sql脚本错误排查与分析(r4笔记第21天)
- 关于BFC不会被浮动元素遮盖的一些解释
- MyBatis + MySQL返回插入成功后的主键id
- struts2+spring+hibernate整合步骤(1)
- 微信公众号问题:{"errcode":40125,"errmsg":"invalid appsecret, view more at http://t.cn/LOEdzVq, hints: [
- reflow和repaint(摘录自张鑫旭的翻译)
- git删除本地分支
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- PHP代码审计03之实例化任意对象漏洞
- 最简单入门深度学习
- Redis 字典结构细谈
- 终于弄明白 i = i++和 i = ++i 了
- 更简易的机器学习-pycaret的安装和环境初始化
- 直观讲解一下 RPC 调用和 HTTP 调用的区别!
- pycaret之训练模型(创建模型、比较模型、微调模型)
- 什么是递归,通过这篇文章,让你彻底搞懂递归
- pycaret之集成模型(集成模型、混合模型、堆叠模型)
- pycaret模型分析之绘制模型结果
- pycaret模型分析
- 用 Python 给自己的头像加一个小国旗(小月饼)
- pycaret之模型部署
- pyspark读取pickle文件内容并存储到hive
- Redis基础篇