Day18【Web】网路攻击:SQL injection

SQL 是常见的资料库语法,
许多网站都使用 SQL 语言来取得资料。

而所谓的 SQL Injection 又被称为
SQL 注入、SQL 隐码或 SQL 注码。

即是骇客透过修改 SQL 语句,
来改变原本的指令内容,
达成窃取/破坏资料的行为,
是一种发生在应用程序与资料库之间的安全漏洞。

在设计不良的程序中,
若攻击者在输入的字串中夹带 SQL 指令,
而网站又没有进行字元检查,
那麽这些夹带进去的恶意指令,
就会被资料库服务器误认为是
正常的 SQL 指令而被执行,
导致资料库因此遭到入侵或是破坏。

有部份人认为 SQL 注入只针对 Microsoft SQL Server,但只要是支援处理 SQL 指令的资料库服务器,都有可能受到此种手法的攻击。


常见的 SQL injection 攻击手法

  • 略过权限检查(Authorization Bypass)
  • 注入 SQL 子语法(Injecting SQL Sub-Statements into SQL Queries)
  • 利用预存程序(Exploiting Stored Procedures)

略过权限检查

假设今天有一段 query statement
要求使用者输入帐号及密码如下:

SELECT * FROM customers WHERE name =' -name- ' AND password = ' -password-'

statment 中有两个参数值
-name--password-
这时如果透过 -name- 所对应的 input 输入

'OR 1=1 --

其中 ' 是关闭 name 的 input 内容,
後面接上 OR 表示「或是」的条件,
1=1 这个判断永远返回 true,
再用 -- 将後面的内容变成注解。

以上会使得整个 query statement 变成:

"SELECT * FROM customers WHERE name ='' OR 1=1 -- AND password = ' -password-'

由於注解後面的 AND password = ' -password-'
会直接被略过,
如此一来判断条件将永远是 true,
使得攻击者可以在不需验证帐号密码的状况下
登入 DataBase 取得资料。


注入 SQL 子语法

攻击者透过注入恶意的 SQL 的语法去改变资料库,
比方说以下这段 malicious commands(恶意指令)。

// 浏览器送出以下 URL
// http://www.mydomain.com/products/products.asp?productid=123; DROP TABLE Products

// 服务器会进行以下指令
SELECT ProductName, ProductDescription FROM Products WHERE ProductNumber = 123
DROP TABLE Products

在上面的 URL 在 productid=123 後面加了一个分号 ;
再加上 DROP TABLE Products 这个 sub command,
这将会命令 SQL server
将 Products 这个 Table 删掉。

攻击者也可以使用其他 query 方法
进一步去探索其他 table 中的资料,
如下方的 SQL query:

http://www.mydomain.com/products/products.asp?productid=123 UNION SELECT Username, Password FROM USERS

其中 UNION 能将两个 SELECT 的结果
用一个结果集呈现出来,
而第二个 SELECT 是将 USERS 这个 Table 的
UsernamePassword 呈现出来,
以窃取资料库中存放的所有使用者的帐号密码。


利用预存程序

Stored Procedures(预存程序)
是将又臭又长又常用的 SQL 语法
写成一组程序并储存起来的一种方法,
方便於後续呼叫相同程序时
不必再将完整个 SQL 语法重打一次。

攻击者亦可透过呼叫这些 Stored Procedures
进而对 DataBase 进行攻击,如下:

SomeAsp.asp?city=pune';EXEC master.dbo.xp_cmdshell' cmd.exe dir c:

上面的代码中,程序收到要执行
master.dbo.xp_cmdshell 这个预存程序,
并在後面带上参数 cmd.exe dir c:
代表想用预存程序执行这个档案。

若是攻击者将公司资料库中
某项产品的价格调为 0 元,
或窜改政府机关资料库报税资料,
或是将某大厂物料库存清单删除,
不管哪项都将导致被攻击者极大的损害。


防范方式

  • 使用 Regular expression 验证过滤输入值与参数中恶意代码。
  • 将输入值中的单引号置换为双引号。
  • 限制输入字元格式并检查输入长度。
  • 资料库设定使用者帐号权限,限制某些管道使用者无法作资料库存取。

参考资料:


<<:  #18-手写字特效炫起来!(SVG dasharray & dashoffset)

>>:  JS Library 学习笔记:嘿!有听过 GSAP 吗? (四)

爬虫crawler -- 虾皮购物

许多厂商、卖家都会想知道自己的商品上架到平台贩售时,商品会排名在哪个位置? 大品牌厂商可能有经费每...

Day 26 - 影像处理篇 - 用Canvas实作在IE上也可运行的模糊滤镜II - 成为Canvas Ninja ~ 理解2D渲染的精髓

在这篇文章中,我们要来实作上一篇提到的图像模糊演算法~ 在开始之前,因为有个小状况是上一篇文中我们...

Day9-Kind:你叫我做,我就要去做吗?Kind指令介绍

kind指令介绍 在上一章我们介绍了如何安装kind,既然安装完了,那就该知道kind支援哪些指令。...

[新手教学]如何使用Line Notify

首先登入到 LINE Notify 并进入到个人页面 接着选择要接收通知的聊天室,也可以透过一对一接...

DAY11 资料前处理-资料不平衡处理方法

试想一下,如果有个模型号称有99%的准确率,那这个模型好不好呢?答案是不一定,在处理分类问题时,我们...