iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0

Info

Walkthrough

  • 存取網頁後使用帳號和上關獲取的密碼登入,發現和 Day 0x10 Natas Level 14 → Level 15 一樣的頁面,但不管輸入任何字,回顯都是空白
    • Imgur
  • 點擊 View sourcecode 超連結查看後端 PHP 程式碼
    • Imgur
  • 分析程式碼邏輯後畫成流程圖如下,主要是「生成 SQL 查詢語句」時,未經任何驗證及過濾直接串接使用者輸入
    • Imgur
  • 透過上述已知資訊撰寫 Python 腳本,構造 Payload natas18" AND IF(ORD(MID(password, 1, 1))=ORD("A"), SLEEP(20), 0) #,當 password 第 n 位為猜測的字元時就執行 SLEEP(),根據 Response 的延遲時間推斷正確與否 (因此與 WHERE 條件是否成立無關),等待較長時間後成功獲得下題的登入密碼
    • Imgur

Note

  • 雖然不知道「回顯永遠空白」在功能設計上有沒有問題,但同 Day 0x0F Natas Level 13 → Level 14Day 0x10 Natas Level 14 → Level 15,都是因為將未經驗證的使用者輸入做字串串接,用來動態生成 SQL 語句,進而導致 SQL Injection 漏洞
  • 如果 Payload 縮短成 MID(password, 1, 1)="A",會因為字串比較是 insensitive 導致獲得非預期解答
    • Imgur
  • 如果因為網路環境比較差,需要注意 SLEEP() 不夠久可能會導致誤判,例如我原本是設定 20 秒發送一次請求,整個過程又臭又長;另外也可以嘗試二分搜的方法減少枚舉次數,例如判斷 >ORD("A") 是否成立
    • Imgur
  • 此題的 Payload 有多種方法和組合,可以自行研究把玩,例如 natas18" AND password LIKE BINARY "A%" AND SLEEP(10) # 運用短路運算的特性來決定是否 SLEEP()

Summary

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

Reference


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

尚未有邦友留言

立即登入留言