<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    gomarkdown/markdown 項目的 XSS 漏洞產生與分析

    VSole2021-08-24 17:02:02

    前言

    gomarkdown/markdown 是 Go 語言的一個流行模塊,它旨在快速地將 Markdown 文檔轉化為 HTML 頁面。而此次發現的漏洞,來源于作者在編寫其語法樹 Parser 的時候無意的一次 unescape。

    漏洞復現

    我們首先來看一段代碼。

    package mainimport (    "fmt"    "github.com/gomarkdown/markdown"    "html")func main() {    var textToRender = "```\"1;>```"    var middleware = html.EscapeString(textToRender)    var result = markdown.ToHTML([]byte(middleware), nil, nil)    fmt.Println(string(result))}
    

    大部分人一眼看過來,發現有 html.EscapeString 方法進行過濾,可能就跟筆者一開始一樣,認為這里一定沒什么問題。其實不然,我們可以采用 v0.0.0-20210514010506-3b9f47219fe7,也就是筆者提交 issue 之前的最新版本來試一下,看結果會怎樣。

    可以發現我們原本使用 html.EscapeString 進行轉義的字符不受影響地出現在了結果中,從而導致了 script 標簽被單獨完整地渲染到 HTML,從而引入了一個外部 js 文件。更進一步的說,為 XSS 提供了完美的條件。

    漏洞分析

    使用上述給出的代碼進行調試,先看一個調用棧。

    從 ToHTML 方法進來之后直接到 doc := Parse(markdown, p),從而進入了 Parse 這個方法。

    然后就是調用到 block 方法對輸入的 Markdown 字符串進行分塊的處理。在逐一判斷到代碼塊后進入了 fencedCodeBlock 方法。

    在其中將代碼塊的內容分解填入對象之后,會進入 finalizeCodeBlock 進行一個收尾工作。

    跟進去之后可以發現這個方法是這樣的。

    func finalizeCodeBlock(code *ast.CodeBlock) {    c := code.Content    if code.IsFenced {        newlinePos := bytes.IndexByte(c, '')        firstLine := c[:newlinePos]        rest := c[newlinePos+1:]        code.Info = unescapeString(bytes.Trim(firstLine, ""))        code.Literal = rest    } else {        code.Literal = c    }    code.Content = nil}
    

    code.Info 的內容被 unescapeString 處理了一次,也就是最后得到意外結果的問題根源。接著往后跟蹤,可以發現處理后的內容被放進對象 p 后直接利用語法樹完成了渲染,最終得到 HTML 字符串,而被解碼后的內容并沒有被二次轉義。

    因此,最后得到的字符串就出現了上文的問題。

    漏洞的修復

    由于漏洞的產生是因為解碼后沒有再次編碼,因此可以將其使用 html.EscapeString 重新處理一次,將原有的語句做如下替換。

    - code.Info = unescapeString(bytes.Trim(firstLine, ""))+ code.Info = []byte(html.EscapeString(string(unescapeString(bytes.Trim(firstLine, "")))))
    

    此時再重新運行一次文章開始時給出的代碼,可以得到如下結果。

    <pre><code class="language-"1;&gt;&lt;script/src="http://HOST/xss.js"&gt;&lt;/script&gt;">code>pre>
    

    可以發現由于再次進行了 HTML 實體轉義,script 標簽沒有被獨立渲染,從而避免了 XSS 的產生。

    xssmarkdown
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    跨站腳本英文全稱(Cross Site Scripting跨站腳本),為了不和css層疊樣式表(英文全稱:Cascading Style Sheets)混淆,因此將跨站腳本縮寫為XSS。本期我們講解一下XSS漏洞原理和利用檢測。
    gomarkdown/markdown 是 Go 語言的一個流行模塊,它旨在快速地將 Markdown 文檔轉化為 HTML 頁面。而此次發現的漏洞,來源于作者在編寫其語法樹 Parser 的時候無意的一次 unescape。
    每個黑客都會遇到這個,第一個賞金。我實際上無法解釋它的感覺,但我知道你們中的大多數人都能理解它的感覺。當我們開始在 Web 應用程序安全中進行漏洞賞金時,我們大多數人都會從 XSS開始,故事從這里開始。
    存儲空間的名稱在 OSS 范圍內必須是全局唯一的,一旦創建之后無法修改名稱。和傳統的文件系統不同,對象沒有文件目錄層級結構的關系。因此可以登錄自己的阿里云賬號,創建同樣的 Bucket 即可。
    存儲空間的名稱在 OSS 范圍內必須是全局唯一的,一旦創建之后無法修改名稱。和傳統的文件系統不同,對象沒有文件目錄層級結構的關系。因此可以登錄自己的阿里云賬號,創建同樣的 Bucket 即可。
    為了提高安全服務項目的檢測效率、規范性、全面性,Tide安全團隊結合在滲透測試行業的經驗和安全開發方面的積累,開發了一款自動化滲透測試工具。 該工具使用Golang開發為CS架構,集“資產探測-服務識別-爬蟲-被動監測-漏洞掃描-POC檢測-截屏-報告”于一體,適合甲方或乙方安服團隊對目標系統進行全面的安全檢測并輸出報告。 本文主要介紹一下該工具的框架及部分實現思路。
    Lodash 是一個 JavaScript 庫,包含簡化字符串、數字、數組、函數和對象編程的工具,可以幫助程序員更有效地編寫和維護 JavaScript 代碼。并且是一個流行的 npm 庫,僅在GitHub 上就有超過 400 萬個項目使用,Lodash的普及率非常高,每月的下載量超過 8000 萬次。但是這個庫中有幾個嚴重的原型污染漏洞。
    XSS 掃描工具 -- DalFox
    2023-03-10 10:54:24
    它配備了強大的測試引擎,為滲透測試提供了許多利基功能!
    它的主要特性有:1、動態地語義分析網頁中的JavaScript源碼,Hook關鍵點,利用污點分析檢出 Dom-Based XSS2、極低的誤報率:通過監聽瀏覽器對話框彈出事件等進行驗證。--proxy value set proxy and all traffic will be routed from the proxy server through
    XSS漏洞是Web應用程序中最常見的漏洞之一。如果您的站點沒有預防XSS漏洞的固定方法,那么很可能就存在XSS漏洞。 這篇文章將帶你通過代碼層面去理解三個問題: 什么是XSS漏洞? XSS漏洞有哪些分類? 如何防范XSS漏洞?
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类