SQL注入--基本概念
SQL注入的定义
-
SQL:是操作数据库数据的结构化查询语言,网页的应用数据和后台数据库中的数据
进行交互时会采用SQL。
-
SQL注入:是将Web页面的原URL、表单域或数据包输入的参数,修改拼接成SQL语
句,传递给Web服务器,进而传给数据库服务器以执行数据库命令。这时相当于用户
控制了后端SQL语句的一部分。它目前是黑客对数据库进行攻击的最常用手段之一。
比如,Web应用程序的开发人员对用户所输入的数据或cookie等内容不进行过滤或验
证(即存在注入点)就直接传输给数据库,就可能导致拼接的SQL被执行,获取对数
据库的信息以及提权,发生SQL注入攻击。
网站结构
- 表示层:前端(用户在浏览器看到的内容)
- 业务逻辑层:后端(对用户提交的数据进行处理的代码,也就是常说的编程语言,比如java、php、python等)
- 数据访问层:数据库(保存数据的地方)
-
SQL注入原理
SQL注入攻击:通过操作输入来修改SQL语句,用以达到执行代码对WEB服务器进行攻击的方法。
SQL注入产生的原因:
当Web应用向后台数据库传递SQL语句进行数据库操作时,如果对用户输入的参数没有
经过严格的过滤处理,那么攻击者就可以构造特殊的SQL语句,直接输入数据库引擎执
行,获取或修改数据库中的数据。简单的说就是在post/get表单或页面请求的查询字符
串中插入SQL语句,最终使web服务器执行恶意命令的过程。可以通过一个例子简单说明
SQL注入攻击。假设某网站页面显示时URL为 http://www.example.com?id=123 ,此时
URL实际向服务器传递了值为123的变量id,这表明当前页面是对数据库进行动态查询的
结果。由此,我们可以在URL中插入恶意的SQL语句并进行执行。另外,在网站开发过程
中,开发人员使用动态字符串构造SQL语句,用来创建所需的应用,这种情况下SQL语句
在程序的执行过程中被动态的构造使用,可以根据不同的条件产生不同的SQL语句,比
如需要根据不同的要求来查询数据库中的字段。这样的开发过程其实为SQL注入攻击留
下了很多的可乘之机。
SQL注入的本质:其实就是把用户输入的数据当做代码来执行,违背了“数据与代码分离”的原则。
SQL注入的两个关键点:
- 用户能够控制输入的内容。
- Web应用把用户输入的内容带入到数据库中执行。
SQL注入分类
-
根据注入位置分类:GET注入、POST注入、Head头注入
-
根据结果反馈分类:有回显注入(联合查询,报错注入,堆叠注入)、无回显注入(布尔盲注,时间盲注)
-
根据数据类型分类:
- 数字型注入:当输入的参数为整型时,如ID、年龄、页码等,如果存在注入漏洞,则可以认为是数字型注入。
- 字符型注入:当输入参数为字符串时,称为字符型。
数字型与字符型注入最大的区别在于:数字型不需要闭合,而字符型一般需要进行闭合。
隐式类型转换
基本概念
- 在 MySQL 中,隐式类型转换是指在某些操作中,MySQL 会自动将一种数据类型转换为另一种数据类型,而不需要用户显式地使用类型转换函数。这种转换通常在比较操作、算术运算或者函数调用等场景下发生。例如,当一个数字和一个字符串进行比较时,MySQL 可能会将字符串转换为数字后再进行比较。
常见场景
-
比较操作
- 数字与字符串比较:如果一个数字和一个字符串进行比较,MySQL 会尝试将字符串转换为数字。例如,在比较5和'5abc'时,MySQL 会将'5abc'转换为数字5(转换时会从字符串开头提取数字部分,直到遇到非数字字符),然后进行比较,此时结果为相等。但是如果字符串以非数字字符开头,如比较5和'abc5',转换后的数字为0,比较结果为不相等。
- 日期与字符串比较:在比较日期类型和字符串类型时,MySQL 也会进行隐式转换。例如,假设date_column是一个日期类型的列,在查询语句SELECT * FROM table_name WHERE date_column = '2024-01-01';中,MySQL 会尝试将字符串'2024-01-01'转换为日期类型,然后与date_column中的日期值进行比较。
-
算术运算
- 数字与字符串运算:当一个数字和一个字符串进行算术运算时,如加法、减法等,MySQL 会将字符串转换为数字。例如,在表达式3 + '4'中,MySQL 会将'4'转换为数字4,然后进行加法运算,结果为7。但如果字符串不能转换为数字,如3 + 'abc',MySQL 会将'abc'转换为数字0,结果为3。
-
函数调用
-
参数类型不符时的转换:
在调用函数时,如果传递的参数类型与函数期望的类型不符,MySQL 可能会进行隐式转换。例如,在使用SUM()函数对一个包含数字和字符串混合的列进行求和时,MySQL 会将字符串转换为数字后再进行求和操作。假设列value_column中有值1、2和'3',执行SELECTSUM(value_column) FROM table_name;时,MySQL 会将'3'转换为数字3,然后计算总和为6。
-