簡體   English   中英

這是否可能作為 Javascript 中的 XSS 漏洞利用

[英]is this possible as an XSS exploit in Javascript

我正在研究一些遺留應用程序,並很好奇這是否是一個可行的 XSS 漏洞?

代碼:

<div id="demo"></div>

<script>

document.getElementById("demo").innerHTML = '<script src="/me.js"></script>';
</script>

我不這么認為,但那里有比我更聰明的人。 這有變化嗎?

這本身是無害的:

document.getElementById("demo").innerHTML = '<script src="/me.js"></script>';

HTML5 指定不應執行插入了innerHTML 的標簽。 1

但是(並且既然你在問),可能(不可否認)這仍然可以被利用的可能性很小:

 // This is the backdoor that an attacker has to inject somehow Object.defineProperty(Element.prototype, 'innerHTML', { set: function (value) { const script = document.createElement('script'); script.textContent = `alert('gotcha! ${value}')`; document.body.appendChild(script); } }); // This is what you're doing in your app document.getElementById("demo").innerHTML = '<script src="/me.js"><\\/script>';
 <div id="demo"></div>

如您所見,解析和提取 url 並將腳本重新注入頁面很容易。


如今,很可能不鼓勵使用innerHTML 例子:

警告:如果您的項目將接受任何形式的安全審查,則使用 innerHTML 很可能會導致您的代碼被拒絕。 例如,如果您在瀏覽器擴展程序中使用了 innerHTML 並將擴展程序提交到 addons.mozilla.org,它將不會通過自動審核過程。 1

React 有一種有趣的方式(恕我直言)阻止你使用它:

risklySetInnerHTML 是 React 在瀏覽器 DOM 中使用 innerHTML 的替代品。 一般來說,從代碼中設置 HTML 是有風險的,因為很容易在不經意間將用戶暴露給跨站點腳本 (XSS) 攻擊。 所以,你可以直接從 React 設置 HTML,但你必須輸入危險的 SetInnerHTML 並傳遞一個帶有 __html 鍵的對象,以提醒自己這是危險的。 2


最后,我認為值得一提的是 epascarello 和 E. Sundin 都有一個有效的觀點。 我們知道<script>在通過innerHTML注入時不會加載和/或執行,但這並不意味着您是安全的:

 <div id="demo"></div> <script> document.querySelector('#demo').innerHTML = '<img src="x.gif" onerror="alert(42)">'; </script>

參考

  1. https://developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML#Security_thinkations
  2. https://reactjs.org/docs/dom-elements.html#dangerouslysetinnerhtml

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM