歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

濫用jQuery導致CSS時序攻擊

來源:本站整理 作者:佚名 時間:2019-05-25 TAG: 我要投稿

亞瑟·薩夫尼斯(Arthur Saftnes)去年發表了一篇非常棒的文章,介紹了他在利用CSS選擇器和Javascript進行時序攻擊方面的研究成果。說實話,它可能是我去年最喜歡的一篇文章。
注:如果你是第一次接觸這類攻擊,為方便理解本文,請先閱讀上面這篇博文。
網站通常會使用下面這個方法將location.hash傳遞給jQuery $ function:
$(location.hash);
攻擊者有時可以控制hash值,并通常用來造成XSS,但jQuery在許多年已修復該漏洞。亞瑟發現該模塊理論上仍可以被利用,從而導致時序攻擊。你可以通過重復調用jQuery :has selector,然后注意目標頁面中的內容的變化,判定對性能的影響。通過這點,攻擊者可以把不可能造成XSS的情況轉化為解析任意輸入的端點。
于是我決定跟進這個研究,想要在外部網絡中利用此技術找出一些漏洞。首先我把Burp Scaner修改為動態分析,以尋找hashchange事件中正在執行的jQuery選擇器,然后掃描了一堆網站。我選擇hashchange這個事件的原因是該攻擊的局限性;為判定對性能的影響你需要重復更改hash值,導入所有可能的字符進行二進制搜索,而這只有hashchange事件觸發時才能運行。原先那篇博文的一個局限是:目前主流瀏覽器都會對站點hash進行URL-encode處理,所以你先要解碼它——但我找到了解決該問題的方法。
我通過hashchange事件發現了一些使用location.hash和jquery $ fuction的Bug賞金項目站點,但找到的大部分站點沒有令我感興趣的數據,我沒怎么竊取它們。Red Hat站點例外,它在hashchange事件中使用了jQuery選擇器,并且站點啟用了賬戶功能。查看Red Hat站點,找不到可以竊取數據的端點,但你會發現當你登入后確實會顯示你的全名。亞瑟在攻擊時使用了CSS屬性選擇器但全名不會出現在任何輸入的元素中,因此我不能套用他的方法。
我查看了所有jQuery CSS選擇器,發現選擇器:contains可以找出包含指定字符的元素。不幸的是使用:contains看不到字符串的開頭和末尾,所有我只能找別的方法提取。起初我想利用空格作為錨點來提取出姓名,但問題是Firefox會對空格進行URL編碼。幸運的是,反斜杠不會進行URL-encode,所以我可以嘗試CSS hex轉義。剛開始我使用的是20,后來發現后續的字符也要進行hex轉義,否則將破壞選擇器,但如果我填充進字符0可以解決這個問題。我對亞瑟的利用代碼稍加修改,添加了make_selector函數來解決空格的問題:
function make_selector(prefix, characters, firstNameFlag, firstName) {
 return characters.split("").map(c => !firstNameFlag ? SLOW_SELECTOR +
 SELECTOR_TEMPLATE.replace('{}',  c + prefix + '\000020') : SLOW_SELECTOR +
 SELECTOR_TEMPLATE.replace("{}",  prefix.replace(/ /, '\000020') + c))
                    .join(",");
}
這段代碼通過hex編碼了空格,幫助掃描出網頁背后的名稱。我使用了firstNameFlag,以區分出姓名和名字,找到姓名的大寫字母后會設置標志,然后使用第一個名稱作為前綴和空格繼續掃描第二個字母,依次掃描出完整名稱。
if(!firstNameFlag && /[A-Z]/.test(name)) {
   firstNameFlag = true;
   name += ' ';
   backtracks = 0;
   continue;
}
我遇到了另一個問題,由于URL-encode的問題,我無法在選擇器里使用空格,而且使用hex轉義也不能解決問題。我想了很久,構建出下面這個沒有空格仍可以判定對性能的影響的選擇器:
const SLOW_SELECTOR="*:has(*:has(*):parent:has(*):parent:has(*):parent:has(*):parent:has(*)):parent:has(";
const SELECTOR_TEMPLATE=".account-user:contains('{}'))";
這仍會導致性能問題,但比使用帶有空格的CSS descendant選擇器要快一些。我面臨的下一個問題是如何確定已經遞歸到名字的末尾。正如我前面提到的那樣,我不能看到字符尾端。目前我想到的唯一方法是連續尋找6個回溯。
 

【聲明】:黑吧安全網(http://www.zjtpzs.live)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        神秘东方电子游艺 股票行情 手机 现在到底是做什么赚钱 梦幻西游官职任务赚钱不 股城模拟炒股软件 如何买股票 西班牙做什么最赚钱? 股票融资融券怎么回事 在农村开游泳馆赚钱吗 怎么在头条上写文章赚钱 我国的股票指数 苹果手机玩试玩赚钱吗 建社区食堂赚钱吗 在哪个软件写文章赚钱 打字赚钱软件是啥 直播管理员如何赚钱 模拟人生3宠物怎么赚钱