目录
一、工作原理
1.1、简述:
1、数据库驱动的Web应用通常包含三层:
表示层(Web浏览器或呈现引擎)
逻辑层(如C#、ASP、.NET、PHP、JSP 等编程语言)
存储层(如Microsoft SQL Server、MySQL、Oracle等数据库)
2、Web浏览器(表示层,如IE、Safari、Firefox等)向中间层(逻辑层)发送请求,中间层通过查询、更新数据库(存储层)来响应该请求
1.2、示例:
1、在线商店提供了一个搜索表单,可以按特定的对商品进行过滤、分类等筛选的选项,以满足顾客在经济上的预算需求
可以使用URL 查看商店中所有价格低于100的商品:http://www.victim.com/products.php?val=100
二、架构:
2.1、简单的应用架构
数据库驱动的Web应用通常包含三层: 表示层、逻辑层和存储层(不具有扩展性)
1、表示层是应用的最高层,显示与商品浏览、购买、购物车等服务相关的信息, 并通过将结果输出到浏览器/客户端层和网络上的所有其他层来与应用架构的其他层进行通信。
2、逻辑层是从表示层剥离出来的, 作为单独的一层, 它通过执行细节处理来控制应用的功能。
3、数据层包括数据库服务器,用于对信息进行存储和检索。数据层保证数据独立于应用服务器或业务逻辑。将数据作为单独的一层还可以提高程序的可扩展性和性能。
4、Web浏览器(表示层)向中间层(逻辑层)发送请求,中间层通过查询、更新数据库(存储层)响应该请求。三层架构中最基本的规则是: 表示层不应直接与数据层通信。在三层架构中, 所有通信都必须经过中间层(线性关系)
2.2、较复杂的架构
1、n层应用程序开发范式。如4层, 该方案在Web服务器和数据库之间使用了一层中间件(通常称为应用服务器)。n层架构中的应用服务器负责将API(应用编程接口)提供给业务逻辑和业务流程以供程序使用。可以根据需要引入其他的Web服务器。此外应用服务器可以与多个数据源通信, 包括数据库、大型机以及其他旧式系统。
2、分层架构的基本思想是将应用分解成多个逻辑块(或层),其中每一层都分配有通用或特定的角色。各个层可以部署在不同的机器上,或部署于同一台机器上,但实际在概念上是彼此分离的。使用的层越多,每一层的角色就越具体。将应用的职责分成多个层能使应用更易于扩展,可以更好地为开发人员分配开发任务,提高应用的可读性和组件的可复用性。该方法还可以通过消除单点失败来提高应用的健壮性
3、Web浏览器(表示层)向中间层(逻辑层)发送请求, 后者依次调用由位于应用层的应用服务器提供的API, 应用层通过查询、更新数据库(存储层)来响应该请求
2.3、产生错误原因:
1、转义字符处理不当(如')
2、类型处理不当(整数型参数中,输入sql语句内置的读写命令被执行)
3、查询语句组装不当
脚本使用应用产生的值作为输入,输入是一个表名加三个列名,之后显示员工信息。该程序允许用户选择他希望返回的数据。例如,用户可以选择一个员工并查看其工作明细、日工资或当月的效能图。由于应用已经产生了输入, 因而开发人员会信任该数据。不过, 该数据仍可被用户控制, 因为它是通过GET请求提交的。攻击者可使用自己的表和字段数据来替换应用产生的值
如果攻击者操纵HTIP请求并使用值users 替换表名,使用user 、password 和Super_priv 字段替换应用产生的列名,那么便可以显示系统中数据库用户的用户名和口令。
使用应用时构造的 URL: http://www.victim.com/user _details.php?table=users&columnl=user&column2=password&column3=Super_priv
如果注入成功,那么将会返回数据而非时间安排数据
4、错误处理不当
错误处理不当会为Web 站点带来很多安全方面的问题。最常见的问题是将详细的内部错误消息(如数据库转储、错误代码等)显示给用户或攻击者。这些错误消息会泄露从来都不应该显示的实现细节。这些细节会为攻击者提供与网站潜在缺陷相关的重要线索
使用C#语言编写的ASP.NET 应用示例,它使用Microsoft SQL Server数据库服务器作为后台(因为该数据库提供了非常详细的错误消息)。当用户从下拉列表中选择一个用户标识符时, 脚本会动态产生并执行一条SQL 语句
如果攻击者想操纵HTTP 请求并希望使用自己的SQL 语句来替换预期的ID 值,可以使用信息量非常大的SQL 错误消息来获取数据库中的值。如果攻击者输入' and 1 in (SELECT @@version) 查询, 那么执行SQL 语句时会显示信息量非常大的SQL 错误消息,其中包含了Web 应用所使用的RDBMS版本
虽然这行代码确实捕获了错误条件,但并未提供自定义的通用错误消息。相反攻击者可以通过操纵应用和错误消息来获取信息
5、多个提交处理不当
(大多数)用于验证输入的白名单方法是指为特定输入创建一个允许使用的字符列表, 这样列表外的其他字符均会遭到拒绝
部分开发者会认为用户将遵循他们已经设计好的逻辑顺序,如当用户已到达一系列表单中的第三个表单时,他们会期望用户肯定已完成了第一个和第二个表单。但实际上, 借助直接的URL乱序来请求资源,能够非常容易地避开预期的数据流程
由于第一个表单已经进行过输入验证,因此该应用程序的开发人员如果没有在第二个表单设置验证输入。攻击者将直接调用第二个表单而不使用第一个表单,或简单地向第一个表单提交数据,然后操纵要向第二个表单提交的数据
流程一:http://www.victim.com/form.php?form=form1¶m= ' SQL Failed --
(失败,需要验证输入)
流程二:http://www.victim.com/form.php?form=form2¶m= ' SQL Success --
(可能成功,如果未设置输入验证)
6、不安全的数据库配置
数据库带有很多默认的用户预安装内容,口令众所周知。SQLServer使用声名狼藉的“ sa" 作为数据库系统管理员账户,MySQL 使用“root"和“anopymous"用户账户,Oracle则在创建数据库时通常默认会创建SYS、SYSTEM、DBSNMP 和OUTLN 账户。
有些系统和数据库管理员在安装数据库服务器时允许以root、SYSTEM 或Administrator特权系统用户账户身份执行操作
每一种类型的数据库服务器都施加了自己的访问控制模型,为用户账户分配多种权限来禁止、拒绝、授权、支待数据访问和(或)执行内置存储过程、功能或特性。不同类型的数据库服务器默认还支持通常超出需求但能够被攻击者修改的功能(xp_cmdshell、OPENROWSET、LOAD_FILE、ActiveX 以及Java 支持等)
应用开发人员在编写程序代码时, 通常使用某个内置的权限账户来连接数据库, 而不是根据程序需要来创建特定的用户账户。这些功能强大的内置账户可以在数据库上执行很多与程序需求无关的操作
应用还应使用不同的数据库用户来执行SELECT、UPDATE、INSERT 及类似的命令。即使攻击者成功将代码注入易受攻击的语句,为其分配的权限也是最低的。
攻击者在利用SQL注入漏洞时, 通常会尝试访问数据库的元数据。元数据是指数据库内部包含的数据, 比如数据库或表的名称、列的数据类型或访问权限。有时也使用数据字典和系统目录等其他项来表示这些信息。MySQL服务器(5.0及之后的版本)的元数据位千INFORMATION_SCHEMA虚拟数据库中,可通过SHOW DATABASES 和SHOW TABLES 命令访问。所有MySQL 用户均有权访问该数据库中的表,但只能查看表中那些与该用户访问权限相对应的对象的行。SQL Server 的原理与MySQL 类似,可通过INFORMATION_SCHEMA或系统表(sysobjects、sysindexkeys、sysindexes、syscolumns、systypes 等)及系统存储过程来访问元数据。SQL Server 2005引入了一些名为"sys.*"的目录视图,并限制用户只能访问拥有相应访问权限的对象。所有的SQL Server 用户均有权访问数据库中的表并可以查看表中的所有行,而不管用户是否对表或所查阅的数据拥有相应的访问权限。
Oracle提供了很多全局内置视图来访问Oracle 的元数据(ALL_TABLES、ALL_TAB_COLUMNS等),这些视图列出了当前用户可访问的属性和对象。此外, 以USER— 开头的视图只显示当前用户拥有的对象(例如,更加受限的元数据视图); 以DBA_开头的视图显示数据库中的所有对象(如用于数据库示例且不受约束的全局元数据视图);DBA_元数据函数需要有数据库管理员(DBA)权限