iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 23
0
自我挑戰組

大學 50 萬貸款的交代系列 第 23

Day 23 怕啦.Command Injection Σ( ° △ °)

  • 分享至 

  • xImage
  •  

在 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 做了兩個指令

  1. find / -name any_else
  2. whoami

這樣只要濾掉分號就沒事囉?

當然不是,因為除了分號還有很多可以分隔指令的符號像是 |&$() 之類的,所以要建立一個危險字元表去過濾,實在有點難抵擋。
況且,當注入長成下面這樣的時候,總是要先被打過才知道可以這樣打 (´-ι_-`)

w\h\o\a\m\i
#這句等於 whoami

所以應該怎麼解決呢

在 PHP 的 Function 中,有兩個可以處理這種狀況的 Function 。

  1. escapeshellarg(字串)
  2. escapeshellcmd(字串)

不過還是要說,如果可以盡量避免使用 shell_exec() 這類可以執行 SHELL 的指令是最保險的,誰知道 PHP 提供的解決方案什麼時候會出 BUG 呢(゚⊿゚)

不說了,我要把電腦砸了,寫出這樣的漏洞,說不定在我測試的時候已經被看光光了。


上一篇
Day 22 怕啦.SQL Injection -2 Σ( ° △ °)
下一篇
Day 24 吃餅乾囉 ヽ(✿゚▽゚)ノ
系列文
大學 50 萬貸款的交代30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言