一、研究背景
SQL注入攻击是一种常见的Web应用程序安全漏洞,攻击者可以利用该漏洞来访问或修改应用程序中的数据库,从而导致数据泄露、数据损坏、拒绝服务攻击和非法数据操作等安全问题。这些安全问题可能对个人、组织、企业和政府等造成重大的财务和声誉损失,同时也会对用户的个人隐私和数据安全造成威胁。
鉴于SQL注入攻击的广泛性和危害性,研究如何有效地防范SQL注入攻击显得尤为重要。本文旨在介绍SQL注入攻击的设计和实现方法,并探讨防范SQL注入攻击的方法,为Web应用程序的安全提供指导和帮助。
通过研究SQL注入攻击的设计和实现,本文可以深入了解SQL注入攻击的原理和实现过程,为攻击者和安全研究人员提供参考和借鉴。同时,本文也可以帮助Web应用程序的开发人员、管理人员和安全人员了解SQL注入攻击的危害和预防措施,从而提高Web应用程序的安全性和可靠性。
二、研究目的和内容
研究内容是SQL注入攻击的设计与实现。针对SQL注入攻击的定义、类型、实现方法和防范措施进行深入研究和探讨,并通过一个简单的SQL注入攻击实例来说明SQL注入攻击的危害和如何防范该攻击。
1、概述SQL注入攻击的定义和背景,提出SQL注入攻击的危害。
2、介绍SQL注入攻击的类型,包括基于错误的SQL注入攻击、基于盲注的SQL注入攻击。
三、SQL注入攻击的实现
3.1攻击测试环境
目标机器的环境 :虚拟机:VMware WorkStation 15 Pro
操作系统:Ubuntu 18.04 64 位
处理器内核总数:4
分配给虚拟机内存大小:8GB
编辑器:Vscode 1.42.1 mysql Ver 14.14 Distrib 5.7.30 PHP 7.2.24-0ubuntu0.18.04.4 (cli) Apache/2.4.29 (Ubuntu)
Python 3.7.3
3.2目标机器的构建
这次攻击测试搭建的目标机器运行在虚拟机 VMware 上的 Ubuntu18.04,然后进行配置LAMP 环境。将projet 移至/var/www/SQL_injection/下,即可访问网站。访问网址是http://192.168.254.147/SQL_injection/main.php# ,其中 192.168.254.147是Ubuntu18.04 的 IPv4 地址,下图3-1是数据库secure_info中的users表的全部信息(其中cancel 列,值为 1,表示已被注销,查询时不显示,值为 0,表示未注销):
图 3-1 数据库 secure_info 中的 users 表的全部信息
3.3 SQL 注入
选择"low"选项,此时不对查询语句进行任何过滤操作,查询操作有两种:通过输入账号和密码,登录用户账号,或者通过用户 ID 查询用户信息(见图 3-2,图 3-3,图3-4)。常见的 SQL 注入有五种:检索隐藏数据库、破坏应用逻辑、检索数据库、UNION 攻击,和盲 SQL 注入。下述内容将对 low 级别的网页进行上述五种攻击,并提出综合的解决方案。
图 3-2 选择安全模式
图 3-3 low 模式下主页面
图 3-4 查询用户 1 的返回结果
3.4检索隐藏数据
检索隐藏数据(Retrieving hidden data),一般情况下,借助 ' # ' /' --'(注释), ' ' '等特殊字符,将查询语句的后半部分注释掉,达到去除部分限制条件的目的,并在' # '前,' ' '后加入某个 sql 语句,返回隐藏数据。
图 3-5 输入 3' or 1 = 1#
图 3-6 返回结果
3.5破怀应用逻辑
以下图 3-7 , 3-8 例子说明破坏应用逻辑(Subverting application logic)。进入个人主页, 在用户 ID 中输入" 3'# ",不输入用户密码, 可以直接登入个人主页。可以看到查询语句变为" SELECT user_id, first_name, last_name, user, last_login, sex, email FROM usersWHERE user_id = 3 # AND password='' AND cancel = 0 LIMIT 1"," # "将后面的语句全部注释了,不需要输入密码也能进入个人主页,破坏原有账号-密码的应用逻辑,成功以攻击者身份登入系统。
图 3-7 在用户 ID 中输入 3 #,不输入密码
图 3-8 返回结果
3.6检索数据库
图 3-10 展示了返回结果,查询语句为"SELECT first_name, last_name, user, last_login FROM users WHERE user_id = 0 union SELECT TABLE_NAME,COLUMN_NAME,
DATA_TYPE,NULLFROMinformation_schema.columnswheretable_schema = 'secure_info' # AND cancel = 0,这里同样借助了注释符,其中 NULL 可以接收任何类型的数据,可以看到原本的 First Name,Last Name, NickName,现在分别对应TABLE_NAME,COLUMN_NAME,DATA_TYPE,成功获取得到数据库中表的信息,为后续进一步查询具体信息做准备。
图 3-9 在第二栏的用户 ID 中输入有关信息
图 3-10 返回结果
3.7UNION 攻击
当应用程序可被 SQL 注入,并且查询结果在应用程序的响应中返回时,可通过
UNION 关键字执行一条或多条关键字,并将结果对应于原始查询中。UNION 攻击必须满足两个条件,第一,各个查询必须返回相同数目的列;第二,每列中的数据类型必须在各个查询之间兼容。第一个条件可以利用"1 order by 1 #", "1 order by 2", "1 order by 3"等语句获取得到返回列数,具体来说,ORDER BY 子句中的列可以由其索引指定,因此不需要任何列名,当列数超过结果集的实际列数时,数据库将返回一个错误或者显示无结果;第二个条件可以利用 NULL,原因在于NULL 可转换为任一常见的数据类型。
图 3-11 在第一栏的用户 ID 中输入有关信息
图 3-12 返回结果
3.8盲 SQL 注入
当应用程序可被 SQL 注入但其 HTTP 响应不包含相关 SQL 查询的结果或任何数据库错误的详细信息时,大多数注入技术将无效, 这时可以采用盲 SQL 注入技术。常见有盲注入技术有基于布尔型盲注,基于时间盲注, 基于报错盲注等。本实验的 SQL 注入脚本中采用了基于布尔型盲注和基于时间盲注。
四、总结
通过对SQL注入攻击的定义、类型、实现方法和防范措施的介绍,提高了人们对Web应用程序安全的认识,帮助人们更好地了解SQL注入攻击的危害和防范措施。说明了SQL注入攻击的危害和如何防范该攻击,强调了输入验证和参数化查询的重要性。SQL注入漏洞攻击在网上非常普遍,许多ASP、PHP论坛和文章管理系统、系统以及新闻系统都存在这个漏洞。造成SQL注入漏洞攻击的主要原因是开发人员在系统开发的过程中编程不规范,没有形成良好的编程习惯,问题的解决只有依赖于规范编程。总之,SQL注入攻击是Web应用程序安全领域的一个重要问题,需要我们持续关注和研究,以更好地保护Web应用程序的安全。
参考文献
[1]朱静雯,许静,陈亮,李洁.基于隐马尔可夫模型的SQL注入攻击行为检测[J].计算机应用与软件,2023
[2]唐俊,赵素云.Web应用的漏洞分析与研究[J].软件,2022
[3]王天骄. SQL注入样本自动生成技术的研究与实现[D].西南交通大学,2019
[4]张晓峰.数据维护审计平台的设计与应用——以在中国电信IT行业的运营为例[J].现代信息科技,2021
[5]沈伍强,张小陆,杨春松,许明杰.基于RASP的SQL注入和XSS攻击的检测技术[J].信息技术,2022
[6]王海涛.基于随机化处理的SQL注入攻击防御系统[J].网络安全和信息化,2021