博客 / 詳情

返回

從HTML注入到CSRF:一次漏洞組合拳實戰

前言

免責聲明:本文僅供安全學習研究,所有測試均在授權環境或自建靶場中進行。嚴禁用於非法用途,否則後果自負。

HTML注入 + CSRF登出漏洞實戰復現

漏洞概述

在某社區平台的評論功能中發現存儲型HTML注入漏洞。雖然前端做了輸入過濾,且存在WAF防護,但通過逆向前端加密邏輯並構造特殊payload,成功繞過所有防護,注入惡意<a>標籤。結合平台存在的GET方式登出接口,實現了點擊即登出的CSRF攻擊。

先在前端進行注入,發現有waf。

WAF規則存在以下缺陷:

  1. 標籤名和<之間有空格可繞過

  2. 屬性名大小寫敏感

  3. 只檢測小寫href

構造繞過payload:

<!-- 原始payload -->
<a href="http://***.com">點擊</a>
<!-- 繞過payload -->
< a HREF="http://***.com">點擊</a >

但經過瀏覽器解析,< a 不會被識別為標籤。此時已經不想手動繼續嘗試了,準備寫腳本看看到底哪些操作能繞過waf。

通過逐步測試,發現WAF檢測規則:

001.jpg

寫腳本過程:

對發表評論進行抓包,當我想模擬請求的時候發現請求體被加密了,這個時候就需要拿出我的逆向功底了

全局搜索sign,打斷點發包。

【----幫助網安學習,以下所有學習資料免費領!加vx:YJ-2021-1,備註 “博客園” 獲取!】

 ① 網安學習成長路徑思維導圖
 ② 60+網安經典常用工具包
 ③ 100+SRC漏洞分析報告
 ④ 150+網安攻防實戰技術電子書
 ⑤ 最權威CISSP 認證考試指南+題庫
 ⑥ 超1800頁CTF實戰技巧手冊
 ⑦ 最新網安大廠面試題合集(含答案)
 ⑧ APP客户端安全檢測指南(安卓+IOS)

關鍵加密點:

 const encrypted = encryptData(content);
 const sign = generateSign(encrypted, timestamp);

content就是我們的評論內容,encrypted就是對我們的評論進行了加密,而sign簽名則是將加密後的評論內容加上時間戳進行了二次加密。

進入encryptData函數,清晰明瞭的看到是AES加密,直接套庫復現就行。

而簽名函數則是md5加鹽。

拿加密之後的值去模擬發包,發現error報錯了

原來是沒登錄

攜帶登錄的參數去測試發現換行符可以繞過WAF且瀏覽器正常解析! 最終繞過payload

# 使用換行符繞過(注意:前端輸入框無法輸入換行符,必須通過腳本發包)
payload = '<a\nHREF="/api/logout">點擊領取優惠</a>'

腳本發送成功且沒有被waf攔截,評論發佈後刷新頁面,惡意標籤被瀏覽器解析渲染,顯示為可點擊的超鏈接,HTML注入成功!

點擊之後直接重定向到了登出鏈接

往回跳一頁,一刷新,這個時候就已經登出了,假如用户A正在寫文章,同時瀏覽其他帖子時誤點了惡意鏈接,觸發登出。等他切回寫作頁面點擊發布時,才發現session已失效,未保存的內容全部丟失。

用户點擊後直接登出,實現CSRF攻擊。雖然危害不算特別大,但足以證明漏洞的存在。

關鍵點

前端輸入框裏按回車是提交表單,沒法輸入真正的換行符 \n。所以必須:

  1. 先逆向前端加密邏輯

  2. 用Python腳本構造包含換行符的payload

  3. 自己加密、簽名後直接發包

這就是為什麼前端過濾 + WAF 都擋不住——攻擊者根本不走前端,直接構造請求繞過所有客户端校驗。最重要的就是敏感操作(登出、刪除、修改)不應使用GET方式,否則容易被CSRF利用。

當時首次提交的時候,是重定向掛馬攻擊被打回了,第二次結合了敏感操作也是收錄了中危一枚。

總結

單個漏洞可能危害有限,但組合起來可能產生更大影響:

  • HTML注入(低危)+ GET登出(低危)= CSRF攻擊(中危)

更多網安技能的在線實操練習,請點擊這裏>>

 

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.