SQL注入

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 参数部分。例如 xxx.com/news.php? , 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}