1.前言
SQL注入是Web安全层面最高危的漏洞之一,长期霸榜OWASP Top10首位,但是究竟什么事SQL注入?SQL注入又是怎么产生的?接下来本篇文章将详细介绍SQL注入产生的原理。本篇文章并没有描述具体的注入方法,而是侧重于对原理的描述,并分别分析了GET和POST注入。
2.实验环境搭建
在弄清SQL注入的基本原理之前,我们首先要来搭建实验的环境,我们需要一台L(Linux)NMP服务器或者W(Windows)NMP服务器,具体服务器的搭建可以参考我之前的文章《一篇文章告诉你如何搭建LNMP》,或者直接使用phpStudy完成搭建。
完成服务器的搭建后,我们要准备好测试用的数据库,执行下面的SQL命令完成数据库的建立
create database SQLInjection;
use SQLInjection
create table users(id int,username varchar(255),password varchar(255));
1
2
3
创建完成后,可以插入几条用于测试的数据
insert into users value(1,'Tom','123456');
insert into users value(2,'Alice','654321');
insert into users value(3,'Jerry','qwerty');
1
2
3
3.原理介绍
3.1 HTTP协议
HTTP协议是Web应用层协议,全称是超文本传输协议。这个协议是Web应用的核心,HTTP由两个程序实现,一个是客户端程序,通常是我们使用的浏览器,一个是服务器程序,运行在我们所访问俄的服务器上。这两个程序通过HTTP协议进行交流,HTTP定义了这些报文的语法、语义和时序。这里我们并不需要对HTTP协议做过深的了解。但是我们依旧需要明确以下几个知识点:
1.客户端程序与服务器程序之间是通过报文进行交流的,通常是客户端请求数据,服务器响应客户端请求的数据;
2.报文是包含了不同的字段,不同的字段代表的不同的信息
3.报文中携带了客户端程序与服务器程序之间通信的数据
4.数据在报文中的位置不同,服务器接收该数据的方式也不同
1
2
3
4
3.1.1 HTTP报文
客户端与服务器端的报文,根据发送方的不同被分为请求报文和响应报文,从客户端发往服务器端的被称为请求报文,从服务器端发往客户端的被称为响应报文。请求报文和响应报文都有不同的固定格式,请求报文的一般报文格式如下
在这里插入图片描述
响应报文的一般格式如下
在这里插入图片描述
因为本文主要主要讲述的是SQL注入,SQL注入我们是无法操作服务器的,只能通过影响从客户端发送的请求报文进而从服务器获取数据,所以我们只需要了解请求报文,在上面的请求报文结构图中,我们可以看到请求报文主要包含请求行、首部行、空行、实体体4个模块。各个模块的功能说明如下
模块名 说明
请求行 方法 说明传递数据的方法
URL 指明想要访问的文件
版本 协议的版本HTTP /1.1
首部行 首部行中包含众多的字段,不同的报文可能会携带不同的字段,在请求报文中主要用来说明客户端的相关信息
空行
实体体 当使用POST方式传递数据的时候,该模块会填充POST想要传递的数据
在前面的内容中不断的提到数据的传递,数据传递的方法会在请求行的方法中说明,主要有4种数据传递的方法,这里只介绍两种与SQL注入有关的
3.1.2 GET方法
当请求报文的方法字段被设置为GET的时候,表明该请求报文使用GET方式进行传参。通常GET方法是用来获取服务器上的指定文件,比如
GET /index.php HTTP/1.1
1
上面的请求行用来获取网站根目录下的index.php文件,当站点接收到该请求后会将用户请求的文件内容进行解析,然后通过响应报文响应用户的请求。但是也会遇到某些文件需要接收参数的情况,客户端程序会使用下面的方式对文件完成传参
GET /index.php?id=1 HTTP/1.1
1
这样服务器上的文件便能够接受id=1的传参。然后根据用户的传参作出响应的处理。
3.1.3 POST方法
当请求报文的方法字段被设置为POST的时候,表明该请求报文使用POST方式进行传参。通常POST方式用来提交用户输入的表单信息,这些协议存放在请求报文的实体体中。比如
POST /user/login.html HTTP/1.1
//......
user=admin&pass=admin
1
2
3
上面是一个用户登录报文的示例,通过POST方式提交用户输入的用户名和密码。
3.1.4 从页面到报文