SQL注入、NoSQL注入 & MonoDB注入示例

SQL注入

攻击原理及特点:

Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数(web表单或页面请求)中,欺骗后台 Sql 服务器解析执行恶意的SQL命令(此时命令是由程序员编写的代码和用户提交的数据共同组成的)的攻击手段
SQL注入攻击方式多样
根据注入参数,SQL注入可分为五大类:数字型、字符型、搜索型、in型和句语连接型
根据注入数据,SQL注入可分为MySQL注入、MS-SQL注入、Oracle注入、Access注入、DB2注入等
根据服务器语言,又可分为PHP注入、ASP注入、JSP注入、ASP.NET注入等

虽然对于不同攻击类型,SQL注入的表现形式和手法都不相同,但SQL注入漏洞产生的根本原因都是一致的,即程序未细致地过滤用户输入的数据,致使非法数据/语句侵入系统

防范机制

  1. 参数化查询:在访问数据库时,在需要填入数值或数据的地方,使用参数来复制而非字符串拼接的方式去查询数据库/执行命令,即不再会把用户提供的参数作为SQL命令的一部分来处理,而是在数据库完成命令编译后套用参数运行
    (Access、SQL Server、MySQL、SQLite等常用数据库支持该防御机制)
  2. 过滤与转换:在服务器端代码中对用户提交的数据进行检查,若发现常用的SQL关键字符(如引号)则提示用户输入非法并拒绝数据库查询。
    但此种防御机制容易被绕过且对于某些特定注入类型效果不明显,如medium实验中,直接使用数字型注入也可以完成攻击但此种防御机制容易被绕过且对于某些特定注入类型效果不明显,如medium实验中,直接使用数字型注入也可以完成攻击
  3. 其他服务器与数据库安全设置:
    1) 给访问数据库的应用程序只分配其所需的最低权限
    2) 删除不必要的账户,确认所用账户都有健壮的密码
    3) 进行密码审计,移除所有示例数据库,尽量避免常用字段,如low实验中的user、password字段
    4) 管理扩展存储过程,禁止用户通过SQL SERVER来对底层的操作系统执行命令,同时在不影响数据库工作的情况下禁用或删除相应的扩展存储过程
    5) 及时对数据库进行升级和打补丁

虽然对于不同攻击类型,SQL注入的表现形式、手法和复杂程度都不相同,但SQL注入漏洞所利用核心原理都是一致的,即程序未细致地过滤用户输入的数据,致使非法数据/语句侵入系统,只是在不同的数据库及服务器语言中应用各自特性实现实际的攻击过程而已(但这也实际影响到攻击的可行性及危害程度)

NoSQL注入

简介&特征

NoSQL数据库并不使用传统的SQL语法,且各个数据库之间使用语法、API一般不同,所有注入代码不适用于所有NoSQL数据库。
但由于这些NoSQL注入攻击可以在一个过程语言中执行,而不是在声明式SQL语言中执行,所以潜在的影响比传统的SQL注入更大。
且不像传统的SQL注入,NoSQL注入攻击可能在应用程序的不同区域执行,具体取决于使用的NoSQL API和数据模型。通常,NoSQL注入攻击将在攻击字符串被解析,评估或连接到NoSQL API调用的地方执行。

注入途径

目前整理出的NoSQL注入攻击主要有5类途径 [多数与传统SQL注入类似]:

  1. 重言式/永真式:在条件语句中注入代码,使生成的表达式判定结果永远为真,从而绕过认证或访问机制
  2. 联合查询:常见SQL注入技术,攻击者利用一个脆弱的参数去改变给定查询返回的数据集。联合查询最常用的用法是绕过认证页面获取数据。
  3. JavaScript注入:这是一种新的漏洞,由允许执行数据内容中JavaScript的NoSQL数据库引入的。JavaScript使在数据引擎进行复杂事务和查询称为可能。传递不干净的用户输入到这些查询中可以注入任意JavaScript代码,这会导致非法的数据获取或篡改
  4. 背负式查询:攻击者通过利用转义特定字符(比如像回车和换行之类的结束符)插入由数据库额外执行的查询,这样就可以执行任意代码了
  5. 跨域违规:HTTP REST APIs是NoSQL数据库中的一个流行模块,然而,它们引入了一类新的漏洞,它甚至能让攻击者从其他域攻击数据库。在跨域攻击中,攻击者利用合法用户和他们的网页浏览器执行有害的操作,详见后例。

OWASP:Testing for NoSQL injection

MongoDB简介及主要特征

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案

  1. MongoDB 将数据存储为一个文档,数据结构由键值(key->value)对组成,且可以在记录中设置任何属性的索引
  2. MongoDB支持丰富的查询表达式,查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组
  3. MongoDB 使用update()命令实现替换完成的文档(数据)或者一些指定的数据字段;使用Map/reduce函数(由Javascript编写,可通过db.runCommand或mapreduce命令来执行)来对数据进行批量处理和聚合操作
  4. MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可
  5. MongoDB支持各种编程语言(RUBY,PYTHON,JAVA,C++,PHP,C#等)
NoSQL注入示例(Mongodb)
PHP重言式注入

利用重言式绕过登录检查(传统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"]));
NoSQL联合查询注入攻击

直接拼接查询是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函数各类操作)

你可能感兴趣的:(SQL注入、NoSQL注入 & MonoDB注入示例)