WordPress插件漏洞影响超过100万个网站

jopen 8年前
   <p style="text-align: center;"><img alt="WordPress插件漏洞影响超过100万个网站" src="https://simg.open-open.com/show/57d621dffaa4c5562e113f76d2016111.jpg" /></p>    <h2>前言</h2>    <p>作为我们Sucuri防火墙(WAF)漏洞研究项目的一部分,为了查找存在的安全问题,我们已经审计了多个开源项目。当审计WordPress的“NextGEN”相册插件时,我们发现了一个严重的SQL注入漏洞。该漏洞允许一个未经授权的用户从受害人网站的数据库中偷取数据,包括用户的敏感信息。目前,有超过100万个WordPress网站安装了这个易被攻击的插件。</p>    <p><img alt="WordPress插件漏洞影响超过100万个网站" src="https://simg.open-open.com/show/1c61be4e6da9622cf970e0318e870ac4.jpg" /></p>    <p>你处在危险中吗?</p>    <p>攻击者利用该漏洞需要至少两个条件:</p>    <ol>     <li>在你的网站中是否使用了“NextGEN Basic TagCloud Gallery”?</li>     <li>你是否允许你网站的用户提交要审阅的文章(投稿人)?</li>    </ol>    <p>如果你的网站符合这两种情况之一,那你已经处在危险之中了。</p>    <p>漏洞原因是NextGEN相册允许用户在WordPress执行一条SQL查询时输入未经过滤的数据,本质上就是将用户输入直接添加到了一条SQL查询中。使用该攻击方法,一个攻击者可以偷取到密码的HASH、和WordPress其它配置的秘密信息。</p>    <h2>技术细节</h2>    <p>永远不要相信输入数据---这是一条金科玉律。如果遵守这条规律,那将会很安全。在很多情况下,我们必须问自己几个简单的问题:</p>    <ol>     <li>这条输入数据足够安全吗?</li>     <li>对它进行过滤了吗?</li>     <li>我们遵循任何具体框架的规则和最佳实践了吗?</li>    </ol>    <p>WordPress使用了PHP的vsprintf函数,用于在$wpdb->prepare()函数中提前准备好SQL statement,这意味着SQL语句使用格式化字符串和输入值作为参数。这使我们得出结论:将用户的输入提供给格式化字符串从来不是一个好主意,因为它可能没有对字符串进行过滤,可能会包含有效的sprintf/printf指令。</p>    <p>这就是为什么这个方法,get_term_ids_for_tags()引起了我们的注意:</p>    <p><img alt="WordPress插件漏洞影响超过100万个网站" src="https://simg.open-open.com/show/f9ee961fb8646a31212bba3c891c015d.jpg" /></p>    <p>上面的代码可以在下面的路径中发现:</p>    <p>nextgen-gallery/products/photocrati_nextgen/modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php</p>    <p>在这个源代码中,我们注意到“$container_ids”字符串是由tag输入创建的,并且它的值并没有经过适当的过滤。对于SQL注入,它是安全的,但是,它不能阻止任意格式化字符串指令/输入的插入,在WordPress数据库的$wpdb->prepare()方法下会引起问题。</p>    <p>$wpdb->prepare和sprintf</p>    <p><img alt="WordPress插件漏洞影响超过100万个网站" src="https://simg.open-open.com/show/989f7cc47c453c6fc42cfaf0b498bb6d.jpg" /></p>    <p>在prepare()方法的代码中,我们注意到原始SQL代码在执行前发生了一些变化,具体变化是:如果在语句中发现%s,会被替换成‘%s’。同样,我们看到在发生变化之后,它会被传递给vsprintf函数,这意味着我们注入的任何有效的格式化字符串将有可能被处理。从PHP的sprintf函数文档中我们知道可能会发生参数交换,当没有适当过滤的输入数据添加到格式化字符串时,有可能导致类似于下面的一些问题:</p>    <p>1.恶意用户将下面的输入注入到格式化字符串/查询中:</p>    <p><img alt="WordPress插件漏洞影响超过100万个网站" src="https://simg.open-open.com/show/37df6d6a46d03721eedb960b8fafc8cc.jpg" /></p>    <p>2.生成的查询有可能类似于这样:</p>    <p><img alt="WordPress插件漏洞影响超过100万个网站" src="https://simg.open-open.com/show/b355c476e59912cd6d2c2ed455cd1489.jpg" /></p>    <p>3.当传递给prepare()方法时,有可能会被修改为:</p>    <p><img alt="WordPress插件漏洞影响超过100万个网站" src="https://simg.open-open.com/show/23007cc0536ff1a4349a91b9ddf505e7.jpg" /></p>    <p>(%s将会变成‘%s’)。</p>    <p>4.于是,当由此产生的格式化字符串传递给vsprintf函数后,产生的SQL查询语句具有以下格式:</p>    <p><img alt="WordPress插件漏洞影响超过100万个网站" src="https://simg.open-open.com/show/b3dbc15b65e03661d8694de2f2c6d8dd.jpg" /></p>    <p>如上所示,这意味着我们保留了一个额外的‘符号,这打破了我们字符串的单引号序列,并会将我们生成的[any_text2]字符串变成SQL查询的一部分。</p>    <h2>利用方案</h2>    <p>在插件的源代码中,我们发现有两个地方的函数会创建“$container_ids”字符串,分别是:</p>    <ul>     <li>当使用标签库的短码时。它需要一个特权认证用户来执行这个攻击。</li>     <li>当从一个“NextGEN Basic TagCloud”相册访问标签时,恶意访问者可以通过稍微修改相册的URL(网站中存在的相册),去发起攻击。</li>    </ul>    <p>有了这些知识,一个未经授权的攻击者可以向SQL查询中添加额外的sprintf/printf指令,并利用$wpdb->prepare()的行为向执行的语句中添加攻击者控制的代码。</p>    <p>最终的攻击载荷(使用了TagCloud方法)类似于下面这样:</p>    <p><img alt="WordPress插件漏洞影响超过100万个网站" src="https://simg.open-open.com/show/7b3e7f0cc539587ae9f2d67a7ee27c25.jpg" /></p>    <p>(http://target.url/2017/01/17/new-one/nggallery/tags/test%1$%s)) or 1=1#)</p>    <p>或者</p>    <p><img alt="WordPress插件漏洞影响超过100万个网站" src="https://simg.open-open.com/show/ba1f973b67105e4bda2677eca15adb77.jpg" /></p>    <p>(http://target.url/2017/01/17/new-one/nggallery/tags/test%1$%s)) or 1=2#)</p>    <h2>结论</h2>    <p>这是一个严重漏洞,如果你使用了该插件的一个有漏洞的版本,请尽可能快的对它进行升级。</p>    <p>参考链接</p>    <p><a href="https://arstechnica.com/security/2017/02/severe-vulnerability-in-wordpress-plugin-could-affect-1-million-sites/?utm_source=tuicool&utm_medium=referral" rel="nofollow,noindex">https://arstechnica.com/security/2017/02/severe-vulnerability-in-wordpress-plugin-could-affect-1-million-sites/?utm_source=tuicool&utm_medium=referral</a></p>    <p>来自: http://netsecurity.51cto.com/art/201703/534332.htm</p>