漏洞描述:

攻击者伪造一个带有注入代码的Web访问请求,当数据库客户端或协议包装器进行处理时,将会执行预期的非法数据库操作。如下图所示:

漏洞成因:

NoSQL注入攻击可以在程序语言中执行,而不是在声明式 SQL语言中执行,NoSQL数据库的调用是使用应用程序的编程语言编写的,过滤掉常见的HTML特殊字符,如<>&;不会阻止针对NoSQL的攻击。

风险评估:

在输入URL和表单处,攻击者通过输入精心构造的语句,获取数据库内容,或绕过认证。

漏洞风险等级—-高

测试方法:

NoSQL相关的攻击大致分为以下五类:

重言式。又称为永真式。此类攻击是在条件语句中注入代码,使生成的表达式判定结果永远为真,从而绕过认证或访问机制。例如,MongoDB注入攻击,用$ne(不相等)操作符, 构造请求http://www.xxx.com/index.php?username[$ne]=1&password[$ne]=1,绕过认证进入系统。

联合查询。联合查询最常用的用法是绕过认证页面获取数据。通过增加永真的表达式利用布尔OR运算符进行攻击,从而导致整个语句判定出错,进行非法的数据获取。

JavaScript注入。这是一种新的漏洞,由允许执行数据内容中JavaScript的NoSQL数据库引入的。JavaScript使在数据引擎进行复杂事务和查询成为可能。传递不干净的用户输入到这些查询中可以注入任意JavaScript代码,这会导致非法的数据获取或篡改。

背负式查询。在背负式查询中,攻击者通过利用转义特定字符(比如像回车和换行之类的结束符)插入由数据库额外执行的查询,这样就可以执行任意代码了。

跨域违规。HTTP REST APIs是NoSQL数据库中的一个流行模块,然而,它们引入了一类新的漏洞,它甚至能让攻击者从其他域攻击数据库。在跨域攻击中,攻击者利用合法用户和他们的网页浏览器执行有害的操作。在本文中,我们将展示此类跨站请求伪造(CSRF)攻击形式的违规行为,在此网站信任的用户浏览器将被利用在NoSQL数据库上执行非法操作。通过把HTML格式的代码注入到有漏洞的网站或者欺骗用户进入到攻击者自己的网站上,攻击者可以在目标数据库上执行post动作,从而破坏数据库。

案例详情请参考:http://www.infoq.com/cn/articles/nosql-injections-analysis。

加固方法

防止数组中的运算操作即可防御该漏洞。可以使用一下两种方式:

1.采用implode()方法,如下图:

implode()函数返回由数组元素组合成的字符串。这样就只能得到一个对应的结果。

2.使用addslashes()函数,这样攻击者便不能破坏查询语句。同时,也可以用正则表达式把一些特殊符号替换掉,如使用如下正则:

$u_name =preg_replace(‘/[^a-z0-9]/i’, ‘\’, $_GET[‘u_name’]);

转载至https://mp.weixin.qq.com/s/4t7kEBzpIOMcTiNNWQvrFA