您当前的位置:首页 > 电脑百科 > 安全防护 > 数据安全

举世闻名的 SQL 注入是什么?这个漫画告诉你

时间:2020-03-06 13:56:53  来源:  作者:

来源:jizhi.im/blog/post/sql_injection_intro

先来看一副很有意思的漫画:

相信大家对于学校们糟糕的网络环境和运维手段都早有体会,在此就不多做吐槽了。今天我们来聊一聊SQL注入相关的内容。

何谓SQL注入?

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

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

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

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

SQL数据库操作示例:

importsqlite3

连接数据库:

conn= sqlite3.connect( 'test.db')

建立新的数据表:

conn.execute(''' DROPTABLEIFEXISTSstudents;

CREATETABLEstudents

( idINTEGERPRIMARY KEYAUTOINCREMENT,

nameTEXTNOTNULL);''')

插入学生信息:

students = [ 'Paul', 'Tom', 'Tracy', 'Lily']

forname instudents:

query = "INSERT INTO students (name) VALUES ('%s')"% (name)

conn.execute(query);

检视已有的学生信息:

cursor= conn. execute( "SELECT id, name from students")

print( 'IDName')

forrow 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'); DROPTABLEstudents; --"

query = " INSERTINTOstudents ( name) VALUES( '%s') " % (name)

conn.execute(query)

检视已有的学生信息:

cursor= conn. execute( "SELECT id, name from students")

print( 'IDName')

forrow in cursor:

print( '{0}{1}'.format(row[ 0], row[ 1]))

conn. close

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

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

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

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

INSERTINTOstudents ( name) VALUES( 'Robert')

变为了同时包含另外一条清除表单命令的语句:

INSERTINTOstudents ( name) VALUES( 'Robert'); DROPTABLEstudents;

而SQL数据库执行上述操作后,students表单被清除,因而表单无法找到,所有数据项丢失。

如何防止SQL注入问题呢?

大家也许都想到了,注入问题都是因为执行了数据项中的SQL关键字,那么,只要检查数据项中是否存在SQL关键字不就可以了么?

的确是这样,很多数据库管理系统都是采取了这种看似『方便快捷』的过滤手法,但是这并不是一种根本上的解决办法,如果有个美国人真的就叫做『Drop Table』呢? 你总不能逼人家改名字吧。

合理的防护办法有很多。首先,尽量避免使用常见的数据库名和数据库结构。在上面的案例中,如果表单名字并不是students,则注入代码将会在执行过程中报错,也就不会发生数据丢失的情况—— SQL注入 并不像大家想象得那么简单,它需要攻击者本身对于数据库的结构有足够的了解才能成功,因而在构建数据库时尽量使用较为复杂的结构和命名方式将会极大地减少被成功攻击的概率。

使用正则表达式等字符串过滤手段限制数据项的格式、字符数目等也是一种很好的防护措施。理论上,只要避免数据项中存在引号、分号等特殊字符就能很大程度上避免 SQL注入 的发生。

另外,就是使用各类程序文档所推荐的数据库操作方式来执行数据项的查询与写入操作,比如在上述的案例中,如果我们稍加修改,首先使用execute方法来保证每次执行仅能执行一条语句,然后将数据项以参数的方式与SQL执行语句分离开来,就可以完全避免 SQL注入 的问题,如下SQL数据库反注入示例。

conn= sqlite3.connect( 'test.db')

以安全方式插入包含注入代码的信息:

name = "Robert'); DROPTABLEstudents; --"

query = " INSERTINTOstudents ( name) VALUES(?) "

conn.execute(query, [name])

检视已有的学生信息:

cursor= conn. execute( "SELECT id, name from students")

print( 'IDName')

forrow in cursor:

print( '{0}{1}'.format(row[ 0], row[ 1]))

conn. close

而对于php而言,则可以通过MySQL_real_escape_string等方法对SQL关键字进行转义,必要时审查数据项目是否安全来防治 SQL注入 。

当然,做好数据库的备份,同时对敏感内容进行加密永远是最重要的。某些安全性问题可能永远不会有完美的解决方案,只有我们做好最基本的防护措施,才能在发生问题的时候亡羊补牢,保证最小程度的损失。



Tags:SQL 注入   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
前言:在之前校招面试中,sql被问到频率是真的高,当初为了能够在sql这块加分,看了不少书籍,在网上也找了不少资料,走了不少弯路,庆幸的是,每次面试官问到sql相关知识,我基本都能对答如...【详细内容】
2021-06-29  Tags: SQL 注入  点击:(102)  评论:(0)  加入收藏
来源:jizhi.im/blog/post/sql_injection_intro先来看一副很有意思的漫画:相信大家对于学校们糟糕的网络环境和运维手段都早有体会,在此就不多做吐槽了。今天我们来聊一聊SQL注...【详细内容】
2020-03-06  Tags: SQL 注入  点击:(106)  评论:(0)  加入收藏
出处:https://jizhi.im/blog/post/sql_injection_intro先来看一副很有意思的漫画: 今天我们来聊一聊SQL注入相关的内容。何谓SQL注入?SQL注入是一种非常常见的数据库攻击手段,SQ...【详细内容】
2020-02-07  Tags: SQL 注入  点击:(99)  评论:(0)  加入收藏
▌简易百科推荐
众所周知,Windows系统流氓软件众多,其中不乏出身大厂的产品。这些带有流氓性质的软件,很多都会偷偷扫描系统数据,读取用户文件,造成电脑卡顿拖慢不说,还严重侵害了个人隐私,造成巨...【详细内容】
2021-12-06  趣玩APPS    Tags:流氓软件   点击:(16)  评论:(0)  加入收藏
前言目标是一大学,在一次挖洞过程中遇到个sql注入,尝试进一步利用扩大危害,漏洞已报送平台进行了修复私信我获取网络安全学习资料 1.2000多本网络安全系列电子书 2.网络安全标...【详细内容】
2021-11-26  IT野涵    Tags:sql注入   点击:(21)  评论:(0)  加入收藏
互联网时代,不论是个人还是组织,都将数据视为一项重要的资产。为了便于存储、管理,企业常常会为各项数据建立一个数据库,如果没有做好安全风险防护,一旦数据库被攻占,企业将迎来很...【详细内容】
2021-10-28  快快网络   企鹅号  Tags:数据库   点击:(50)  评论:(0)  加入收藏
前言(可能思路狭隘,有缺有错,师傅们多带带)【查看资料】Author: 0ne本篇文章数据来源于18+省市级别HVV,90+单位失陷报告。(一部分是笔者的参与,一部分是薅的公司其他师傅的报告...【详细内容】
2021-10-28  IT野涵    Tags:缺口   点击:(46)  评论:(0)  加入收藏
本人也是小白一枚,大佬请绕过,这个其实是六月份的时候做的,那时候想多点实战经验,就直接用谷歌搜索找了一些网站,这个是其中一个1、目标网站 2、发现有WAF防护 3、判断存在注入...【详细内容】
2021-10-19    博客园  Tags:SQL注入   点击:(52)  评论:(0)  加入收藏
一 前言本文将针对开发过程中依旧经常出现的SQL编码缺陷,讲解其背后原理及形成原因。并以几个常见漏洞存在形式,提醒技术同学注意相关问题。最后会根据原理,提供解决或缓解方案...【详细内容】
2021-09-17  woaker    Tags:SQL注入漏洞   点击:(67)  评论:(0)  加入收藏
前言本人ctf选手一名,在最近做练习时遇到了一些sql注入的题目,但是sql注入一直是我的弱项之一,所以写一篇总结记录一下最近学到的一些sql注入漏洞的利用。可回显注入联合注入在...【详细内容】
2021-08-26  合天网安实验室    Tags:sql注入   点击:(60)  评论:(0)  加入收藏
“放纵自己的欲望是最大的祸害,窥探别人的隐私是最大的罪恶,不知自己的过失是最大的病痛”。 上文咱们知道了目前互联网的数据安全存在隐患,数据安全的问题,每天都在发生,只不过...【详细内容】
2021-08-13  小陶子矿工    Tags:IPFS   点击:(79)  评论:(0)  加入收藏
前言最近挖edusrc的时候遇到有注入点但是有waf绕不过,头疼。 可以看到还是phpstudy建站的,太熟悉了这个,不知道这个什么waf各位师傅知道的可以评论一下,所以写这篇文章是供各位...【详细内容】
2021-08-13  IT影子    Tags:sql注入   点击:(66)  评论:(0)  加入收藏
1. 使用 Burpsuite: 1. Capture the request using burpsuite. 2. Send the request to burp scanner. 3. Proceed with active scan. 4. Once the scan is finished, l...【详细内容】
2021-08-04  李志宽    Tags:SQL注入   点击:(74)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条