Heim >Backend-Entwicklung >PHP-Tutorial >新型php漏洞挖掘之debug导致的安全漏洞(Edusoho)

新型php漏洞挖掘之debug导致的安全漏洞(Edusoho)

WBOY
WBOYOriginal
2016-06-23 13:16:571821Durchsuche

【过年了,每天发一篇以前的存货,一共七篇。】

现代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 Symfony\Component\Debug\ExceptionHandler; 跟进:

调用了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

0x02 利用方式二,利用社交属性批量获取信息

利用方式二,首先关注你想获取密码的人,比如我关注了这四个,分别是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

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn