Encoding and Filtering
URL編碼:https://perishablepress.com/stop-using-unsafe-characters-in-urls/
HTML編碼:需要知道如何編碼以及如何解碼
-
文件字元編碼:HTTP協議或指令
https://datatracker.ietf.org/doc/html/rfc2616 Content-Type:text/html; charset=utf-8
如果未定義則預設傳送:https://en.wikipedia.org/wiki/ISO/IEC_8859-1
使用HTTP協議定義字元編碼:
PHP:header('Content-type: text/html; charset=utf-8’);
asp.net:<%Response.charset="utf-8"%>
JSP:<%@ page contentType="text/html; charset=UTF-8" %>
HTML指令:<meta http-equiv="Content-Type" Content='text/html; charset=utf-8'>
或 HTML5<meta charset="utf-8"'>
-
Character References 字元引用
HTML的特殊字元多含義:比如 <,表示標籤和比較運算子符號
HTML4:https://www.w3.org/TR/1998/REC-html40-19980424/charset.html#h-5.3
HTML5:https://html.spec.whatwg.org/#character-references
< 的編碼
命名實體 <
十進位制 <
十進位制:<
十進位制:< 或 <
十六進位制 < 或 <
十六進位制:< 或 <
十六進位制:�x3c 或 �x3c
base 36進位制編碼(web應用在使用它:reddit或域名縮短服務等,https://www.reddit.com/ https://tinyurl.com/)
PHP:<?=base convert("OHPE",36,10);?>
http://www.php.net/manual/en/function.base-convert.php
JavaScript編碼:(1142690).toString(36)
或 1142690..toString(36)
JavaScript解碼:parselnt("ohpe",36)
base64進位制編碼
[0-9][a-zA-Z]再加上 + 和 /
共計64個字元來表示。
實現時:但是不同的實現對兩個相近的或填充的地方使用 = https://en.wikipedia.org/wiki/Base64#Implementations_and_history
如果總位元數不是6的倍數,則需要新增空位元,直到總數既是6的倍,結果長度也是4的倍數。如果最新的組是“空”(000000),編碼值是=,如果後面的“空組”是兩個,將被編碼為==。
PHP編解碼:<?=base64 encode('encode this string")?>
或 <?=base64 decode(ZW5jb2RllHRoaXMgc3RyaW5n')?>
JavaScript編解碼:window.btoa('encode this string');
或 window.atob('ZW5ib2RlHRoaXMgc3RyaW5n');
https://developer.mozilla.org/en-US/docs/Web/API/Window/btoa
字元超出範圍的異常(要處理Unicode字串,需要在使用 Base64 函式之前對Unicode字串進行編碼。):https://developer.mozilla.org/en-US/docs/Web/API/Window/btoa
Unicode編碼
因為你在某個輸入框使用了AES加解密,所以payload(惡意輸入123456)自帶繞waf,以上編碼的應用同理(說白了就是web應用或中介軟體本身存在解碼)
如果你很無聊的話,論文指導一切:http://www.joelonsoftware.com/articles/Unicode.htm
對映unicode的三個點:UTF-8,UTF-16,UTF-32,utf表示Unicode轉換格式,後面的數字表示表示程式碼點的位元數。
瞭解Unicode字元是如何透過不同的實現(如URL、HTML、JavaScript等)來處理的也很有用
除了Unicode字元在多種編碼型別中的表示外,另一個有趣的方面是標準和不同實現對某些字元的解釋在預期之外。
視覺欺騙(同形異義詞)
這些字元也被稱為混淆字元,受到了 Unicode 聯盟(TR39)的特別關注,以至於他們提供了一種實用程式,透過該實用程式,您可以檢視與輸入字串混淆的組合。
https://util.unicode.org/UnicodeJsps/confusables.jsp
http://www.unicode.org/reports/tr39/
同形異義詞 Homoglyph Attack Generator: http://www.irongeek.com/homoglyph-attack-generator.php
釣釣釣:http://www.irongeek.com/i.php?page=security/out-of-character-use-of-punycode-and-homoglyph-attacks-to-obfuscate-urls-for-phishing
多元件打架,轉中轉中轉(輸入1,過濾器檢查I,後面的元件把I轉成了1):過濾器檢查evil不成功,之後其他元件又將它解釋回去了
使用其他國家的語言s,後面的元件把它解釋成s
案例:https://engineering.atspotify.com/2013/06/creative-usernames/
工具
https://qaz.wtf/u/convert.cgi
http://ww1.txtn.us/
https://codepoints.net/
https://util.unicode.org/UnicodeJsps/
有時,以上編碼會出現套娃的情況(web應用需要或開發測試的遺留問題)
- Filtering Basics
內部控制可以在 Web 應用程式的不同層實現。它們可以被表示為庫和 APIS(由初學者開發人員),或者在最好的情況下,由內部專家或外部組織(如OWASP 的 ESAPI)表示。安全控制元件也存在於大多數常見瀏覽器中。
https://owasp.org/www-project-enterprise-security-api/
有時,由於大量的複雜性和標準,內部解決方案是不可能的,或者實施內部解決方案的問題太大。這些解決方案可能以庫或API的形式存在;然而,關鍵是採用外部解決方案。
一般來說,這些解決方案屬於IDS和IPS領域,但對於Web應用程式,大多數選擇的是Web應用程式防火牆WAF)
modsecurity:http://www.modsecurity.org/
正則王者:Filter,waf,IDS/IPS說白了底層用的同一套規則邏輯
正規表示式
正規表示式引擎(是軟體,還有版本,彼此並不相容):DFA 或 NFA
https://en.wikipedia.org/wiki/Nondeterministic_finite_automaton
https://en.wikipedia.org/wiki/Deterministic_finite_automaton
由於其確定性方法,DFA引擎比NFA更快,但它不支援懶惰量詞和反向引用等有用的功能。此外,NFA的工作方式是人們傾向於做的:正規表示式導向。NFA號擎更受歡迎也就不足為奇。
正規表示式引擎彼此並不相容
https://www.regular-expressions.info/refflavors.html
https://en.wikipedia.org/wiki/Comparison_of_regular_expression_engines
正則語法並不多,但更簡單的是GPT一把梭
為了避免錯誤的過濾器和混淆有效載荷,通常使用非列印字元(控制字元):https://en.wikipedia.org/wiki/Control_character
Non-Printing Characters 非列印字元
與Unicode相容的正規表示式特性使用特定的元序列來匹配程式碼點 \ucode-point ,其中 code-point 是要匹配的字元的十六進位制數。有些正規表示式(如 PCRE)不支援前一種表示法,而是使用序列 \x{code-point} 代替。
.NET Java, JavaScript and Python中匹配:\u2603
Apache和PHP中匹配:\x{2603}
字元特性
白名單的假陽性讓人發瘋,所以waf經常部署於黑名單模式
需要一個正則王者
有的waf會在cookie中出現指紋,有的waf會根據惡意請求重寫頭或刪除響應,修改響應碼,修改響應頁,關閉連線(alert改成drop,日誌記錄直接改成丟棄)
waf檢測
https://github.com/EnableSecurity/wafw00f
waf喜歡的小聰明:
- Cookies
- Server Cloaking
- Response Codes
- Drop Action
- Pre-Built-In Rules
nmap的waf檢測指令碼
https://nmap.org/nsedoc/scripts/http-waf-fingerprint.html
其他工具:https://code.google.com/archive/p/imperva-detect/
客戶端過濾器