SQL注入
SQL
[toc]
1.1简介
SQL是一种编程语言,用于与关系型数据库系统交互,对数据库进行查询、修改、删除和添加等操作。
1.2重要的SQL命令 ##
select //从数据库里提取数据
update //更新数据库内容
delete //删除数据库内容
insert into //插入新数据
create database //创建新的数据库
alter database //修改数据库
create table //创建新表
alter table //修改表
drop table //删除表
create index //创建引索
drop index //删除引索
1.3 SQL基本知识
1.3.1 SQL语句对大小写不敏感
1.3.2 注释语句
-
--+ MySQL注入中最常见的注释符号
-- 才是MySQL注入真正的注释符号
原因: "+" 会被浏览器进行url编码,编码后是一个空格 - 在mysql中也用#注释
- / ... / :多行注释
1.3.3 部分重要函数
version() //mysql数据库版本
database() //当前数据库名
user() //用户名
current_user() //当前用户名
system_user() //系统用户名
@@datadir //数据库路径
@@version_compile_os //操作系统版本
1.3.4 SELECT 查询语句
select now(); now()时间函数,可以显示现在的时间
select database(); 查看当前选择的库
select version(); 查看mysql版本
select user(); 查看当前数据库用户
select @@datadir; 查看数据路径
select @@basedir; 查看mysql安装路径
select @@version_compile_os; 查看mysql安装的系统
select * from mysql.user; 查询数据 (*表示全部)
1.3.5 UNION 的相关注意事项
- 用于合并两个以上的SELECT语句的结果集
- union前后两个sql语句选择的列数必须相同
- 前假后真,会将后面的结果当作最终结果输出
1.3.6 常见名词
- information_schema 是MySQL自带数据库,用于存储MySQL中的所以数据库、数据表和列。
- information_schema.tables数据库中的表名称
- information_schema.columns 数据库中的列名称
- table_name 表名
- table_schema 数据库名
- "."在数据库中表示下一级
注意!
information_schema.tables 是系统表之一,它包含了当前数据库中所有的表格对象的信息,比如表格名称、表格类型、表格创建时间、表格所属的数据库、表格的引擎类型等等。
table_name 是 information_schema.tables 表格中的一个字段,它用来存储表格对象的名称。因此,table_name 是一个具体的字段,而 information_schema.tables 是一个包含这个字段的表格。
table_schema 是 表所在的数据库名称
1.4 SQL语句的基本结构和常用操作
1.4.1 SQL的基本结构
SQL语句是用于访问和操作关系型数据库的语言,其基本结构由以下三个部分组成: SELECT:用于从数据库中检索数据。 FROM:指定要查询的表名。 * WHERE:用于筛选符合条件的数据。
1.4.2 SQL语句常用操作
- SELECT语句:用于从数据库中检索数据。语法如下:
SELECT column FROM table_name WHERE condition //检索列,from表名,where后面是用于限制的条件
例如,以下SELECT语句检索名为"John"的用户的所有订单号和订单日期:
SELECT order_number, order_date FROM orders WHERE customer_name = 'John'
- INSERT:用于将新数据插入到数据库表中
例如,以下INSERT语句将一个新的用户插入到users表中:
INSERT INTO users (username, email, password) VALUES ('johndoe', 'johndoe@example.com', 'mypassword')
SQL注入 #
2.1 SQL注入产生原因及威胁
2.1.1 SQL产生根本原因
SQL注入是发生于应用程序与数据库层的安全漏洞。
注入的漏洞本质是代码和数据未分离,通过在用户可控参数中注入SQL语法,程序未对输入的指令进行合法性判断,注入进去的恶意指令就会被数据库服务器误认为是正常的SQL指令而运行,破坏原有 SQL 结构,达到编写程序时意料之外结果的攻击行为。
![](C:\Users\57335\Pictures\Screenshots\屏幕截图 2023-04-23 193610.png)
其他原因:
①转义字符处理不合适;②不安全的数据库配置;③不合理的查询集处理;④不当的错误处理
2.1.2 SQL注入的威胁
-
泄露数据库中敏感数据给未授权用户,SQL 注入漏洞可以绕过一些认证,可能导致用户名、账号、密码、手机号码、身份证号码等用户信息的泄露;
-
通过一些精心构造的注入手法,可能会获取到管理员的后台密码,甚至获得非法提权和用户系统的权限;
-
数据结构被黑客探知,得以做进一步攻击;
-
黑客可能会在系统中添加恶意链接、恶意代码等,进行恶意篡改。
2.2 常见的SQL注入 ##
2.2.1常见的SQL注入技术
-
字符型注入:
攻击者在输入框中输入一些恶意的字符,例如单引号、双引号、分号等,来改变SQL查询语句的含义,从而绕过应用程序的身份验证或者窃取数据。
-
数字型注入:
攻击者在输入框中输入一些恶意的数字,例如0或者1,来改变SQL查询语句的含义,从而绕过应用程序的身份验证或者窃取数据。
-
布尔型注入:
攻击者在输入框中输入一些布尔型的值,例如TRUE或者FALSE,来判断SQL查询语句的含义,从而绕过应用程序的身份验证或者窃取数据。
2.2.2 常见的SQL注入分类
- 盲注:
- 布尔注入:从应用返回中推断
- 时间盲注:应用没有明确的回显,只能使用特定的时间函数来判断。例如10s
- 报错注入:应用会显示全部或者部分的报错信息
- 堆叠注入:有的应用可以加入 ; 后一次执行多条语句
- 联合注入:联合查询可以将两个或多个查询的结果组合返回
### 2.2.3 常见注入产生的点 ###
* GET/POST/PUT参数
* GET 注入:提交数据的方式是 GET , 注入点的位置在 GET 参数部分。例如
http://
xxx.com/news.php?
id=1
, id 是注入点。 * POST 注入:使用 POST 方式提交数据,注入点位置在 POST 数据部分,常发生在表单中。 用hackbar可以做到。 * PUT请求:
(PUT 请求方法通常用于修改和更新资源,可以将更新的数据作为请求的主体发送给服务器。GET:仅仅是获取信息)
例如,攻击者可以构造如下的 PUT 请求:
```
PUT /api/products/123 HTTP/1.1
Host: example.com
Content-Type: application/json
Content-Length: 100
{"name": "Product A", "price": 10.0, "stock": 100; DROP TABLE products}