一、介绍
SQL 注入攻击是网络上非常常见的一种攻击!
黑客通过将恶意的 SQL 查询或者添加语句插入到应用的输入参数中,然后在后台 SQL 服务器上解析执行进行程序攻击!
哪黑客具体是如何将恶意的 SQL 脚本进行植入到系统中,从而达到攻击的目的呢?
现在的 Web 程序基本都是三层架构,也就是我们常说的 MVC 模式:
- 表示层:用于数据的展示,也就是前端界面
- 业务逻辑层:用于接受前端页面传入的参数,进行逻辑处理
- 数据访问层:逻辑层处理完毕之后,会将数据存储到对应的数据库,例如mysql、oracle、sqlserver等等
例如在上图中,用户访问主页进行了如下过程:
- 1、在 Web 浏览器中输入
www.shiyanlou.com
接到对应的服务器 - 2、
Web
服务器从本地存储中加载index.php
脚本程序并解析 - 3、脚本程序会连接位于数据访问层的
DBMS
(数据库管理系统),并执行Sql
语句 - 4、数据库管理系统返回
Sql
语句执行结果给Web
服务器 - 5、
Web
服务器将页面封装成HTML
格式发送给Web
浏览器 - 6、
Web
浏览器解析HTML
文件,将内容展示给用户
整个过程中间的业务逻辑层只是进行逻辑处理,从用户到获取数据,简单的说,三层架构是一种线性关系。
二、SQL 注入漏洞详解
刚刚我们也讲到,当我们访问网页时,Web 服务器会向数据访问层发起 SQL 查询请求,如果权限验证通过就会执行 SQL 语句。
一般来说,如果是正常使用是不会有什么危险的,但是如果用户输入的数据被构造成恶意 SQL 代码,Web 应用又未对动态构造的 SQL 语句使用的参数进行检查,则会带来意想不到的危险!
废话也不多说来,下面我们就一起来看看,黑客是如何绕过参数检查,从而实现窃取数据的目的!
2.1、SQL 注入示例一:猜解数据库
下面我们使用DVWA 渗透测试
平台,作为攻击测试的目标,让你更加清楚的理解 SQL 注入猜解数据库是如何发生的。
启动服务之后,首先观察浏览器中的URL
,先输入 1 ,查看回显!
从图中可以看出,ID : 1,First Name:admin,Surname:Admin
信息!
那后台执行了什么样的 SQL 语句呢?点击view source
查看源代码 ,其中的 SQL 查询代码为:
SELECT first_name, last_name FROM users WHERE user_id = '1';
OK!
如果我们不按常理出牌,比如在输入框中输入1' order by 1#
。
实际执行的 SQL 语句就会变成这样:
SELECT first_name, last_name FROM users WHERE user_id = '1' order by 1#
这条语句的意思是查询users
表中user_id
为1
的数据并按第一字段排行。
其中#
后面的 SQL 语句,都会当作注释进行处理,不会被执行!
输入 1' order by 1#
和 1' order by 2#
时都能返回正常!
当输入1' order by 3#
时,返回错误!
由此得知,users
表中只有两个字段,数据为两列!
接下来,我们玩点高级的!
我们使用union select
联合查询继续获取信息!
直接在输入框中输入1' union select database(),user()#
进行查询!