[第十一週]資訊安全基礎 — 常見攻擊:跨網站指令碼(XSS)、SQL Injection

MiaHsu
5 min readSep 19, 2020

--

學習目標:了解什麼是 XSS 、 SQL Injection 是如何攻擊網站以及如何防範

第一種:XSS

  • 全名:Cross-site scripting,中文為 跨網站指令碼攻擊,泛指通過利用網頁開發時留下的漏洞,通常是 JavaScript,但也可能是 Java、VBScript、ActiveX、Flash 或者甚至是普通的 HTML。
  • 會有什麼問題?
  1. 透過指令碼以被攻擊使用者的身份執行一些管理動作,就有可能偷到使用者的資料,比如:密碼。
  2. 透過指令碼將使用者導到釣魚網站。

攻擊範例

小提醒:請勿在現行網站任意測試,若真的發現問題也請主動通知網站開發者哦!

測試網站類型:留言板

留言板的功能是可以讓使用者輸入訊息後顯示在網站上,因此如果我們在留言的內容中輸入惡意的語法會發生什麼事呢?

第一種: html

xss 攻擊測試 注入 html
<h1 style="color: red;">xss 攻擊</h1>

第二種: JavaScript

xss 攻擊測試 注入 js
<script>alert('xss 攻擊');</script>

漏洞防禦方法

在網站顯示使用的內容時,對內容進行過濾,針對某些特殊字元進行跳脫或轉換,許多語言都有提供方法,這邊以 PHP 做示意:

htmlspecialchars()

  • 把預定義的特殊字元轉換成 HTML 僅能顯示用的編碼
  • 語法:
htmlspecialchars( $string , $quote_flags , $encoding , $double_encode )
  1. $string:需轉換的字串。
  2. $quote_flags:用來設定對引號的轉換,基本上建議使用 ENT_QUOTES 單雙引號都轉換(預設是僅轉換雙引號)。
  3. $encoding:用來設定要轉換的編碼,預設值則是 UTF-8。
  4. $double_encode: 是否要對全部進行轉換,預設值是轉換全部的 HTML 碼。
  • 範例:

可以將此方法包成一個 function 方便使用

function escape($str) {  return htmlspecialchars($str, ENT_QUOTES);}

將會顯示使用者輸入內容的地方都進行轉換

<div><?php echo escape($content); ?></div>

第二種:SQL Injection

SQL 常使用於 database 系統中,因此攻擊者可以透過更改語法邏輯或加入特殊指令的方式,擅自竊取、修改資料。

  • 會有什麼問題?
  • 透過指令碼以被攻擊使用者的身份執行一些管理動作,就有可能偷到使用者的資料,比如:密碼。
  • 透過指令碼修改 database 的資料,比如:去竄改 apple 購物網站上 iphone 的售價 0。

攻擊範例

小提醒:請勿在現行網站任意測試,若真的發現問題也請主動通知網站開發者哦!

— 測試網站類型:留言板
— 後端語言:PHP
— 新增留言的是使用 sprintf() 做字串拼接

留言內容:撈出 username 為 eee 的使用者密碼

"), ("eee", (select password from users limit 1)) #

漏洞防禦方法:prepared statement

中文為「參數化查詢」是指在使用資料庫語法時,在需要填入數值或資料的地方,使用參數來給值,這邊以 PHP 做示意:

其實上述兩種攻擊都是採用相同的手法,在使用者能輸入的資料當中注入惡意語法來攻擊網站,因此在資訊安全的概念中必須記住一個法則

永遠不要相信 Client 端傳過來的東西

有了這個思維就可以避免掉許多惡意攻擊

參考資料

以上有任何錯誤的地方歡迎指正,感謝。

--

--