iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 4
1
Security

資安x系統x絕對領域系列 第 5

[Day03]原始碼檢測x弱點修補X驗證攻擊-SQL Injection

[駭客思維]

SQL注入攻擊的總體步驟是:

  • 發現SQL注入位置=>使用SQL語法漏洞
  • 判斷後台數據庫類型=>SQLMAP或其他工具
  • 確定XP_CMDSHELL可執行情況=>查看服務有沒有開 =v=+
  • 發現WEB虛擬目錄=>確認是否有上傳檔案漏洞
  • 上傳木馬=>b374k或其他木馬
  • 得到管理員權限=>鏘鏘!打完收工!

不過,我們是「絕對領域」的專題,這些都不會教哦 =v=+
只會跟大家說一下要怎麼去驗證 & 修補這些漏洞…
除了安裝原始碼檢測軟體會有建議以外,也能參考一下修補方式嘛~

[看圖說故事]

http://ithelp.ithome.com.tw/upload/images/20170111/20103647faapcOevJo.png

http://ithelp.ithome.com.tw/upload/images/20170111/201036470raOGzkIDR.png

http://ithelp.ithome.com.tw/upload/images/20170111/201036471SuzFVx6vQ.png

[攻擊手法]

SQL Injection 可以做到什麼?
獲取使用者帳號密碼並非法登入系統
新增、修改、查詢出所有網站資料庫內容,也就是所謂的敏感資料 =v=+
刪掉整個 DATABASE
一般能用 SQL 執行指令均可透過SQL Inection 造成破壞。

像說一般我們常用的註解符號://, -- , /**/, #, --+, -- -, ;%00
都是能拿來當作攻擊的方式之一

而且如果沒有地方輸入,我們可以在網址列輸入、網頁右鍵去修改指令、密碼包或是破解工具…
但只要把這個漏洞修補起來,就可以防止被攻擊者從這個漏洞鑽進來!

線上實際教學:https://www.codebashing.com/sql_demo
歡迎大家來試著自行驗證看看!!!!!

[簡單驗證]

.HTTP://xxx.xxx.xxx/abc.asp?p=YY'(附加一個單引號)
若頁面異常或無法正常顯示,就代表這個程式頁面「可能有SQL Ineciton」漏洞。

.HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=1 執行結果正常,
而且與HTTP://xxx.xxx.xxx/abc.asp?p=YY 運行結果相同

.HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=2 執行結果異常

同時滿足以上三點,就有SQL Injection漏洞。

[動手驗證]

輸入欄位中加入「可能造成破壞的語法」
Acunetix 供線上測試的弱點網站為例

http://ithelp.ithome.com.tw/upload/images/20161209/20103647jaMs2oq0S8.png

即使密碼隨便輸入,也能登入至系統中了…
http://ithelp.ithome.com.tw/upload/images/20161209/20103647tgWs72OlWw.png

[線上試玩]

HP Webinspect 供線上測試的弱點網站:
http://zero.webappsecurity.com/index.html
IBM 供線上測試的弱點網站:
http://demo.testfire.net/
Acunetix 供線上測試的弱點網站:
http://testasp.vulnweb.com/
http://testphp.vulnweb.com/
http://testaspnet.vulnweb.com/

[弱點修復]

  • WAF 能擋掉大部份的SQL Inection,前提是要「設定正確」,不然仍有風險
  • 修改程式為參數化傳值、預存程序(stored procedure)寫法
  • 改為白名單寫法(僅允許輸入英數字元)
  • 改為黑名單寫法(請以迴圈排除or或OR字串),若黑名單沒有寫好會有較大風險
    因為相關SQL Inection的漏洞修補範例程式很多了,
    能找到漏洞之後,相信大家修補都不會有問題的!所以程式碼就不貼了=v=+

[修補建議]

  • (1)輸入資料檢查 : 針對任何由前端取得的資料都應妥善處理,其資料接收語法包括:

    • GET: Request.QueryString[“name”]
    • POST: Request.Form[“name”]
    • Cookie: Request.Cookies[“name”]
    • HTTP Header: Request.Headers[“name”]
    • 以及通用的 Request ["name"]
    • 在傳入危險的函數中執行之前(例如執行SQL、執行系統指令…等),都應該至少做好基本的資料長度、型態檢查或內容過濾。最好的輸入檢查策略是以白名單的方式進行,只允許適當的資料才進行後續處理。例如傳入一整數型態參數,則呼叫 isNumeric() 函數進行檢查,若該參數的資料型態不正確,則中止操作、或顯示錯誤訊息。
  • (2) Prepared Statement : 此種存取資料庫的程式寫法主要是將SQL執行語句邏輯與使用者輸入資料分開處理。

  • (3) 資料庫連線管理 : 當網頁程式在連線資料庫時,不可使用高於所需的權限登入,例如使用Microsoft SQL Server的sa權限,或mysql的root權限來存取一般使用者資料庫。除此之外,也應避免使用 dbo 權限存取,避免資料庫內容遭惡意更動。

  • (4) LINQ To SQL : 如果是微軟解決方案開發程式的使用者,可以考慮.NET Framework 3.5中所附元件LINQ To SQL來簡化資料庫相關語法的開發,並利用預設的資料庫呼叫方式來迴避SQL injection問題。相關元件的參考網址 : http://msdn.microsoft.com/zh-tw/library/bb386976.aspx

以下僅供驗證參考

[資料庫工具-SQLmap]

  • python 2.7 //我是用這個版本啦 XD
  • SQLmap 下載來源:http://sqlmap.org
    python sqlmap.py -u "URL" -參數
    這我自己想貼的啦,可以直接省略囉 XD
    參數:
    -u 所要攻擊的網址
    --hex 修正編碼問題
    ! -tech=[U|B|E|T] 使用何種攻擊方式
    U = Union Based
    B = Blind Based
    E = Error Based
    T = Time Based
    -D [database_name] 指定資料庫
    -T [table_name] 指定資料表
    -C [column_name, [column_name ...]] 指定欄位
    --dbs 列出目標網站所有資料庫
    --tables 列出目標網站所有資料表(table)
    --columns 列出目標網站所有欄位(column)

[進階工具-解密工具]

hash-identifier:(需要安裝python) 解讀可能的加密方式
freemd5 http://freemd5.com/

[木馬程式-b374k]

b374k https://github.com/b374k/b374k/releases

  • 首先到Github把b374k.php下載下來
  • 丟到網頁伺服器,
  • 沒錯,就這樣,完成植入後門了
  • 接下來打開後門網址,輸入"b374k",這樣就成功進入後門了
    簡單教學:https://blog.allenchou.cc/b374k-webshell/

[修補方式]

前輩提出來的建議:
在表單GET模式或POST模式的參數在進入SQL或其它處理前,預先攔截。如果有發現有異常的表單變數就轉址到 SafeUrlCheckError.asp

[相關投影片]

https://hitcon.org/2015/CMT/download/day1-a-r4.pdf

[相關網址]


上一篇
[Day02]原始碼檢測x靜態白箱x軟體
下一篇
[Day04]原始碼檢測x弱點修補X驗證攻擊-Path Manipulation
系列文
資安x系統x絕對領域47

1 則留言

1
Kathy Lai
iT邦新手 5 級 ‧ 2016-12-12 11:15:03

SQL Injection在網路上的教學很多,但~難得有篇這麼仔細的!

虎虎 iT邦新手 3 級‧ 2016-12-12 11:21:10 檢舉

謝謝大大!!!
但後來我覺得文字太多太煩了,等有時間再來精簡化 XDDDD
真心覺得教學動手做網址棒棒噠~
線上實際教學:https://www.codebashing.com/sql_demo

哈!謝謝分享,這個我有按左邊的step玩完XD

我要留言

立即登入留言