前言
昨天用 Intruder 成功爆破出密碼,讓我很有成就感。那感覺像是找到了正確的鑰匙,打開了一扇門。而今天,我要挑戰的「Command Injection」(指令注入),感覺完全是另一個層級。如果說爆破是「猜鑰匙」,那指令注入就像是直接對著門鎖大喊「芝麻開門」,然後門就真的開了。
簡單來說,這個漏洞的目標是欺騙網站伺服器,讓它執行我所指定的系統指令。
第一步:探索目標功能
和之前一樣,我先把 DVWA 的安全等級設為 low,然後點擊左側選單的 「Command Injection」。
頁面很簡單,看起來是一個網路檢測工具。它有一個輸入框,讓我輸入 IP 位址,然後它會幫我 ping 這個 IP。
我先正常地使用它,輸入 8.8.8.8 (Google 的 DNS 伺服器),然後按下「Submit」。頁面回傳了 ping 指令的執行結果,一切正常。這證明了後端伺服器確實接收了我的輸入,並執行了一個系統指令。
第二步:構思我的第一個 Payload
既然我知道後端會執行系統指令,那我有沒有辦法在輸入 IP 的同時,再「塞」進第二個我自己的指令呢?
在 Linux 的終端機中,我們常用一些特殊字元來串接多個指令:
& 或 &&:command1 && command2 - 如果 command1 成功執行,就接著執行 command2。
;:command1 ; command2 - 不管 command1 是否成功,都接著執行 command2。
我的想法是,如果後端程式只是單純地把我的輸入字串拼接到 ping 指令後面,那我就可以利用這些字元來注入我想執行的指令。
我決定試試 ls -la 這個指令,它可以列出目前目錄下的所有檔案和詳細資訊。我的第一個 Payload 誕生了:
8.8.8.8 && ls -la
第三步:見證奇蹟的時刻
我把上面那串 payload 貼到輸入框,按下「Submit」。頁面重新載入後,我屏住了呼吸,仔細看著輸出結果。
首先,我看到了跟之前一樣的 ping 8.8.8.8 的結果。但是,在 ping 的結果下面,我看到了截然不同的東西!
成功了!它真的執行了 ls -la!我看到了伺服器上這個網頁所在目錄的檔案列表。這個感覺比昨天猜對密碼還要震撼,因為我不再是作為一個「使用者」在跟網站互動,我已經可以「命令」伺服器做事了。
今日總結
今天,我親手利用了 Command Injection 漏洞,從一開始只能執行 ping,到最後能夠讀取伺服器上的敏感檔案。我也從原始碼層面理解了,這種「信任使用者輸入」的開發習慣是多麼危險。
明天我將嘗試其他指令。