iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 3
2

簡介 OWASP

雖然我們主要是討論 OWASP 計畫當中最知名的「 OWASP TOP 10 」,
但在之前,先來介紹一下什麼是 OWASP:

  • Open Web Application Security Project(開放網路軟體安全計畫)
  • 是一個開放社群、非營利性組織
  • 目標是研議協助解決網路軟體安全之標準、工具與技術文件

A1 - Injection 注入攻擊

Injection 包含了許多的類型,例如:Command Injection、SQL Injection 等等,但在 HITCON ZeroDay 以 SQL Injection 較為常見。
Injection 通常是使用者提供的資料傳輸到一個 Interpreter,被當成指令或是查詢,而攻擊者透過惡意的資料欺騙 Interpreter,達到執行指令或竄改資料目的。

攻擊流程

  1. 找出未保護變數,作為注入點
  2. 猜測完整 Command 並嘗試插入
  3. 推測欄位數、Table 名稱、SQL 版本等資訊
  4. 完整插入完成攻擊程序

舉例

  • Web 應用程式需要使用者輸入帳號與密碼才能登入系統,對資料庫或系統本身進行維護。
  • 以 ASP 為例,其後端處理的程式語法如下:
userId = request.form(“ID”)
userPass = request.form(“PASS”)
  • 變數 userId 與 userPass 得到使用者的帳號與密碼,會組合成 SQL 的語法針對伺服器進行查詢
  • 若在資料庫找到該使用者的帳號與密碼,而帳號與密碼輸入正確的話,才能夠進入系統:
strSQL= "SELECT * FROM Users WHERE Username='" & userId & "' and 
Password='" & userPass & "'"
  • 由於程式並沒有對 userId 與 userPass 兩個變數進行過濾處理,若使用者輸入以下符號:
ID : ' or ''='
PASS : ' or ''='
  • 則SQL查詢指令會變成:
SELECT * FROM Users WHERE Username='' or ''='' and Password= '' or ''=''
  • 當開啟資料庫的程式讀取此 SQL 指令時,因為沒有避免一些特殊的字元,造成原本設計用來檢查使用者帳號與密碼的部份,無論輸入正確與否皆會成真(True),使得惡意使用者得以進入系統。

防護建議

  • 使用 Prepared Statements
    • Java PreparedStatement()
    • .NET SqlCommand()
    • OleDbCommand()
    • PHP PDO bindParam()
  • 使用 Stored Procedures
  • 嚴密的檢查所有輸入值,不允許讓『'』、『;』、『--』、『=』、『''』、『or』等符號與SQL結合成查詢指令。
  • 使用過濾字串函數過濾非法的字元,會自動在特殊字元前面加上 \
    • mysql_real_escape_string
    • addslashes
  • 過濾程式功能必須在 Server 端處理,避免使用 java script 等 client 端程式處理,不然使用者可以透過關閉 java script 的方式迴避上述的過濾行為。
  • 限制應用程式存取資料庫的權限。
  • 關閉程式錯誤的訊息,就是 debug mode 啦!當程式出現錯誤時,會將錯誤訊息暴露在網頁上,有時候會將資料庫的 table name 外洩。

補充

  • 常見的SQL破壞性指令如:
    • 停止 SQL Server 的執行 :' ;SHUTDOWN--
    • 破壞資料庫的內容 :' ;DROP Database <資料庫名稱>--
    • 清空資料表中所有欄位的值 :' ;Truncate Table <資料表名稱>--
    • 清空資料表 :' ;DELETE FROM <資料表名稱>--

後文

不屬於你的不要「Pwn」,屬於你的也不要「動」。 (???


上一篇
『 Day 2 』認識 CTF
下一篇
『 Day 4 』Web Security - A2 . 無效的身份認證
系列文
到處挖坑,現在該來還(填)願(坑)ㄌ !!!30

尚未有邦友留言

立即登入留言