基於資安考量,線上環境多半戒備森嚴,不允許隨意複製部署程式、安裝工具軟體需事先申請、開發人員無法親身操作,所有動作需委由 OP 執行。在這種困難險阻特多的環境查問題,像 Inline ASPX 這類偵錯技巧就顯得格外管用。

這篇談的也是類似情況,在不額外安裝或部署任何工具程式前題下,如何交由 OP 人員在 Windows 伺服器對 WebAPI 進行基本檢測?

跟被丟到荒島,沒刀子沒鍋子沒打火機要就地取材升火煮飯有 87 分像...

本文開始

講到測試 WebAPI,PostMan 是大多數開發者首選,但它需要安裝,出局!

如果沒有 PostMan,若有 curl.exe 也是極好的,但很不幸,就算一個小小第三方執行檔也是資安人員眼中的毒藥,不給用!

線上 Windows 主機多半不會安裝 Chrome,但至少會有活化石 IE8,如果 WebAPI 走 GET 敲 URL 就可測試還算簡單,但實務上 WebAPI 多以 POST 為主,甚至會用到 PUT、DELETE 等 REST 做法,開 F12 跑一段 JavaScript 呼叫 XHR 應可完成測試,但程式碼複雜度與操作程序對非前端開發背景的 OP 來說有難度,不優。

被逼到走投無路,一度想回頭招喚清代火器 VBScript,但最後我找到一個更好的解法 - Windows 2012+ 內建的 PowerShell,裡面有個 Invoke-WebRequest Cmdlet 可以讓我們在荒野順利求生。

直接用範例教學:使用 ASP.NET MVC 打造 WebAPI 服務裡的 WebAPI 當實例,其中 EncryptString 方法吃 x-www-form-urlencode 參數,BatchDecryptData 方法吃 JSON 內容當輸入參數,剛好可展示兩種常見的參數類型。

PowerShell 在 Windows Server 的工作列及開始畫面都有捷徑,不難找:

EncryptString 測試程式的寫法如下:

$Body=@{
  encKey='9527'
  rawText='Darkthread'
}
Invoke-WebRequest -Method POST -Uri http://localhost:62505/codecapi/encryptstring -Body $Body

簡單解釋,第一段是宣告一個名為 $Body 的 Dictionary,有兩筆 Key/Value,encKey 及 rawText,稍後呼叫 Invoke-WebRequest,指定 POST 方法及 Uri 網址,Body 參數傳入 $Body Dictionary 會自動轉成 encKey=9527&rawText=Darkthread 作為上傳內容,其執行結果如下:(我加了一個印出 $Body 內容的步驟,驗證它是個 Dictionary)

如上圖所示,Invoke-WebRequest 會傳回一個 BasicHtmlWebResponseObject 物件,其中 Content 屬性即為 WebAPI 傳回的 ApiResult JSON。如果要解析它取出 ApiResult.Data,可先讀取回應物件 Content 屬性再用 ConvertFrom-Json 轉成物件,接著就能取出 Data:

(Invoke-WebRequest -Method POST -Uri http://localhost:62505/codecapi/encryptstring -Body $Body).Content | ConvertFrom-Json | Select Data

再來測試 BatchDecryptData。組成要上傳的 JSON 字串有好幾種做法,可以直接寫好 JSON 字串,也可先建立 PowerShell 物件再用 ConvertTo-Json 轉換,還有一種做法是寫一小段 C# 建立物件(參考:PowerShell: Creating Custom Objects)。由於上傳參數只有一個字串屬性跟一個字串陣列屬性,我選擇用 Dictionary 模擬物件。取回 BasicHtmlWebResponseObject.Content 部分我改用另一種寫法 Select -exp Content 取值(註:-exp 為 -ExpandProperty 縮寫,指傳回屬性原始型別內容,Content 需傳回字串型別才能供 ConvertFrom-Json 轉換):

$Body = @{ encKey = '9527'; encData =  @('aNcjoi5QprU=','Ql9bsv6d1BVeq/9icNTcUQ==') } | ConvertTo-Json
Invoke-WebRequest -Method POST -Uri http://localhost:62505/codecapi/batchdecryptdata -Body $Body -ContentType application/json | Select -exp Content |  ConvertFrom-Json | Select -exp Data

實測結果如下:

藉由以上做法,我們可以在不安裝任何軟體工具、不使用已編譯執行檔的前題下,以純文字提供一段簡單到人眼可鑑別的腳本供 OP 人員執行,解決難以驗證 WebAPI 好壞的困擾。

This article demostrates how to test a POST WebAPI without any tool software in the restricted production Windows environment.


Comments

# by noname

居然有這麼一天也用到這招.. 感謝黑暗大的分享!

# by Ike

黑大可以展示一下怎麼 Post 到 WCF 嗎? 資料的傳輸好像比 WebAPI 麻煩得多!?

# by Jeffrey

to lke, 要處理一堆噁心的 XML,可以參考這篇 https://firozansari.com/2017/10/21/making-wcf-service-request-using-postman/

# by Ike

真的噁心 XD 謝謝黑大指引

# by JN

真的太實用了 感謝分享

Post a comment