簡體   English   中英

XSS - 哪些 HTML 標簽和屬性可以觸發 Javascript 事件?

[英]XSS - Which HTML Tags and Attributes can trigger Javascript Events?

我正在嘗試編寫一個安全且輕量級的基於白名單的 HTML 凈化器,它將使用 DOMDocument。 為了避免不必要的復雜性,我願意做出以下妥協:

  • HTML 注釋被刪除
  • scriptstyle標簽一起被剝離
  • 只會返回body標簽的子節點
  • 所有可以觸發 Javascript 事件的 HTML 屬性都將被驗證或刪除

我已經閱讀了很多關於 XSS 攻擊和預防的文章,我希望我不會太天真(如果我是,請告訴我!)假設如果我遵循我上面提到的所有規則,我會免受 XSS 攻擊。

問題是我不確定除了默認的 Javascript 事件屬性之外還有哪些其他標簽和屬性(在任何 [X]HTML 版本和/或瀏覽器版本/實現中)可以觸發 Javascript 事件:

  • onAbort
  • onBlur
  • onChange
  • onClick
  • onDblClick
  • onDragDrop
  • onError
  • onFocus
  • onKeyDown
  • onKeyPress
  • onKeyUp
  • onLoad
  • onMouseDown
  • onMouseMove
  • onMouseOut
  • onMouseOver
  • onMouseUp
  • onMove
  • onReset
  • onResize
  • onSelect
  • onSubmit
  • onUnload

是否有任何其他非默認或專有事件屬性可以觸發 Javascript(或 VBScript 等)事件或代碼執行? 我可以想到hrefstyleaction ,例如:

<a href="javascript:alert(document.location);">XSS</a> // or
<b style="width: expression(alert(document.location));">XSS</b> // or
<form action="javascript:alert(document.location);"><input type="submit" /></form>

我可能會刪除 HTML 標簽中的任何style屬性, actionhref屬性帶來更大的挑戰,但我認為以下代碼足以確保它們的值是相對或絕對 URL,而不是一些討厭的 Javascript 代碼:

$value = $attribute->value;

if ((strpos($value, ':') !== false) && (preg_match('~^(?:(?:s?f|ht)tps?|mailto):~i', $value) == 0))
{
    $node->removeAttributeNode($attribute);
}

所以,我的兩個明顯問題是:

  1. 我是否缺少任何可以觸發事件的標簽或屬性?
  2. 是否存在這些規則未涵蓋的任何攻擊向量?

經過大量測試、思考和研究,我提出了以下(相當簡單的)實現,它似乎不受我可以拋出的任何 XSS 攻擊向量的影響。

我非常感謝您的所有寶貴答案,謝謝。

你提到hrefaction作為地方javascript: URLs 可以出現,但你在一堆其他 URL 加載屬性中缺少src屬性。

OWASP Java HTMLPolicyBuilder 的第 399 行是白名單 HTML 清理程序中 URL 屬性的定義。

 private static final Set<String> URL_ATTRIBUTE_NAMES = ImmutableSet.of( "action", "archive", "background", "cite", "classid", "codebase", "data", "dsync", "formaction", "href", "icon", "longdesc", "manifest", "poster", "profile", "src", "usemap");

HTML5 索引包含屬性類型的摘要。 它沒有提到一些有條件的東西,比如<input type=URL value=...>但是如果你掃描那個列表來尋找有效的 URL和朋友,你應該對 HTML5 添加的內容有一個很好的了解。 類型為%URIHTML 4 屬性集也提供了信息。

您的協議白名單看起來與OWASP sanitizer非常相似。 添加ftpsftp看起來足夠無害。

Caja JS HTML sanitizer使用的Caja JSON 白名單是 HTML 元素和屬性的安全相關架構信息的一個很好的來源。

你打算如何渲染生成的 DOM? 如果您不小心,那么即使您刪除了所有<script>元素,攻擊者也可能會使用有問題的渲染器來生成瀏覽器解釋為包含<script>元素的內容。 考慮不包含腳本元素的有效 HTML。

<textarea><&#47;textarea><script>alert(1337)</script></textarea>

有問題的渲染器可能會輸出以下內容:

<textarea></textarea><script>alert(1337)</script></textarea>

它確實包含一個腳本元素。

(完全披露:我寫了上面提到的兩種 HTML 消毒劑的大塊。)

Garuda 已經給出了我認為“正確”的答案,而且他的鏈接非常有用,但他一拳把我打敗了!

我給出我的答案只是為了加強。

在這個 html 和 ecmascript 規范中增加功能的時代,避免 html 中的腳本注入和其他此類漏洞變得越來越困難。 隨着每一個新的添加,一個完整的可能注入的世界被引入。 再加上不同的瀏覽器可能對如何實現這些規范有不同的想法,因此您可能會遇到更多可能的漏洞。

看一看html 5引入的向量的簡短列表

最好的解決辦法是選擇你會允許的,而不是你會拒絕的。 更容易說“這些標簽和這些給定標簽的這些屬性是允許的。其他所有東西都將相應地清理或丟棄。”

對我來說,編制一個列表並說“好吧,你去吧:這是你遺漏的所有注入向量的列表。你可以睡得很安穩”,這對我來說是非常不負責任的。 事實上,可能有很多注入向量甚至不為黑帽或白帽所知。 正如 ha.ckers 網站所說,腳本注入實際上只受頭腦的限制。

我想至少回答你的具體問題,所以這里是你的黑名單中一些明顯的遺漏:

  • img src屬性。 我認為重要的是要注意src是其他元素的有效屬性,可能是有害的。 img還有dynsrclowsrc ,甚至更多。
  • typelanguage屬性
  • 除了 html 注釋之外的CDATA
  • 未正確清理輸入值。 這可能不是問題,具體取決於您的 html 解析有多嚴格。
  • 任何不明確的特殊字符。 在我看來,即使是明確的也應該被編碼。
  • 屬性上的引號丟失或不正確(例如嚴重引號)。
  • 過早關閉 textarea 標簽。
  • 腳本中的 UTF-8(和 7)編碼字符
  • 即使你只會返回body標簽的子節點,許多瀏覽器仍然會評估head ,和html里面的元素body ,最head -只有元素的內部, body無論如何,因此這可能幫助不大。
  • 除了css表達式,背景圖片表達式
  • frame s 和iframe s
  • embed並且可能是objectapplet
  • 服務器端包括
  • PHP標簽
  • 任何其他注入(SQL 注入、可執行注入等)

順便說一句,我確定這無關緊要,但是camelCased 屬性是無效的xhtml 並且應該是小寫的。 我確定這不會影響你。

您可能需要查看這 2 個鏈接以獲取更多參考:

http://adamcecc.blogspot.com/2011/01/javascript.html (這僅適用於“過濾”輸入會在頁面上的腳本標簽之間找到自己的情況)

http://ha.ckers.org/xss.html (其中列出了許多特定於瀏覽器的事件觸發器)

出於這個原因,我也使用了 HTML Purifier,正如您所做的那樣,它也結合了所見即所得的編輯器。 我所做的不同之處是使用了一個非常嚴格的白名單,其中包含一些可用的基本標記和屬性,並在需要時擴展它。 這可以防止您受到非常模糊的向量(如上面的第一個鏈接)的攻擊,並且您可以逐個挖掘新需要的標簽/屬性。

只有我的 2 美分..

不要忘記 HTML5 JavaScript 事件處理程序

http://www.w3schools.com/html5/html5_ref_eventattributes.asp

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM