iT邦幫忙

0

白箱原始碼弱掃 Checkmarx 一直追著 location.search 列 XSS 風險

Jax 2021-07-20 00:19:00438 瀏覽

我在新聞列表頁面做了一個搜尋關鍵字功能,POST 送出後,頁面會重新整理,
並且在原本的網址後面增加 "?q=keyword" 類似這樣的網址參數。

為了點進查看詳細內容後,回到列表頁面能保持搜尋條件狀態,
(或點上下頁、分頁,維持搜尋條件的狀態)
我會利用 $(location).attr("search") 把網址參數 "?q=keyword"
填入分頁按鈕的屬性 "href"
比如這樣,產出分頁流水序按鈕

$("#pagelist")[0].innerHTML = $("#pagelist").html() + "<a href='" + $(location).attr("pathname") + $(location).attr("search") + "'>Page N</a>";

因為直接取用 $(location).attr("search") 可能有風險,
所以我另外做了一個 url_replace() 把敏感符號去掉("、'、>、<、(、)以及字串"script"都清會清除掉),

$("#pagelist")[0].innerHTML = $("#pagelist").html() + "<a href='" + url_replace($(location).attr("pathname")) + url_replace($(location).attr("search")) + "'>Page N</a>";

我的理解是這樣:
首先 $(location).attr("search") 取出的字串預設就是 encode
比如我查詢雙引號 ",那取得的值會是 %22,不會是雙引號,
所以理論上不可能利用 雙引號 " 或 單引號 ' 阻斷/創造出新的 HTML 節點/元素
更何況我會先把 " ' < > ( )這些符號清除過濾掉。

再來,我是取完整的 $(location).attr("search")
前面一定會有 "?"
這樣即是網址參數含有惡意指令碼,最前頭也都是有一個"?"

這樣還是會有特殊的腳本指令可以造成 XSS 嗎?

Checkmarx 的建議是使用第三方套件 ESAPI4JS 把 location 參數重新編碼,
但是我去看 https://github.com/ESAPI/owasp-esapi-js
官方已經聲明棄用了 DEPRECATED - OWASP Enterprise Security API for JavaScript (ESAPI-JS)

我應該繼續照 Checkmarx 的建議去使用 ESAPI4JS
還是應該怎麼做才能正確地通過 Checkmarx 針對 javascript 取用 location 相關參數所列報的 XSS 風險?

補充一下:
我有使用 OWASP ZAP 掃過,我上述的做法是沒有 XSS 風險的。
也嘗試過以下功能腳本,也沒有產生 XSS 效果:
https://www.vulnerability-lab.com/resources/documents/531.txt
一個 XSS 遊戲網站,裡面的手法也是無效
https://xss.pwnfunction.com/
這個也是 XSS 腳本範例網站(這個還滿齊全的,還會依照瀏覽器分類)
https://portswigger.net/web-security/cross-site-scripting/cheat-sheet

但是最終 Checkmarx 還是列了 XSS 風險,說你使用了 location 會被社交手法攻擊ooxx...
有不使用第三方套件的解法嗎?懇請賜教!

fillano iT邦超人 1 級 ‧ 2021-07-20 13:07:11 檢舉
把關鍵字欄位移到hidden來實做看看(server在render網頁時,依照查詢的關鍵字來產生),至少應該能避開Checkmarx的檢查。
Jax iT邦新手 5 級 ‧ 2021-07-23 10:07:59 檢舉
最後是透過後端程式的調整,不直接從 location.search 存取搜尋參數值。
你提到的方式下回我想我會這樣做,不要再有實質的頁面切換,讓搜尋資料保存在 hidden 裡面就好,謝謝提供建議

尚未有邦友回答

立即登入回答