AdSense

網頁

2018/2/13

處理弱點掃描DOM Based XSS問題,jQuery html() 的參數為整個jsp頁面

jQuery html()有潛在XSS攻擊(跨網站指令碼攻擊)的風險,請參考這篇

今天客戶反映仍有錯誤,因此下面的方法沒用!

今天從客戶那得知最簡單的方法,就是在掃描軟體中註冊白名單,也就是將某些函式註冊到掃描軟體內,而通過註冊函式的變數將被視為通過驗證。


從這段文字以後的內容都是沒用的!

但今天碰到的問題是,前人在使用ajax呼叫時回傳的竟然是一個完整的jsp頁面(糟糕的寫法),這使得利用$('<div/>').text(jspObj).html()來騙過弱點掃描的方法變得不可行,因為text()會忽略<script>標籤,所以jsp <script>內的JavaScript都無法使用了,例如下面ajax成功後回傳的jspObj是一個完整的jsp頁面,但經過處理後則其中的<script>會不見。

<div id="test">
</div>
<script>
$(document).ready(function(){
  $.ajax({
    ...
    success: function(jspObj) {
      $('#test').html(htmlEncode(jspObj)); 
    }
  });
   
  function htmlEncode(value){
    return $('<div/>').text(value).html();
  }
});
</script>

試著改寫成以下才可正確的轉回含<script>的jsp,其實就是把html符號取代成html碼再轉回來而已,不過是否會通過弱點掃描要等幾天後才知道了。

<div id="test">
</div>
<script>
$(document).ready(function(){
  ...
  if (!String.prototype.encodeHTML) {
    String.prototype.encodeHTML = function () {
      return this.replace(/&/g, '&amp;')
               .replace(//g, '&gt;')
               .replace(/"/g, '&quot;')
               .replace(/'/g, '&apos;');
    };
  }
  if (!String.prototype.decodeHTML) {
    String.prototype.decodeHTML = function () {
      return this.replace(/&apos;/g, "'")
               .replace(/&quot;/g, '"')
               .replace(/&gt;/g, '>')
               .replace(/&lt;/g, '<')
               .replace(/&amp;/g, '&');
    };
  }

  $.ajax({
    ...
    success: function(jspObj) {
      var temp = document.createElement("DIV");
      temp.innerHTML = jspObj;
      var htmlString = temp.innerHTML;
      var content = htmlString.encodeHTML().decodeHTML();
      $("#test").html(content);
    }
  });
   
});
</script>

沒有留言:

AdSense