入坑解读 | 什么是SQL注入?

2023-05-06 14:10:02

 

在OWASP发布的top10排行榜中SQL注入漏洞一直是危害排名极高的漏洞,数据库注入一直是web中一个令人头疼的问题。

OWASP,Open Web Application Security Project,开放式Web应用程序安全项目:

这是一个提供有关计算机和互联网应用程序的公正、实际、有成本效益信息的组织。其目的是协助个人、企业和机构来发现和使用可信赖软件。

一个严重的SQL注入漏洞,可能会直接导致一家公司破产!

这并不是戏言,其实SQL注入漏洞最主要的形成原因是在进行数据交互中,当前端的数据传入后端进行处理时,由于没有做严格的判断,导致其传入的“数据”在拼接到SQL语句中之后,由于其特殊性,被当作SQL语句的一部分被执行,从而导致数据库受损(被脱库、被删除、甚至整个服务器权限沦陷)。

一、什么是SQL注入

SQL注入是一种非常常见的数据库攻击手段,SQL注入漏洞也是网络世界中最普遍的漏洞之一。大家也许都听过某某学长通过攻击学校数据库修改自己成绩的事情,这些学长们一般用的就是SQL注入方法。

SQL注入其实就是恶意用户通过在表单中填写包含SQL关键字的数据来使数据库执行非常规代码的过程。简单来说,就是数据「越俎代庖」做了代码才能干的事情。

这个问题的来源是,SQL数据库的操作是通过SQL语句来执行的,而无论是执行代码还是数据项都必须写在SQL语句之中,这就导致如果我们在数据项中加入了某些SQL语句关键字(比如说SELECT、DROP等等),这些关键字就很可能在数据库写入或读取数据时得到执行。

二、SQL注入的产生需要满足以下两个条件

1、参数用户可控:前端传给后端的参数用户可控。

2、参数带入数据库查询:传入的参数拼接到SQL语句中,且带入数据库中查询。

正是这个拼接的过程导致了代码的注入

多言无益,我们拿真实的案例来说话。下面我们先使用SQLite建立一个学生档案表。

SQL数据库操作示例:

import sqlite3连接数据库:conn = sqlite3.connect(test.db)建立新的数据表:conn.executescript(DROP TABLE IF EXISTS students; CREATE TABLE students (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL);)插入学生信息:students = [Paul,Tom,Tracy,Lily] for name in students: query = "INSERT INTO students (name) VALUES (%s)" % (name) conn.executescript(query);检视已有的学生信息:cursor = conn.execute("SELECT id, name from students") print(IDName) for row in cursor: print({0}{1}.format(row[0], row[1])) conn.close()

点击运行按钮,将会打印目前表中的内容。上述程序中我们建立了一个test.db数据库以及一个students数据表,并向表中写入了四条学生信息。

那么SQL注入又是怎么一回事呢?我们尝试再插入一条恶意数据,数据内容就是漫画中的"Robert);DROP TABLE students;--",看看会发生什么情况。

SQL数据库注入示例:

conn = sqlite3.connect(test.db) 插入包含注入代码的信息:name = "Robert);DROP TABLE students;--" query = "INSERT INTO students (name) VALUES (%s)" % (name) conn.executescript(query)检视已有的学生信息:cursor = conn.execute("SELECT id, name from students") print(IDName) for row in cursor: print({0}{1}.format(row[0], row[1])) conn.close()

你将会发现,运行后,程序没有输出任何数据内容,而是返回一条错误信息:表单students无法找到!

这是为什么呢?问题就在于我们所插入的数据项中包含SQL关键字DROP TABLE,这两个关键字的意义是从数据库中清除一个表单。

而关键字之前的Robert);使得SQL执行器认为上一命令已经结束,从而使得危险指令DROP TABLE得到执行。

也就是说,这段包含DROP TABLE关键字的数据项使得原有的简单的插入姓名信息的SQL语句:

INSERT INTO students (name) VALUES (Robert)变为了同时包含另外一条清除表单命令的语句:INSERT INTO students (name) VALUES (Robert);DROP TABLE students;

而SQL数据库执行上述操作后,students表单被清除,因而表单无法找到,所有数据项丢失。当然,现在很多网站都有了防止SQL注入的操作,这里就不过多介绍了。

关于如何防止防止SQL注入,后期安仔这边会整理,如果你急用的话,可以百度搜索,了解一下。

SQL注入说白了,就是通过把SQL命令插入到WEB表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

三、SQL注入类型:

1、按照注入点分类:

(1)数字型注入:许多网页链接有类似的结构 http://xxx.com/users.php?id=1 基于此种形式的注入,注入点id为数字,一般被叫做数字型注入点,通过这种形式查询出后台数据库信息返回前台展示,可以构造类似以下的SQL语句进行爆破:select *** from 表名 where id=1 and 1=1。

(2)字符型注入:网页链接有类似的结构

http://xxx.com/users.php?name=admin 这种形式,注入点name为字符串,被称为字符型注入,可以用:select *** from 表名 where name=admin and 1=1。

(3)搜索型注入:主要是指在数据搜索时没有过滤搜索参数,一般在链接地址中有 "keyword=“关键字”",注入点提交的是SQL语句,select * from 表名 where 字段 like %关键字% and %1%=%1%。

2、按照执行效果来分类:

(1)基于布尔的盲注:根据页面返回判断条件真假注入。

(2)基于时间的盲注:即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。

(3)基于报错的注入:即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。

单引号双引号基于数字型注入

(4)联合查询注入:可以使用union情况下注入。

四、SQL注入常见的绕过方法

(1)大小写关键词绕过(UNiOn)

(2)双写关键词绕过(ununionion)

(3)编码绕过(base64、url)

(4)内联注释绕过(/*! Union */)


以上就是关于《入坑解读 | 什么是SQL注入?》的全部内容,本文网址:https://www.7ca.cn/baike/23704.shtml,如对您有帮助可以分享给好友,谢谢。
标签:
声明

排行榜