昨天的野外求生系列 - 無工具 WebApi 徒手測試一文得到不少迴響,我才知道被困在荒島上的工程師還蠻多的 XD,而其中一則讓我震驚的消息是 - 在一些更嚴格的資安規範之下,PowerShell 是被禁用的。

不過,做為一名身經百戰的老士官長,遇到再惡劣的狀況也要有對策,這點小挑戰嚇不倒我的~ 以下是我所想到無 PowerShell 可用時的替代解法:

B 計劃 telnet

如果很幸運該台 Windows 有裝 Telnet Client 的話(預設未安裝,需額外勾選),telnet.exe 是我心中首選。理由是 telnet 是 IT 人員熟悉的常用工具,未涉及程式語言較不易引發資安機制的過當反應。(當然,用 telnet 一樣可以做壞事,未必比跑程式安全,但「社會觀感」這玩意兒很難解釋)

做法是準備一個 ApiTest-1.txt 檔案做好 HTTP POST Request 的原始內容以模擬瀏覽器行為,像是這個樣子:(Content-Length 為 encKey=9527.... 字串的長度)

POST http://localhost:62505/codecapi/encryptstring HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Accept: */*
Host: localhost:62505
Connection: close
Content-Length: 30

encKey=9527&rawText=Darkthread

請 OP 人員操作時,先下指令 type ApiTest-1.txt | clip,將上述內容存入剪貼簿,接著 telnet localhost 62505 連上 IIS 主機,連線後畫面會變黑,此時按滑鼠右鍵貼上放在剪貼簿的內容,即可得到 IIS 回應。實際操作如下:

若參數要採 JSON 方式上傳,則 Content-Type 改為 application/json 即可:

POST http://localhost:62505/codecapi/batchdecryptdata HTTP/1.1
Content-Type: application/json
Accept: */*
Host: localhost:62505
Connection: close
Content-Length: 67

{encKey:"9527",encData:["aNcjoi5QprU=","Ql9bsv6d1BVeq/9icNTcUQ=="]}

一樣可以測試成功:

至於 Content-Length 值,除了自己數字元,也可讓 Notepad++ 等文字編輯器幫忙算:

如果懶得徒手編輯 Request 內文,也可用 Chrome F12 或 Fiddler 側錄 POST 傳送封包抄來用。

【2019-02-11補充】感謝 wellxion 補充實用技巧一則,Postman 能將測試設定匯出為 原始 HTTP Request 內文、cUrl 參數、JavaScript 等多種語言腳本,可多多利用。

C 計劃 IE

由於 telnet.exe 不是預設安裝項目,萬一不幸該 Windows 沒有且無法申請安裝的話,連 IE 都沒得用的機率應該很低,就用 IE 吧!

準備一段 JavaScript:

var xhr=new XMLHttpRequest();
xhr.open("POST","http://localhost:62505/codecapi/encryptstring",false);
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xhr.send("encKey=9527&rawText=Darkthread");
console.log(xhr.getAllResponseHeaders());
console.log(xhr.responseText);

開啟 IE 先連上該網站不存在的網址使之出現 HTTP 404 畫面,按 F12 開啟開發者工具並切到 Console 主控台進行操作。先進入同網站 HTTP 404 畫面的用意是與待測試 WebAPI URL 形成同一網域來源,避免 XHR 請求違反同源政策(Same-Origin Policy)被阻擋。(我用 IE11 模擬測試,預估同做法在 IE8 亦可行,如有錯請指正)

如上圖所示,透過 IE XMLHttpRequest 可成功送出 WebAPI POST 請求。

以 JSON 傳送參數的做法大同小異:

var xhr=new XMLHttpRequest();
xhr.open("POST","http://localhost:62505/codecapi/batchdecryptdata",false);
xhr.setRequestHeader("Content-Type","application/json");
xhr.send('{encKey:"9527",encData:["aNcjoi5QprU=","Ql9bsv6d1BVeq/9icNTcUQ=="]}');
console.log(xhr.getAllResponseHeaders());
console.log(xhr.responseText);

D 計劃 VBScript

如果線上環境禁用 PowerShell 卻沒封鎖 VBScript 的話? (PowerShell 因危險禁用,寫 VBScript 卻可以? 感覺沒道理呀? 但每一條奇怪規矩的背後都有故事,一切就回歸黑格爾的名言「凡存在必合理」吧!)

C 計劃可以改成 VBScript 版:

Dim xhr
Set xhr = CreateObject("Microsoft.XmlHttp")
Call xhr.open("POST","http://localhost:62505/codecapi/encryptstring",false)
Call xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded")
Call xhr.send("encKey=9527&rawText=Darkthread")
WScript.Echo(xhr.getAllResponseHeaders())
WScript.Echo(xhr.responseText)

測試成功。

再補上三種替代方案,祝大家荒野求生愉快~

Considering the case that PowerShell is prohibited in production environment, this article provider some alternative ways to test web api with built-in tool, including telnet, IE and VBScript.


Comments

# by wellxion

Postman有提供轉換成語言腳本工具 我都用那個偷懶XD

# by Jeffrey

to wellxion, 這招太讚了! 感謝分享,已補充於內文。

Post a comment