2.1 SQL注入基础
为了更好地了解 SQL 注入产生的原因及其原理,在实际操作中,通常可以直接使用 sqlmap 等注入工具快速进行渗透测试(相关内容会在第3章中介绍)。如果工具不能满足需求,可以尝试利用手工注入的方法进行渗透测试。
2.1.1 什么是SQL
SQL(Structured Query Language,结构化查询语言)是一种具有特殊目的的编程语言,也是一种数据库查询和程序设计语言,用于存取数据及查询、更新和管理关系型数据库系统。sql是数据库脚本文件的扩展名。
SQL 是一种高级的非过程化编程语言,允许用户在高层数据结构上工作。它既不要求用户指定数据存储方式,也不需要用户了解数据的具体存储方式。它的底层结构极具特色,用户可以将相同的结构化查询语言作为数据输入与管理的接口。SQL 语句可以嵌套,这使它具有极高的灵活性和强大的功能。1986年10月,美国国家标准协会对SQL进行了规范,以此作为关系型数据库管理系统的标准语言(ANSI X3.135-1986)。1987年,SQL得到国际标准组织的支持,成为国际标准。不过,各种通用的数据库系统在实践过程中都对SQL规范进行了编改和扩充,因此,实际上不同数据库系统之间的SQL无法完全相互通用。
结构化查询语言包含以下六个部分。
1.数据查询语言
数据查询语言(Data Query Language,DQL)的语句称为数据检索语句,用于从表中获得数据并确定数据将如何在应用程序中给出。DQL的基本结构是由SELECT子句、FROM子句和WHERE子句组成的查询块,保留字SELECT是DQL(也是所有SQL)使用最多的动词。其他DQL常用保留字有WHERE、ORDER BY、GROUP BY、HAVING,它们常与各种类型的SQL语句一起使用。
2.数据操作语言
数据操作语言(Data Manipulation Language,DML)的语句包括动词INSERT、UPDATE、DELETE,它们分别用于添加、修改、删除表中的行。DML也称为动作查询语言。
3.事务处理语言
事务处理语言(Transaction Processing Language,TPL)的语句能够确保被DML语句影响的表中的所有行及时得到更新。TPL语句包括BEGIN TRANSACTION、COMMIT、ROLLBACK,示例如下。
· GRANT:授权。
· REVOKE:撤销授权。
· ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一点。
· COMMIT [WORK]:提交。
在进行数据库的插入、删除和修改操作时,只有将事务提交到数据库才算完成。在事务提交前,只有操作数据库的人有权看到自己所做的事情,别人只有在事务提交后才可以看到。提交数据有三种类型,分别是显式提交、隐式提交和自动提交。
· 显式提交:用COMMIT命令直接完成的提交称为显式提交,格式为COMMIT。
· 隐式提交:用SQL命令间接完成的提交称为隐式提交,包括ALTER、AUDIT、COMMENT、CONNECT、CREATE、DISCONNECT、DROP、EXIT、GRANT、NOAUDIT、QUIT、REVOKE和RENAME。
· 自动提交:若把AUTOCOMMIT设置为“ON”,则在插入、修改、删除语句执行后,系统将自动进行提交。自动提交的命令格式为“SET AUTOCOMMIT ON”。
4.数据控制语言
数据控制语言(Data Control Language,DCL)用于授予或收回访问数据库的某种特权,并控制数据库操纵事务发生的时间和效果、对数据库进行监视等。DCL语句通过GRANT或REVOKE获得许可,确定单个用户和用户组对数据库对象的访问。对某些RDBMS,可使用GRANT或REVOKE控制对表中某个列的访问。
5.数据定义语言
数据定义语言(Data Definition Language,DDL)的语句包括动词CREATE和DROP,用于创建数据库中的各种对象、表、视图、索引、同义词、聚簇等。DDL包含许多用于从数据库目录中获得数据的保留字,也是动作查询的一部分。
6.指针控制语言
指针控制语言(Cursor Control Language,CCL)的语句用于对一个或多个表中单独的行进行操作,例如DECLARE CURSOR、FETCH INTO和UPDATE WHERE CURRENT。
2.1.2 什么是SQL注入
所谓SQL注入是指攻击者通过把SQL命令插入Web表单并提交,或者通过输入域名或页面请求的查询字符串,达到欺骗服务器执行恶意SQL 命令的目的。除了 URL 提交,攻击者还可能通过抓包的方法在文件头等地方进行SQL注入。
简单地说,SQL注入就是一种通过操作输入(可以是表单、GET请求、POST请求等)插入或修改后台的SQL语句执行代码,从而进行攻击的技术。攻击者使用SQL注入能够访问SQL服务器、在用户特权下执行SQL代码、连接数据库、显示或隐藏查询结果。
2.1.3 SQL注入攻击的产生原因及危害
产生SQL注入攻击的主要原因是:程序员在编写代码的时候,没有对用户输入数据的合法性进行严格的判断和过滤。
轻微的 SQL 注入攻击会导致数据库中的内容被攻击者获取。严重的 SQL 注入攻击会导致服务器权限被非法获取,甚至导致内网或同网段渗透。多年来,SQL注入攻击位列OWASP十大安全漏洞之首,如图2-1所示。
图2-1 OWASP十大安全漏洞
2.1.4 常见的SQL注入工具
下面介绍八种常见的SQL注入工具。读者可以大致了解每种工具的特点,根据本章链接列表中的地址下载相应的工具,进行实战演练。
1.sqlmap
sqlmap是一款综合性的自动SQL注入工具,主要通过Python脚本实现,在Kali等渗透测试平台上是默认配置的。sqlmap 可以执行一个广泛的数据库管理系统后端指纹,检索 DBMS 数据库、usernames、表格、列并列举整个 DBMS 的信息。sqlmap 提供转储数据库表,以及从 MySQL、PostgreSQL、SQL Server服务器下载或上传文件并执行代码的能力。
2.Pangolin
Pangolin是一款帮助渗透测试人员进行SQL注入测试的安全工具。Pangolin与JSky(Web应用安全漏洞扫描器,Web应用安全评估工具)都是NOSEC公司的产品,被国内安全公司360收购,目前已经不再更新了。Pangolin 具备友好的图形界面,支持测试几乎所有数据库,例如 Access、MSSQL、MySQL、Oracle、Informix、DB2、Sybase、PostgreSQL、Sqlite。Pangolin能够通过一系列非常简单的操作达到攻击测试效果,从检测注入到控制目标系统都给出了测试步骤。Pangolin 是国内使用较为广泛的SQL注入测试安全软件。
3.Safe3 SQL Injector
Safe3 SQL Injector是一款易于使用的渗透测试工具,可以自动检测和利用SQL注入漏洞。Safe3 SQL Injector具备读取MySQL、Oracle、PostgreSQL、SQL Server、Access、SQLite、Firebird、Sybase、SAP MaxDB等数据库的能力,同时支持向MySQL、SQL Server写文件,以及在SQL Server和Oracle中执行任意命令。Safe3 SQL Injector也支持基于Error-Based、Union-Based和Blind Time-Based的注入攻击。目前,Safe3 SQL Injector已经不再更新,其早期版本的下载地址见链接2-1。
4.Havij
Havij是一款自动化SQL注入工具,能够帮助渗透测试人员发现和利用Web应用程序的SQL注入漏洞。Havij 不仅能够自动挖掘可利用的 SQL 查询语句,还能识别后台数据库类型、检索数据的用户名和密码散列值、转储表和列、从数据库中提取数据,甚至访问底层文件系统、执行系统命令(当然,前提是有一个可利用的SQL注入漏洞)。Havij支持多种数据库系统,例如MSSQL、MySQL、Access、Oracle。
5.BSQL Hacker
BSQL Hacker是由Portcullis Labs(见链接2-2)开发的,是一款SQL自动注入工具(支持SQL盲注),设计目的是对数据库进行SQL 溢出注入测试。BSQL Hacker可以自动对Oracle和MySQL数据库进行攻击测试,并自动提取数据库的数据和架构,其开源版本的下载地址见链接2-3。
6.The Mole
The Mole(见链接2-4)是一款开源的自动化SQL注入工具,只需提供一个URL和一个可用的关键字就能检测注入点并进行利用。The Mole可以使用联合注入技术和基于逻辑查询的注入技术,使用范围包括SQL Server、MySQL、Postgres和Oracle数据库。
7.SQLninja
SQLninja是用Perl编写的,设计目的是利用Web应用程序中的SQL注入漏洞进行渗透测试。以SQL Server作为后端支持,SQLninja能为存在漏洞的数据库服务器提供一个远程的外壳,甚至在有着严格防范措施的环境中也能如此。其下载地址见链接2-5。
8.sqlsus
sqlsus(见链接2-6)是一款源开的MySQL注入和接管工具,是使用Perl编写的,具有命令行界面。sqlsus可用于获取数据库结构、注入SQL语句、从服务器中下载文件、获取Web站点可写目录、上传和控制后门、克隆数据库等渗透测试工作。