-
-
免费开源相册Piwigopwigo出了一个piwigo <= 2.6.0sql注入漏洞
-
发表于: 2014-12-31 14:59 1102
-
前段时间免费开源相册Piwigopwigo出了一个piwigo <= 2.6.0sql注入漏洞。漏洞公布的时候,piwigo已经更新到了2.7.1。但是,这个漏洞公布的时候确实是一个货真价实的0day,影响piwigo全版本。
下面是当时在官方网站测试的记录:
跟piwigo作者沟通了解到他们知道这个漏洞并且认为已经修复了。给他们提供了更多的细节和证明之后,piwigo很快发布了新版本。
漏洞分析
漏洞的分析看起来比较简单,是由于functions_rate.inc.php文件中的rate_picture函数没有对传入的$rate变量进行过滤,直接拼接到SQL中执行:代码如下
为什么这么简单的一个问题,piwigo没有发现,认为这个漏洞已经修复了呢。关键在与rate_picture函数开头其实是有个对$rate变量的过滤的。如下
判断$rate是否是$conf['rate_items']的项。而后面这个数组的值是配置文件里写死的。
看起来这句的功能是设置了一个rate变量的白名单。只能是0,1,2,3,4,5其中之一。这样子应该很安全才对。当然事实证明这样子写是不安全的。当$rate = "5'aaaaaaaaaaaaaaaaa "时,in_array($rate, $conf['rate_items']) 这个判断是返回True的。这是php里不同类型变量比较时候的一个特性。关于php比较运算符的特性可以参考这里。
简言之:当字符串跟整型变量使用"=="比较的时候,会将字符串转换成整型,再进行比较。
经过测试发现,in_array方法在进行比较时候的逻辑跟"=="是一致。
所以,利用这个特性,相当于完全的bypass in_array的过滤。可以输入任意的数据拼接到SQL语句中,只要以数组中的数字开头就可以了。此外php中的switch也存在类似的特性。
漏洞修复
升级版本即可。官方在新版中,对$rate用正则又判断了一把。限制了只能是数字。话说国内的程序一般就intval一下了。
http://www.2cto.com/Article/201412/365422.html
下面是当时在官方网站测试的记录:
跟piwigo作者沟通了解到他们知道这个漏洞并且认为已经修复了。给他们提供了更多的细节和证明之后,piwigo很快发布了新版本。
漏洞分析
漏洞的分析看起来比较简单,是由于functions_rate.inc.php文件中的rate_picture函数没有对传入的$rate变量进行过滤,直接拼接到SQL中执行:代码如下
为什么这么简单的一个问题,piwigo没有发现,认为这个漏洞已经修复了呢。关键在与rate_picture函数开头其实是有个对$rate变量的过滤的。如下
判断$rate是否是$conf['rate_items']的项。而后面这个数组的值是配置文件里写死的。
看起来这句的功能是设置了一个rate变量的白名单。只能是0,1,2,3,4,5其中之一。这样子应该很安全才对。当然事实证明这样子写是不安全的。当$rate = "5'aaaaaaaaaaaaaaaaa "时,in_array($rate, $conf['rate_items']) 这个判断是返回True的。这是php里不同类型变量比较时候的一个特性。关于php比较运算符的特性可以参考这里。
简言之:当字符串跟整型变量使用"=="比较的时候,会将字符串转换成整型,再进行比较。
经过测试发现,in_array方法在进行比较时候的逻辑跟"=="是一致。
所以,利用这个特性,相当于完全的bypass in_array的过滤。可以输入任意的数据拼接到SQL语句中,只要以数组中的数字开头就可以了。此外php中的switch也存在类似的特性。
漏洞修复
升级版本即可。官方在新版中,对$rate用正则又判断了一把。限制了只能是数字。话说国内的程序一般就intval一下了。
http://www.2cto.com/Article/201412/365422.html
赞赏
看原图
赞赏
雪币:
留言: