在 Day 21 我們介紹了 SQL Injection 這樣的攻擊方式,也提到 Injection 的方式有很多。在 Day 23 要介紹的是我認為相較 SQL Injection 更危險的 Command Injection。
Command Injection 和 SQL Injection 非常類似,攻擊者透過使用者輸入區域,填入惡意的攻擊語句,達到取得伺服器控制權,進而影響整個伺服器的運作。
和 SQL Injection 一樣,要知道洞在哪裡就應該要先挖過一次才知道洞長什麼樣子。先說一下這次執行的環境是在 Linux 系統上,因為我跟 Windows 的 PowerShell 不是很熟。
先說說要做什麼吧,我們要製作一個可以查詢某個檔案放在哪裡的網頁。於是需要下面兩個程式碼
首先是 HTML 的部分
<html>
<head>
<meta charset="UTF-8" />
</head>
<body>
<form action="test.php" method="post">
<label for="photoName">今晚,我想找...</label><br>
<input type="text" name="photoName" id="photoName">
<input type="submit">
</form>
</body>
</html>
再來是 PHP 的部分
<?php
$command = $_POST["photoName"];
echo shell_exec("find / -name $command ")
?>
洞就挖好啦
先看一下有什麼檔案可以讓我找的
看起來有一個叫 Confidential_file
的文件可以找,我們就試著使用上面這兩個網頁找看看吧。先把檔案名稱像下圖一樣輸入好
送出後,我們得到著個檔案的位置
那如果今天輸入的檔案名稱是這樣呢結果就是木須龍啦。
木須龍是加上去的,指令不會出現這個σ`∀´)σ
對於 Linux 的 shell 來說,只要加一個分號就可以把指令分隔開來,所以 php 請 shell 做了兩個指令
當然不是,因為除了分號還有很多可以分隔指令的符號像是 |
、 &
、 $()
之類的,所以要建立一個危險字元表去過濾,實在有點難抵擋。
況且,當注入長成下面這樣的時候,總是要先被打過才知道可以這樣打 (´-ι_-`)
w\h\o\a\m\i
#這句等於 whoami
在 PHP 的 Function 中,有兩個可以處理這種狀況的 Function 。
不過還是要說,如果可以盡量避免使用 shell_exec()
這類可以執行 SHELL 的指令是最保險的,誰知道 PHP 提供的解決方案什麼時候會出 BUG 呢(゚⊿゚)
不說了,我要把電腦砸了,寫出這樣的漏洞,說不定在我測試的時候已經被看光光了。