Day 25 - Code Injection 与 SQL Injection

这篇写的东西年轻不懂事时其实有些曾踩到过,列在这提醒未来的自己不要再犯了

出於书本 Chapter 14. Web sites and Applications

Code injection

类似於前一天讲的,基於 input 的验证缺陷,利用输入参数或是 script 来进行攻击。如果上网查的话,最常被拿出来讲的范例是 php ,比如说想透过 eval debug ,debug 完之後又忘记移除这一行... [1]

<?php eval ("echo ".$_REQUEST["user_name"].";"); ?>

就有可能被恶意使用者,透过输入类似下面的 URL request,撷取出系统资讯

http://www.example.com/index.php?user_name=admin
http://www.example.com/index.php?user_name=admin;phpinfo();
http://www.example.com/index.php?user_name=admin;system('ls -l');

或是连带被攻击者透过这种方式实现 SQL injection。

因应对策

透过清理输入来防止这种攻击,以 golang 来看的话,透过 ? 的方式引用 SQL Prepared Statement 的方式,先将参数在资料库编译完成後,再将其套用到 SQL 语句上执行。这是目前公定比较安全的处理方式,效能的表现也占有优势。

// 以下范例来自 golang 官方网站
// Correct format for executing an SQL statement with parameters.
rows, err := db.Query("SELECT * FROM user WHERE id = ?", id)

SQL injection

恶意攻击者透过在 URL request 里输入 SQL 语法,如 CONNECTSELECT 或是 UNION 等尝试与程序後面的资料库做连线以窃取资讯。从 OWASP 捞两个常见的范例 [2]

Case 1. 将恶意语法直接输入在 request 中

假设有个简单的 SQL 语法像是

select id, firstname, lastname from authors

如果有个恶意使用者尝试在其中的 firstname 栏位里多输入一个单引号 ' ,像是

select id, firstname, lastname from authors where firstname = 'malicious'ex' and lastname ='newman'

这样就会造成预期外的执行结果。

Case 2. 利用组合字串的弱点

假如有个程序码要执行的 SQL 语法是使用串接字串的方式组合而成,像是下面的范例

string userName = getAuthenticatedUserName();
string query = "SELECT * FROM items WHERE owner = "'"
                + userName + "' AND itemname = '"
                + ItemName.Text + "'";

守规矩的情况不会发生什麽太大的问题

SELECT * FROM items WHERE owner = 'john' AND itemname = 'name';

但是如果在 WHERE 後面加上可以被执行的条件,效果就会等同於 SELECT * FROM items

SELECT * FROM items WHERE owner = 'john' AND itemname = 'name' OR 'a'='a';

而仅仅只是利用 itemname 後面加上 'name' OR 'a' = 'a'

更多 SQL injection 的范例可以参考 OWASP 的网站

注: Open Web Application Security Project (OWASP,开放网路应用程序安全计画)

[1] What is Code Injection and How to avoid it?

[2] SQL Injection | OWASP


<<:  用科学化除错方法替你的 zk 程序除错之二

>>:  Day 25:从头开始的 Scroll Behavior

Display - 金鱼都能懂的CSS必学属性

display 这个属性实在是一个太重要的属性了,要在一个篇幅中讲完其实是不可能的事情,它可以说是目...

你的一生,还剩几个十年?

从出生的那一刻起,我们就一直不断向前,只能前进,直到终点。 2013.1.03 成为空服员的第一天...

Day7 CSV档处理

在经历上一部函数与类别的摧残後,这两天就来教一些比较温和的程序吧~ 今天的影片内容为介绍常见的档案格...

Day20 Redis架构实战-持久化RDB+AOF

Redis持久化 Redis持久化模式->RDB+AOF RDB+AOF两种模式整合在一起,可...

Spring Framework X Kotlin Day 9 Rest Repository

GitHub Repo https://github.com/b2etw/Spring-Kotlin...