ASP.NET 小技巧 - 非公開網站隱身術
0 |
上回介紹 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