信息安全实验六 之SQL注入基础原理&实践
叮嘟!这里是小啊呜的学习课程资料整理。好记性不如烂笔头,今天也是努力进步的一天。一起加油进阶吧!
一、实验说明
SQL 注入攻击通过构建特殊的输入作为参数传入 Web 应用程序,而这些输入大都是 SQL 语法里的一些组合,通过执行 SQL 语句进而执行攻击者所要的操作,本章课程通过 LAMP 搭建 S 注入环境,两个实验分别介绍 SQL 注入爆破数据库、SQL 注入绕过验证两个知识点。
1.1 实验知识点
SQL 注入漏洞的原理
SQL 注入点的判断方法
SQL 注入漏洞的分类
1.2 适合人群
本课程难度为简单,属于初级级别课程,适合具有一点 SQL 语法基础的用户。
二、实验原理
SQL 注入攻击是通过将恶意的 SQL 查询或添加语句插入到应用的输入参数中,再在后台 SQL 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手段之一。
三、Web 程序三层架构
三层架构(3-tier architecture) 通常意义上就是将整个业务应用划分为:
界面层(User Interface layer)
业务逻辑层(Business Logic Layer)
数据访问层(Data access layer)。
区分层次的目的即为了“高内聚低耦合”的思想。在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构被应用于众多类型的软件开发。
由数据库驱动的 Web 应用程序依从三层架构的思想也分为了三层:
表示层。
业务逻辑层(又称领域层)
数据访问层(又称存储层)
拓扑结构如下图所示
在上图中,用户访问实验楼主页进行了如下过程:
在 Web 浏览器中输入 www.shiyanlou.com 连接到实验楼服务器。
业务逻辑层
的 Web 服务器从本地存储中加载 index.php 脚本并解析。
脚本连接位于数据访问层的 DBMS(数据库管理系统),并执行 SQL 语句。
数据访问层
的数据库管理系统返回 SQL 语句执行结果给 Web 服务器。
业务逻辑层
的 Web 服务器将 Web 页面封装成 HTML 格式发送给表示层的 Web 浏览器。
表示层
的 Web 浏览器解析 HTML 文件,将内容展示给用户。
在三层架构中,所有通信都必须要经过中间层,简单地说,三层架构是一种线性关系。
四、SQL 注入漏洞
4.1 SQL 注入产生原因及威胁
当我们访问动态网页时, Web 服务器会向数据访问层发起 SQL 查询请求,如果权限验证通过就会执行 SQL 语句。
这种网站内部直接发送的 SQL 请求一般不会有危险,但实际情况是很多时候需要结合用户的输入数据动态构造 SQL 语句,如果用户输入的数据被构造成恶意 SQL 代码,Web 应用又未对动态构造的 SQL 语句使用的参数进行审查,则会带来意想不到的危险。
SQL 注入带来的威胁主要有如下几点:
1、猜解后台数据库,这是利用最多的方式,盗取网站的敏感信息。
2、绕过认证,列如绕过验证登录网站后台。
3、注入可以借助数据库的存储过程进行提权等操作。
4.2 SQL 注入示例一:猜解数据库
实践过程截图:
4.3 SQL 注入实例二:验证绕过
实践过程截图:
五、判断 SQL 注入点
通常情况下,可能存在 SQL 注入漏洞的 URL 是类似这种形式 :http://xxx.xxx.xxx/abcd.php?id=XX
对 SQL 注入的判断,主要有两个方面:
判断该带参数的 URL 是否存在 SQL 注入?
如果存在 SQL 注入,那么属于哪种 SQL 注入?
可能存在 SQL 注入攻击的 ASP/PHP/JSP 动态网页中,一个动态网页中可能只有一个参数,有时可能有多个参数。有时是整型参数,有时是字符串型参数,不能一概而论。总之只要是带有参数的动态网页且此网页访问了数据库,那么就有可能存在 SQL 注入。如果程序员没有足够的安全意识,没有进行必要的字符过滤,存在 SQL 注入的可能性就非常大。
5.1 判断是否存在 SQL 注入漏洞
最为经典的单引号判断法:
在参数后面加上单引号,比如:
http://xxx/abc.php?id=1'copy
如果页面返回错误,则存在 SQL 注入。
原因是无论字符型还是整型都会因为单引号个数不匹配而报错。
(如果未报错,不代表不存在 SQL 注入。因为有可能页面对单引号做了过滤,这时可以使用判断语句进行注入。)
5.2 判断 SQL 注入漏洞的类型
通常 SQL 注入漏洞分为 2 种类型:
数字型
字符型
其实所有的类型都是根据数据库本身表的类型所产生的,在我们创建表的时候会发现其后总有个数据类型的限制,而不同的数据库又有不同的数据类型,但是无论怎么分常用的查询数据类型总是以数字与字符来区分的,所以就会产生注入点为何种类型。
5.2.1 数字型判断
当输入的参数 x 为整型时,通常 abc.php 中 SQL 语句类型大致如下:
select * from <表名> where id = x
这种类型可以使用经典的 and 1=1 和 and 1=2
来判断:
URL 地址中输入 http://xxx/abc.php?id= x and 1=1
页面依旧运行正常,继续进行下一步。
URL 地址中继续输入 http://xxx/abc.php?id= x and 1=2
页面运行错误,则说明此 SQL 注入为数字型注入。
原因如下:
当输入 and 1=1 时,后台执行 SQL 语句:
select * from <表名> where id = x and 1=1
没有语法错误且逻辑判断为正确,所以返回正常。
当输入 and 1=2 时,后台执行 SQL 语句:
select * from <表名> where id = x and 1=2
没有语法错误但是逻辑判断为假,所以返回错误。
我们再使用假设法:如果这是字符型注入
的话,我们输入以上语句之后应该出现如下情况:
select * from <表名> where id = 'x and 1=1'
select * from <表名> where id = 'x and 1=2'
查询语句将 and 语句全部转换为了字符串,并没有进行 and 的逻辑判断,所以不会出现以上结果,故假设是不成立的。
5.2.2 字符型判断
当输入的参数 x 为字符型时,通常 abc.php 中 SQL 语句类型大致如下:
select * from <表名> where id = 'x'
这种类型我们同样可以使用 and '1'='1 和 and '1'='2
来判断:
URL 地址中输入 http://xxx/abc.php?id= x’ and ‘1’=‘1 页面运行正常,继续进行下一步。
URL 地址中继续输入 http://xxx/abc.php?id= x’ and ‘1’='2 页面运行错误,则说明此 SQL 注入为字符型注入
。
原因如下:
当输入 and ‘1’='1时,后台执行 SQL 语句:
select * from <表名> where id = 'x' and '1'='1'
语法正确,逻辑判断正确,所以返回正确。
当输入 and ‘1’='2时,后台执行 SQL 语句:
select * from <表名> where id = 'x' and '1'='2'
语法正确,但逻辑判断错误,所以返回错误。同样可以使用假设法来验证。
六、 总结
SQL 注入常用技术有段还包括:
采用非主流通道技术
避开输入过滤技术
使用特殊的字符
强制产生错误
使用条件语句
利用存储过程
推断技术等
Ending!
更多课程知识学习记录随后再来吧!
就酱,嘎啦!
注:
1、人生在勤,不索何获。
2、SQL注入基础原理实践参见:https://www.lanqiao.cn/courses/876/learning/