安全渗透的分类
- web 数据库安全 (SQL注入漏洞)
- web 应用服务器安全 (文件上传漏洞,文件包含漏洞)
- web 客户端安全 (XSS跨站攻击)
SQL注入介绍
- SQL注入在安全问题种排行榜首
- SQL注入攻击指的是 输入参数未经过滤,然后直接拼到SQL语句当中解析
- SQL注入是一种将 SQL 代码添加到输入参数中,传递到服务器解析并执行的一种攻击手法
SQL注入原理
- 攻击者在页面提交恶意字符
- 服务器未对提交参数进行过滤或过滤不足
- 攻击者利用拼接SQL语句方式获取数据库敏感信息
举个最简单的例子
SQL注入的危害
- 获取 web 网站数据库 ,导致数据泄露
- 用户数据被非法买卖
- 危害 web 应用安全
- 相当于 web 应用在别人面前裸奔
SQL注入的实现方式
- 手动:人为通过先查找注入点,找到哪些地方可以注入SQL语句,找到以后进行人工操作,人工输入一些SQL常用的注入组合语法,进行注入
- 自动:利用工具代替人工扫描注入点,然后工具自动尝试各种组合语法,实现注入
SQL注入流程
- 收集项目信息【操作系统(Windows还是Linux)、数据库类型、web服务器类型】
- 查找注入点【使用
' # 转移字符\ 等
去查找,尤其是' 单引号
】 - 注入sql语句【使用关联语句等】
- 获取数据库信息【获取表信息,在获取库信息】
- 破解数据库管理员账号密码
- 开始 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;
- 如果这个时候,输入的
$user
为admin';#
时,SQL语句拼接后就变为 - 输入 单引号
'
相当于将sql语句闭合,后面就可以使用附加其他逻辑条件了 - 输入 分号
;
相当于表示语句结束 - 输入 井号
#
相当于注释掉后面的内容
select username,password from user where username='admin';#' and password='admin';
- 这样就会将后面的密码验证条件给注释掉了,获取用户名密码之后就可以登录系统了;
SQL注入测试:手动注入
-
启动靶机
-
通过ip地址,访问可视化界面
-
登录,用户名和密码都为
admin
-
选择SQL注入
-
查找注入点:主要采用 单引号、 转义字符 \ 、其中以单引号为主
-
原理:在查询条件中输入单引号,相当于将SQL语句闭合了,后面就可以附加其他逻辑条件了
-
查找注入点最经典的方法就是:当只输入一个单引号提交,看看是否报错,如果报语法错,就说明后台没有对语句过滤;
-
上面报了单引号的语法错误,说明后台是没有进行过滤的,那查看一下源代码确认一下
-
找到注入点后,可以尝试获取数据库数据
-
SQL注入经常使用逻辑或来获取当前表的所有信息,通过 逻辑或 来让条件永远成立,这样也就是SQL语句中的条件给忽略掉。
-
这个时候,可以直到这个输入框提交后可以获得
Firstname
和Surname
,并没有获得密码 -
于是我们可以使用 UNION 联合语句来获得整个表的数据
-
首先要先猜测列数,这样就可以使用联合语句。
-
再获取数据库名
-
然后就可以通过数据库,获取数据库下所有的表,从特殊库中获取所有的表名
-
再通过特殊库和已知的表名,获取表中所有的数据
-
这样就获取到了数据库内的所有数据‘
但是上面有一个问题,就是我获取的数据只能跟原来后台中默认的 查询语句 中的查询字段数一样,由于 UNION 语句的限制,只能获取相同字段数的数据。
- 我们可以使用
concat函数
,concat函数
可以拼接多个字符串为一个字符串
-
在靶机中测试一下:获取三列数据
-
这样就分分钟都可以获取表中所有的数据了,轻松无压力。
-
这样也就可以看出密码在数据库中也加密的重要性,这样即使密码丢失了,也可以保证密码不被别人破译掉,当然,这也需要看密码的加密措施
自动注入
- 自动注入是指利用工具代替人工去完成sql注入操作
- 可以使用一个开源的渗透测试工具 :
sqlmap
,自动检测和利用sql注入漏洞并接管数据库服务器 sqlmap
也是Kali 自带的工具
使用步骤
- 启动虚拟机进入系统:用户名:
root
;密码:toor
- 输入命令
sqlmap -h
查看命令帮助 - 可以看到非常多的命令,这个需要详细深入的去学习
基本用法
命令: 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会重定向到登录页面,这样就没有意义了
实施步骤:
- 扫描注入点
- 获取数据库名
- 获取表名
- 获取字段名
- 获取数据
步骤截图:
-
找到注入点,并注入成功
-
sqlmap 获取数据库名:
--current-db 查询当前使用的数据库名
,查询到数据库后可以使用-D
指定数据库
-
sqlmap 获取表:
--tables 查询指定库下所有表名 需要先使用 -D 指定库名
,查询到所有表后,可以 使用-T
指定表
-
sqlmap 获取列:
--columns 查询指定标下所有字段 需要先使用 -T 指定表
,查询到所有字段后,可以使用-C
指定字段名
-
sqlmap 获取数据:
--dump 下载数据
,如果不用--dump
下载,也可以执行,只是数据在文件里
-
括号中的内容是工具自动将MD5加密的密码进行解密后的值
-
众所周知,MD5是不可逆的加密算法,这里的解密其实是一种伪解密,利用海量的字符串加密成字典来匹配,进行解密。
小结
安全渗透原理
- 攻击者在页面提交恶意字符
- 服务器对提交参数未过滤或过滤不足
- 攻击者利用拼接sql语句方式获取数据库敏感信息
更多推荐
搞懂安全渗透之 SQL 注入(入门篇)
发布评论