目录
一,注入原理
当Web应用向后台数据库传递SQL语句进行数据库操作时。如果对用户输入的参数没有经过严格的过滤处理,那么攻击者就可以构造特殊的SQL语句,直接输入数据库引擎执行,获取或修改数据库中的数据。
1,sql注入漏洞的本质
将用户输入的数据当做代码来执行
2,sql注入的两个关键条件
2.1,用户能够控制输入的内容
2.2,wed应用吧用户输入的内容带到数据库中执行
3,sql注入的危害
脱库/getshell
二,sql注入的分类
1,根据请求方式不同可以分为
GET方式请求注入
POST方式请求注入
2,根据注入点的参数分
整数型注入
字符型注入
搜索型注入
3,根据sql注入点的反馈类型可以分为以下常见几类
基于错误显示的sql注入
union类型的sql注入
布尔类型的sql注入
基于时间的sql注入
三,万能密码
1,万能密码原理解析:'or 1=1 -- -
后台语句:
select * from admin where username='user' and password='pass'
解释:
查询admin表里的所有username=user并且password=pass的结果,只要结果不为空就为真——就是登陆成功
密码语句:
'or 1=1-- - 解释:-- -和# 为数据库注释符
演变数据库语句成:
select * from admin where username='1' or 1=1-- -and password='pass'
解释:将后面的密码部分给注释掉
四,常用函数
1,作用——返回当前登录mysql数据库的用户
函数:
user(); system_user(); current_user(); session_user(); 函数
mysql用法:select user();
2,作用——查看当前数据库的版本
version(); 函数
用法:select version();
3,作用:查看当前使用的库名
databases;
用法:select databases;
4,作用——返回数据库的存储目录
@@datadir; 函数
用法:select @@datadir;
5,作用——查看服务器操作系统
@@version_compile_os; 函数
用法:select @@version_compile_os;
6,作用——链接两个字符串并传入数据库(多列转换成一列显示)
concat(str1,"分隔符",str2) 函数
实例:select concat(neme,"`",sex) from biaodan;
7,作用——用分隔符链接,多个字段的字符串(多列转换成一列)
concat_ws("~",str1,str2);
用法:select concat_ws(字段名,字段名) from 表名;
8,作用——将多行查询结果以逗号分隔全部输出(多行转换成一行显示)
group_concat(str1,str2)
用法:select group_concat(str1,str2) from biaodan;
实列:select group_concat(字段名,字段名) from 表名;
9,作用——从一个字符串中截取指定数量的字符
mid(); 函数 | substr(); 函数 | substring(); 函数
在mysql数据库中,可以和前面的concat concat_ws 结合使用
用法:select mid(column_name,start,length)
colunm_name:字段名
start:起始位置以数字表示(1)
length:截取的长度
实列:select mid(group_concat(neme,sex),1,5)from 表名;
10,作用——从某个值开始,取出之后的N条数据的语法 (返回结果中的前几条数据或者中间的数据)
limit() 函数
用法:select * from 表名 limit M,N
m是:指从m位开始(第一位为0)
n是:指取n条
11,字符串处理
substr(),substring(),mid():用法基本相同,截取字符串的一部分
语句:select substr(database(),1,3);
解释:截取database()返回的结果,从第一个自负开始截取三个
说明:substr(a,b,c);截取字符串
a 所要截取字符串
b 截取的位置
c 截取的长度
substr使用范围:oracle、mysql、sqlserver
substring使用范围:mysql、sqlserver
mid使用范围:mysql
12,进行16进制编码
hex();
select hex('dvwa') //编码
select unhex('64767761') //解码
select 0x64767761 //16进制解码
13,条件判断语句
关键字:if
if(arg1,arg2,arg3)
arg1为判断的条件,arg2是条件为真时返回的结果,arg3是条件为假时返回的结果
语句:select if(1=1, 'true', 'false‘) 返回结果:true
case when arg1 then arg2 else arg3 end
arg1为判断的条件,arg2是条件为真的返回结果,arg3是条件为假的返回结果
语句:SELECT 1,case when 1=1 then 'hello' else 'goodbye' end,3 --+
length(arg) :返回目标字符串的长度,注意:arg字符串。
语句:select length(database());//返回当前数据库名字的长度
14,加密解密方式
ascii(arg)/ord(arg) :返回目标字符对应的ASCII码,注意:arg为单个字符。
语句:select ascii(‘a’) //返回结果:97
char(arg):返回ASCII码只对应的字符
语句:select char(97) //返回结果为a
hex():将目标字符串装换成16进制格式的数据
语句: select hex(“dvwa”) //返回结果: 64767761
unhex():将16进制格式的数据装换成原字符串
语句:unhex(64767761) //返回结果:dvwa
五,sql注入基本流程
1,判断是否有注入点
2,获取数据库基本信息
3,获取数据库库名
4,获取数据库表名
5,获取数据库列名
6,获取用户信息
7,破解数据
8,提升权限
9,内网渗透