上回介紹 IP 界的 Whoscall - AbuseIPDB 時有提到,網站只要掛上 Internet 就一定會被機器人騷擾,跑來網站東看西看,找漏洞鑽。這堆機器人有些屬亂槍打鳥,走海巡路線,先試探網站是否有回應,若有就用常見攻擊手法掃一輪,找到漏洞就算賺到,沒掃到就浪費幾個封包。如果網站本身沒有安全漏洞,三不五時被掃瞄一下倒也沒啥大礙,就只是覺得煩而已。

假設我有個非公開網站,只有小圈圈的人知道 URL,首頁限定會員瀏覽,必須要帶特殊參數才能看內容。簡單拼裝個範例如下:

<%@ Page Language="C#" %>
<script runat="server">
void Page_Load(object sender, EventArgs e)
{
	if (MyAccessModule.CheckPasscode(Request["passcode"])) 
	{
		Response.StatusCode = 401;
		Response.Write("Access Denied");
		Response.End();
	}
}
</script>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>會員專屬優惠</title>
	</head>
	<body>
		感謝光臨「黑大帶你飛」投資群組,本期明牌為 XXXX
	</body>
</html>

passcode 參數有效才能看內容,否則出現 Access Denied,程式看起來沒什麼問題。

不過,有些機器人是依據首頁回應判斷網站是否存在,即便傳回 401/403/404/500 也會啟動後續的抓漏程序。面對這類非針對性騷擾,有個因應做法是不提供回應,讓對方搞不清楚網站狀態,跳過你的網站去找下一個目標。

例如這樣:

面對來自海巡機器人或是路人的試探,直接切斷連線多少有點欺敵效果,能閃過一個算一個。要實現以上效果,除了從防火牆設備、IIS 或 Reverse Proxy 服務下手,要用 ASP.NET 實現也很簡單,改用 Request.Abort() 即可:

	if (MyAccessModule.CheckPasscode(Request["passcode"])) 
	{
		Request.Abort();
	}

依據微軟 API 文件,Request.Abort() 會強制終止底層 TCP 連線,讓外送 IO 失敗,可用於回應惡意 HTTP 客戶端的攻擊。(Forcibly terminates the underlying TCP connection, causing any outstanding I/O to fail. You might use this method in response to an attack by a malicious HTTP client.) 適用我們說的情境。

不過要提醒一點,此類設計易成為偵錯陷阱,找人看問題時請主動告知調查人員,否則若有茶包射手因此鬼打牆大半天,得知真相的怨念可能會引發刑事案件。

Tips of using Response.Abort to close underlying TCP conection to reponse the attacks of malicious HTTP clients.


Comments

Be the first to post a comment

Post a comment