iT邦幫忙

2023 iThome 鐵人賽

DAY 15
0

Info

Walkthrough

  • 存取網頁後使用帳號和上關獲取的密碼登入,看到帳號與密碼的輸入框
    • Imgur
  • 點擊 View sourcecode 超連結查看後端 PHP 程式碼
    • Imgur
  • 分析程式碼邏輯後畫成流程圖如下,主要是「生成 SQL 查詢語句」時,未經任何驗證及過濾直接串接使用者輸入
    • Imgur
  • 因為 mysqli_connect() 函式的描述 "Open a new connection to the MySQL server",猜測是使用 MySQL 資料庫,嘗試輸入 natas15" #
    • Imgur
  • 成功無密碼登入獲得下題的登入密碼
    • Imgur

Note

  • 資料庫通常會儲存大量資料,例如使用者的帳號密碼、個人資料等,因此網站應重視資料庫的安全性,保護敏感資料不被外洩導致損害,而 SQL Injection 是其中一種獲取資料庫中資料的方式,當使用者輸入送到網站後端時,若沒有經過適當的驗證與轉譯,且動態串接成 SQL 語句,最後會導致執行非預期的行為

  • 此題中 OverTheWire 可能為了學習方便,在網站後端原始碼中加入了 debug 參數,讓使用者可以看到網站後端字串串接後的 SQL 語句,透過此方式來解釋和了解 SQLi (SQL injection)

    1. 網站後端的 PHP 原始碼如下
    $query = "SELECT * from users where username=\"".$_REQUEST["username"]."\" and password=\"".$_REQUEST["password"]."\"";
    
    1. 如果將串接 (.) 與轉譯 (\) 拔掉,最終會執行的 SQL 語句如下
    1. $query = "SELECT * from users where username=\"".$_REQUEST["username"]."\" and password=\"".$_REQUEST["password"]."\"";
    2. "SELECT * from users where username=\"".$_REQUEST["username"]."\" and password=\"".$_REQUEST["password"]."\""
    3. SELECT * from users where username=\".$_REQUEST["username"].\" and password=\".$_REQUEST["password"].\"
    4. SELECT * from users where username=\"$_REQUEST["username"]\" and password=\"$_REQUEST["password"]\"
    5. SELECT * from users where username="$_REQUEST["username"]" and password="$_REQUEST["password"]"
    6. SELECT * from users where username="我輸入的帳號" and password="我輸入的密碼"
    
    1. 當正常的使用者輸入帳號 natas15 會執行的 SQL 語句如下
    SELECT * from users where username="natas15" and password="natas15的密碼"
    
    1. 因為攻擊者 (我們) 不知道密碼,所以想要取消判斷 password 的條件,例如
    SELECT * from users where username="natas15"
    
    1. 因此可以透過註解使後面判斷條件失效,例如
    SELECT * from users where username="natas15" #and password="natas15的密碼"
    
    1. 但是使用者輸入被控制在 username="我輸入的帳號" 這段區域中,因此需要使用 " 先閉合 username 再註解,因此最後 payload natas15" # 會執行的 SQL 語句如下 (同 4.)
    SELECT * from users where username="natas15" #"and password="natas15的密碼"
    

    Imgur

    根據 RFC 3986: section 3.4 可知,# 是有特殊意義的符號,其後的內容不會傳送給網站,因此需要先 URL encode 成 %23 否則會失敗,或者保險起見可以全部都 URL encode

    1. 也可在密碼欄位透過 OR 將條件調整成 True
    SELECT * from users where username="natas15" and password="隨便" OR "1"="1"
    

    Imgur

Summary

  • 相關弱點:
  • 弱點原因:
    • 將未經驗證的使用者輸入,以字串串接的方式動態生成 SQL 查詢語句
  • 修補建議:
    • 取消 debug 參數等開發者的功能,避免洩漏可用資訊給攻擊者,並建立白名單驗證使用者輸入,透過 API 過濾及轉譯特殊字元,且如果評估可行的話,改採用參數化查詢的方式預先構建 SQL 語句,另建議立即更換密碼,以減少資訊洩漏的風險

Reference


上一篇
Day 0x0E Natas Level 12 → Level 13
下一篇
Day 0x10 Natas Level 14 → Level 15
系列文
Natas 網頁安全:從入門到放棄35
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言