NoSQL注入的分析和缓解(3)
例如,设想一个需要JavaScript代码的复杂事务,包含有不干净的用户输入作为查询的参数.让我们看一下它的存储模型,它保存了一组条目,每个条目具有价格和数量属性.为得到这些属性的总数或平均值,开发人员编写了一个MapReduce函数,它从用户那里接收数量或价格作为参数,然后进行处理.在PHP中,看起来是如下代码($param是用户输入): 这段代码把每个条目按名称给定的$param合计起来.当时,$param预期是接收数量(amount)或价格(price)的,这段代码将按预期进行运转.但是,因为用户输入未被转义,所以恶意输入(它可能包含任意JavaScript)将被执行. 看一下如下输入: a);}},function(kv) { return 1; },{ ? ?out: ‘x’ });db.injection. insert({success:1});return 1;db.stores.mapReduce(function() { { ? ?emit(1,1 第一部分的数据会闭合最初的MapReduce函数,然后攻击者就可以在数据库上执行想要的JavaScript了(加粗部分).最终,最后一部分调用一个新的MapReduce以保持被注入代码的原始语句的平衡.在把会被执行的用户输入合并到为字符串后,我们得到以下代码(注入的用户输入加粗显示): 这个注入看起来与经典的SQL注入非常相似.防御此类攻击的一种方式是在数据库配置中禁止执行JavaScript.如果JavaScript是必需的,那么最好的策略是不使用任何用户输入. 键值对数据存储像Memcached、Redis和Tachyon之类的键值对存储是内存数据存储,旨在加快应用、云架构和平台以及大数量框架的执行速度.这些平台考虑的是反复频繁访问的数据的存储和检索.它们通常处于数据存储之前,如图4所示.缓存架构经常存储认证令牌及容器访问控制列表,对于每个后续的用户请求必须重新使其生效. 图4 分布式内存数据存储架构. 被攻击的Web服务器使用一个键值数据存储进行快速数据检索.对数据存储的查询是在该Web服务器上通过用户提供的数据构建出来的.如果处理不适当,用户数据可以导致一个非法查询注入,它将被该键值面目数据存储处理,导致应用逻辑中的错误,以此绕过认证或进行有害的数据检索. 尽管由于键值对查询很简单所以通常缓存API也非常简单,但我们发现一个Memcached(第二受欢迎的键值对面目全非)潜在的注入攻击手段,那就是基于特定PHP版本的Memcached驱动程序中的漏洞.达成以下条件即可进行攻击:
把一个键及相应的值加到使用Memcached的数据库中的一组操作.当从命令行界面调用时,这组函数使用两行输入,第一行是: 然后第二行由要保存的数据构成. 当PHP配置的函数被调用时,它接收的两个参数看起来是这样的: 研究人员表示,该驱动程序未能针对带有回车\r(0x0D)和换行的\n(0x0A)的ASCII码采取措施,导致攻击者有机会注入包含有键参数的新命令行和其他非计划内的命令到缓存中8. 看一下如下代码,其中的$param是用户输入并作为键来作用: 攻击者可以提供以下输入进行注入攻击: 在本例中,增加到数据库中的第一个键是具有“some value”值的key1.攻击者可以增加其他的、非计划内的键到数据库中,即带有“inject”值的key2. 这种注入也可以发生在get命令上.让我们看一下Memcached主页上的示例,它以这三行开头: (编辑:ASP站长网) |