搞懂安全渗透之 SQL 注入(入门篇)

安全渗透的分类

  • web 数据库安全 (SQL注入漏洞)
  • web 应用服务器安全 (文件上传漏洞,文件包含漏洞)
  • web 客户端安全 (XSS跨站攻击)

SQL注入介绍

  • SQL注入在安全问题种排行榜首
  • SQL注入攻击指的是 输入参数未经过滤,然后直接拼到SQL语句当中解析
  • SQL注入是一种将 SQL 代码添加到输入参数中,传递到服务器解析并执行的一种攻击手法

SQL注入原理

  1. 攻击者在页面提交恶意字符
  2. 服务器未对提交参数进行过滤或过滤不足
  3. 攻击者利用拼接SQL语句方式获取数据库敏感信息

举个最简单的例子

在这里插入图片描述

SQL注入的危害

  • 获取 web 网站数据库 ,导致数据泄露
  • 用户数据被非法买卖
  • 危害 web 应用安全
  • 相当于 web 应用在别人面前裸奔

SQL注入的实现方式

  • 手动:人为通过先查找注入点,找到哪些地方可以注入SQL语句,找到以后进行人工操作,人工输入一些SQL常用的注入组合语法,进行注入
  • 自动:利用工具代替人工扫描注入点,然后工具自动尝试各种组合语法,实现注入

SQL注入流程

  1. 收集项目信息【操作系统(Windows还是Linux)、数据库类型、web服务器类型】
  2. 查找注入点【使用 ' # 转移字符\ 等去查找,尤其是' 单引号
  3. 注入sql语句【使用关联语句等】
  4. 获取数据库信息【获取表信息,在获取库信息】
  5. 破解数据库管理员账号密码
  6. 开始 sql shell 等工具登录并获取数据

准备SQL注入环境

  • 准备靶机(一个已经安装了已知漏洞的web应用程序的Linux虚拟机系统)、渗透机(Kali,包含数百种工具,可用于各种信息安全任务,例如渗透测试,安全研究)
  • 一般 Kali 只是新手练习使用,大佬一般都是会自己搭建渗透工具和渗透系统的
  • 靶机和渗透机在虚拟机搭建即可
  • Kali镜像阿里云下载地址
  • 搭建靶机的数据库环境、创建表

在这里插入图片描述

  • 小技巧:在命令行操作数据库时,可以在查询语句后加上\G,可以让查询结果变成以行的方式显示

在这里插入图片描述

基本语句

  • 需要有数据库基础,能对表进行基础的增删改查操作
  • 联合 UNION 语句:SQL 注入漏洞的重点使用方式,即将两条SQL语句联合起来查询,sql1 union sql2
  • 注意:两条SQL语句查询字段数必须相同

SQL语句中 AND 和 OR 的作用

  • 数据库在查询的时候,当扫描到每一行的时候,都会去判断这一行数据对应的 WHERE 语句中的结果是FALSE还是TRUE,如果是 TRUE,则表示该行符合查询条件;如果为FALSE,那就说明这一行不符合查询条件

  • 先假定我们要查询一个名为zhang的用户信息,当username那一列的数据为 zhang 的时候,条件为真,那么这一行就添加到结果集中。
    在这里插入图片描述

  • 添加 AND 语句AND 1=2,很明显 1=2 这个条件不成立,那么再通过 AND 进行 与操作,那么整个 WHERE 语句的逻辑就必定为 FALSE,因此整个数据库中没有满足条件的数据行;

  • 添加 OR 语句 OR 1=2,尽管 1=2 这个条件不成立,但是数据库一旦扫描到 username = 'zhang' 这一列的时候, 前面的条件为真,再通过 或操作 连接上后面的语句,WHERE 语句的逻辑仍为真,则该数据行为查询的结果;
    在这里插入图片描述

  • 那如果我随便查询一个用户呢?分别又对应什么情况呢?
    在这里插入图片描述

  • OR 1=1这个条件永远为真,数据库中的每一行,都符合这个条件,就会输出数据库中所有内容

UNION 基本使用:查询用户名和密码(相同的字段数,查询成功)

在这里插入图片描述

练习2:查询所有字段(数据库会报错)

在这里插入图片描述

那该怎么办呢?

  • 我们可以使用数字代替列,猜测前面表查询的列数

在这里插入图片描述

  • 可以看出,这个表内有11列;
  • SQL注入漏洞,就是通过拼接 union 后的语句实现获取数据库的隐私信息

SQL注入 - 特殊库

  • 数据库库名:information_schema,用于存储 MySQL 中所有的库名,表名,列名,是 MySQL 数据的字典
  • 因此 SQL注入 经常会从此库中获取需要的库名、表名、字段名
  • 还有 tables表(记录MySQL库中所有的表)、columns表(记录MySQL库中所有的表和列)

操作特殊库

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

思考

  • 如何在特殊库中获得 show databases 相同的效果呢?
  • 如何在特殊库中获得 show tables 相同的效果呢?
# 效果等同于 show databases
# 查询 TABLE_SCHEMA 字段 同时使用 DISTINCT 去重
select DISTINCT TABLE_SCHEMA from information_schema.TABLES;

# 效果等同于 show tables
# 查询 TABLE_NAME 字段,同时使用 DISTINCT 去重
select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='library';

在这里插入图片描述

在这里插入图片描述

SQL注释

  • 什么叫注释?注释语句即不会执行的代码。
  • 在SQL注入中可以将查询条件注释掉
  • 注释分为单行注释多行注释

单行注释

# 第一种 #
select * from users;#查询user表的所有信息
# 第二种 -- 注意 --后面需要有一个空格  即'-- '
select * from users;-- 查询user表的所有信息

多行注释

/* 这是多行注释 */

在这里插入图片描述

场景1

  • 在前端提交表格,后台验证用户名和密码时,一般会使用SQL语句拼接的形式,例如
select * from user where username = $user AND password = $pwd;
  • 如果这个时候,输入的$useradmin';#时,SQL语句拼接后就变为
  • 输入 单引号' 相当于将sql语句闭合,后面就可以使用附加其他逻辑条件了
  • 输入 分号; 相当于表示语句结束
  • 输入 井号# 相当于注释掉后面的内容
 select username,password from user where username='admin';#' and password='admin';
  • 这样就会将后面的密码验证条件给注释掉了,获取用户名密码之后就可以登录系统了;
    在这里插入图片描述

SQL注入测试:手动注入

  • 启动靶机

  • 通过ip地址,访问可视化界面
    在这里插入图片描述

  • 登录,用户名和密码都为 admin

  • 选择SQL注入
    在这里插入图片描述

  • 查找注入点:主要采用 单引号、 转义字符 \ 、其中以单引号为主

  • 原理:在查询条件中输入单引号,相当于将SQL语句闭合了,后面就可以附加其他逻辑条件了
    在这里插入图片描述

  • 查找注入点最经典的方法就是:当只输入一个单引号提交,看看是否报错,如果报语法错,就说明后台没有对语句过滤;
    在这里插入图片描述

  • 上面报了单引号的语法错误,说明后台是没有进行过滤的,那查看一下源代码确认一下
    在这里插入图片描述

  • 找到注入点后,可以尝试获取数据库数据

  • SQL注入经常使用逻辑或来获取当前表的所有信息,通过 逻辑或 来让条件永远成立,这样也就是SQL语句中的条件给忽略掉。

在这里插入图片描述

  • 这个时候,可以直到这个输入框提交后可以获得 FirstnameSurname,并没有获得密码

  • 于是我们可以使用 UNION 联合语句来获得整个表的数据

  • 首先要先猜测列数,这样就可以使用联合语句。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 再获取数据库名
    在这里插入图片描述

  • 然后就可以通过数据库,获取数据库下所有的表,从特殊库中获取所有的表名
    在这里插入图片描述

  • 再通过特殊库和已知的表名,获取表中所有的数据
    在这里插入图片描述

  • 这样就获取到了数据库内的所有数据‘

但是上面有一个问题,就是我获取的数据只能跟原来后台中默认的 查询语句 中的查询字段数一样,由于 UNION 语句的限制,只能获取相同字段数的数据。

  • 我们可以使用 concat函数concat函数可以拼接多个字符串为一个字符串
    在这里插入图片描述

在这里插入图片描述

  • 在靶机中测试一下:获取三列数据
    在这里插入图片描述

  • 这样就分分钟都可以获取表中所有的数据了,轻松无压力。

  • 这样也就可以看出密码在数据库中也加密的重要性,这样即使密码丢失了,也可以保证密码不被别人破译掉,当然,这也需要看密码的加密措施

自动注入

  • 自动注入是指利用工具代替人工去完成sql注入操作
  • 可以使用一个开源的渗透测试工具 :sqlmap,自动检测和利用sql注入漏洞并接管数据库服务器
  • sqlmap 也是Kali 自带的工具

使用步骤

  1. 启动虚拟机进入系统:用户名:root;密码:toor
  2. 输入命令 sqlmap -h 查看命令帮助
  3. 可以看到非常多的命令,这个需要详细深入的去学习

基本用法

命令: sqlmap 参数
-u 扫描的目标url
--batch 自动处理提示信息
--cookie 附加cookie参数

例子: sqlmap --batch -u "http://地址?id=1" --cookie ="..."

案例:使用 sqlmap对OWAP应用注入获取 users 表中的所有用户名和密码

准备

  • 启动靶机、启动渗透机
  • URL:http://靶机ip/dvwa/vulnerabilities/sqli/?id=6&Submit=Submit#
  • URL就是提交的URL,可与通过网络抓包的方式获取
  • Cookie参数如果需要也要填上,因为一些网站应用没有Cookie会重定向到登录页面,这样就没有意义了

实施步骤:

  1. 扫描注入点
  2. 获取数据库名
  3. 获取表名
  4. 获取字段名
  5. 获取数据

步骤截图:
在这里插入图片描述

  • 找到注入点,并注入成功
    在这里插入图片描述

  • sqlmap 获取数据库名:--current-db 查询当前使用的数据库名,查询到数据库后可以使用-D指定数据库
    在这里插入图片描述
    在这里插入图片描述

  • sqlmap 获取表:--tables 查询指定库下所有表名 需要先使用 -D 指定库名,查询到所有表后,可以 使用-T指定表
    在这里插入图片描述
    在这里插入图片描述

  • sqlmap 获取列:--columns 查询指定标下所有字段 需要先使用 -T 指定表,查询到所有字段后,可以使用-C指定字段名
    在这里插入图片描述
    在这里插入图片描述

  • sqlmap 获取数据:--dump 下载数据,如果不用 --dump下载,也可以执行,只是数据在文件里
    在这里插入图片描述
    在这里插入图片描述

  • 括号中的内容是工具自动将MD5加密的密码进行解密后的值

  • 众所周知,MD5是不可逆的加密算法,这里的解密其实是一种伪解密,利用海量的字符串加密成字典来匹配,进行解密。

小结

安全渗透原理

  • 攻击者在页面提交恶意字符
  • 服务器对提交参数未过滤或过滤不足
  • 攻击者利用拼接sql语句方式获取数据库敏感信息

猜你喜欢

转载自blog.csdn.net/Kobe_k/article/details/107473756