Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数(web表单或页面请求)中,欺骗后台 Sql 服务器解析执行恶意的SQL命令(此时命令是由程序员编写的代码和用户提交的数据共同组成的)的攻击手段
SQL注入攻击方式多样
根据注入参数,SQL注入可分为五大类:数字型、字符型、搜索型、in型和句语连接型
根据注入数据,SQL注入可分为MySQL注入、MS-SQL注入、Oracle注入、Access注入、DB2注入等
根据服务器语言,又可分为PHP注入、ASP注入、JSP注入、ASP.NET注入等
虽然对于不同攻击类型,SQL注入的表现形式和手法都不相同,但SQL注入漏洞产生的根本原因都是一致的,即程序未细致地过滤用户输入的数据,致使非法数据/语句侵入系统
虽然对于不同攻击类型,SQL注入的表现形式、手法和复杂程度都不相同,但SQL注入漏洞所利用核心原理都是一致的,即程序未细致地过滤用户输入的数据,致使非法数据/语句侵入系统,只是在不同的数据库及服务器语言中应用各自特性实现实际的攻击过程而已(但这也实际影响到攻击的可行性及危害程度)
NoSQL数据库并不使用传统的SQL语法,且各个数据库之间使用语法、API一般不同,所有注入代码不适用于所有NoSQL数据库。
但由于这些NoSQL注入攻击可以在一个过程语言中执行,而不是在声明式SQL语言中执行,所以潜在的影响比传统的SQL注入更大。
且不像传统的SQL注入,NoSQL注入攻击可能在应用程序的不同区域执行,具体取决于使用的NoSQL API和数据模型。通常,NoSQL注入攻击将在攻击字符串被解析,评估或连接到NoSQL API调用的地方执行。
目前整理出的NoSQL注入攻击主要有5类途径 [多数与传统SQL注入类似]:
OWASP:Testing for NoSQL injection
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案
利用重言式绕过登录检查(传统SQL注入常见方法)
//后端PHP代码
db->logins->find(array("username"=>$_ POST["username"], "password"=>$_POST["password"]));
//正常POST URL
username=Tolkien&password=hobbit
//正常验证,若有匹配项则登录成功(由后端PHP代码解析)
db.logins.find({ username: 'tolkien', password: 'hobbit'})
//恶意URL及对应解析
username[$ne]=1&password[$ne]=1
db.logins.find({ username: {$ne:1 }, password {$ne: 1 }) //$ne为!=,详见附录
//类似SQL表述
SELECT * FROM logins WHERE username <> 1 AND password <> 1
//解决:类型检查
db->logins->find( array("username"=>(string)$_ POST["username"], "password"=>(string)$_ POST["password"]));
直接拼接查询是SQL注入的一种常见手段,在MongoDB之类的流行数据存储中,JSON查询结构使攻击变得更难了。然而,这并不代表不可能。
//输入操作
string query = "{ username: ' " + post_ username + " ', password: ' " + post_passport + ' " }" //倒数第二、三个引号是否反了?
//恶意输入
username=tolkien', $or: [ {}, {'a': 'a&password=' }],
$comment: 'successful MongoDB injection'
//构造的查询
{ username: 'tolkien', $or: [ {}, { 'a': 'a', password '' } ], $comment: 'successful MongoDB injection' }
//类似SQL表达
SELECT * FROM logins WHERE username = 'tolkien' AND (TRUE OR ('a'='a' AND password = ''))
此外,还有NoSQL JavaScript注入、背负式查询、跨域违规示例以及相关建议,详见:
NoSQL注入的分析和缓解
其他示例:
NoSQL Injection(关于查询语言是否为json形式的讨论,部分认为多使用BSON,部分认为多使用JSON)
MongoDB注入示例
附录:
MongoDB 文档查询
PHP MongoDB操作总结(含find函数各类操作)