也談跨站指令碼攻擊與防禦

2022-09-29 05:00:09 字數 3094 閱讀 8903

網路上曾經有過關於跨站指令碼攻擊與防禦的文章,但是隨著攻擊技術的進步,以前的關於跨站指令碼攻擊的看法與理論已經不能滿足現在的攻擊與防禦的需要了,而且由於這種對於跨站指令碼認識上的混亂,導致現在很多的程式包括現在的動網都存在著跨站指令碼過濾不嚴的問題,希望本文能給寫程式的與研究程式的帶來一點思路。

還是首先看看跨站指令碼漏洞的成因,所謂跨站指令碼漏洞其實就是html的注入問題,惡意使用者的輸入沒有經過嚴格的控制進入了資料庫最終顯示給來訪的使用者,導致可以在來訪使用者的瀏覽器裡以瀏覽使用者的身份執行html**,資料流程如下:

惡意使用者的html輸入————>web程式————>進入資料庫————>web程式————>使用者瀏覽器

這樣我們就可以清楚的看到html**是如何進入受害者瀏覽器的了,我們也就可以根據這個流程來討論跨站指令碼的攻擊與防禦了!

1 什麼是html輸入?

這裡給出乙個html**的示例

很多的程式最終都是將使用者的輸入轉換成這種形式的。可以看到<>是告訴瀏覽器這是乙個html標記,img是這個html標記的名稱,src是這個標記的第乙個屬性,=後面是這個屬性的值,後面的width是第二個屬性,onerror是標記的事件屬性。大家可以看到,乙個html標記是包括很多元素的,並不是傳統意義上的只有輸入<>才會注入html,事實上只要你的輸入處在html標籤內,產生了新的元素或者屬性,就實現了跨站指令碼攻擊!實際上大多數隱秘的跨站指令碼攻擊是不需要<>的,因為現在的ubb標籤已經讓你處在了html標記之內,很有意思,不是麼?

2 **才是罪惡的**?

既然我們的目標是引入**程式設計客棧在目標使用者的瀏覽器內執行,那麼我們來看看哪些地方可以引入html**吧!如果使用者可以不受限制的引入<>,那麼很顯然他可以完全操縱乙個html標記,譬如這樣的形式,這對於追求安全的程式來說是絕對不允許的,所以首先要做轉換的就是<>,通過如下**:

過濾**:

replace(str,"replace(str,">",">")

好了,使用者可能不能構造自己的html標記了,那麼利用已經存在的屬性如何呢?下面的**依然可以工作得很好:

j**ascript:alert(/xss/)" width=100>

因為很多的html標記裡屬性都支援j**ascript:[code]的形式,很好,很多的程式意識到了這一點,可能做了如下的轉換:

過濾**

dim re

set re=new regexp

re.ignorecase =true

re.global=true

re.p程式設計客棧attern="j**ascript:"

str = re.replace(str,"j**ascript:")

re.pattern="jscript:"

str = re.replace(str,"jscript:")

re.pattern="vbscript:"

str = re.replace(str,"vbscript:")

set re=nothing

你看,只要發現以j**ascript等指令碼屬性的形式都會被過濾掉,失去了:的指令碼**是起不了作用的!這樣完美了麼?事實上html屬性的值,注意是值而不是屬性本身是支援ascii這種形式表示的,譬如上面的**可以換成這樣:

**又執行了,呵呵!看來你漏掉了點什麼哦,加上這個**kgkbwweq吧!

replace(str,"&","&")

行了,&失去它原來的意義了,使用者不能以其他方式表示html屬性值了哦!等等,這樣的過濾真可以相信麼?只要發現這種過濾的關鍵字機制,饒過就是簡單的問題了:

程式設計客棧rt(/xss/)" width=100>

沒有j**ascript關鍵字了哦!注意中間那個是tab鍵弄出來的!關鍵字被拆分了哦!這是個很麻煩的問題,很多人忘記了這些特殊的字元,呵呵!有人想到要過濾空格了,在過濾之前我們再看看其他的一些東西吧!也許我們現在所處的src屬性已經無法利用了,但是我們依然可以產生自己的屬性或者事件機制哦!依然是可以執行html**的,首先說說事件機制吧:

這樣依然可以執行**的哦!明白問題出在哪了,不是麼?有的程式設計師彷彿明白了,注意我說的是彷彿,動網就是乙個典型的例子,事件屬性不是要onerror麼?很多人開始用正規表示式了,發現關鍵的詞如onerror就會做轉換或者提示使用者不執行,是不是沒有機會了呢?

當然不是的,事件只是讓**執行的一種方法而不是所有的,可以定義事件了那麼也就可以實現自己弄出自己的屬性了,試試下面的:

程式設計客棧;

呵呵,還是執行了哦!在做關鍵字過濾之後有人發現是不是屬性之間分隔要用到空格,好,他們把空格堵死了(這樣認為的人很多,呵呵)!將空格轉成 是個很普遍的方法?是麼?甚至還可以讓別人無法關鍵字拆分,不要太自信了,試試下面的**看看如何:

嘿嘿,good work!這好象是利用了指令碼裡注釋會被當作乙個空白來表示造成的!那怎麼辦呢?上面提到的好象一直都是在進行被動的攻擊防禦,為什麼不抓住他的本源出來呢?**出了問題**堵上!

3 本質

上面的問題好象本質上就是乙個東西,那就是使用者超越了他所處的標籤,也就是資料和**的混淆,對付這種混淆的辦法就是限制監牢,讓使用者在乙個安全的空間內活動,這通過上面的分析大家也可能已經知道,只要在過濾了<>這兩個人人都會去殺的字元之後就可以把使用者的輸入在輸出的時候放到""之間,現在的一般的程式都是這樣做的,譬如將會轉化成

這是個好的安全習慣,然後呢?就要讓使用者的輸入處在安全的領域裡了,這可以通過過濾使用者輸入裡""實現,但是不要忘記了,這個標籤本身也是不安全的,過濾掉空格和tab鍵就不用擔心關鍵字被拆分饒過了,然後就是用文章中提到的辦法過濾掉script關鍵字,最後就是防止使用者通過這樣的形式饒過檢查,轉換掉&吧!

4 困惑

在文章中開始提到的圖里可以看到,資料的轉換和過濾是可以在3個地方進行轉換的,在接受資料的時候可以轉換下,在進入資料庫的時候可以轉換下,在輸出資料的時候也可以轉換下,但是困惑在**呢?不得不面對乙個問題就是許多時候程式設計師捨不得為安全做出那麼大的應用上的犧牲,安全是要有代價的,譬如現在郵箱的就不願意捨棄html標籤,因為需要支援多資多彩的頁面,所以他們側重於xss的ids檢測的性質,只要發現不安全的東西就會轉化,但是攻擊是無法預知的,漂亮的東西總是脆弱的,有限制,肯定就有人會饒過,呵呵。本文沒什麼技術含量,只是希望搞安全的指令碼人員能更加的了解xss,跨站,不是那麼簡單滴! 

本文標題: 也談跨站指令碼攻擊與防禦

本文位址:

跨站指令碼攻擊

跨站指令碼攻擊是眾所周知的攻擊方式之一。所有平台上的web應用都深受其擾,php應用也不例外。所有有輸入的應用都面臨著風險。webmail,code 複製內容到剪貼簿 code 複製php內容到剪貼簿 php echo name writes echo comment 這個流程對 comment及 ...

PHP安全程式設計之跨站指令碼攻擊的防禦

跨站指令碼攻擊是眾所周知的攻擊方式之一。所有平台上的web應用都深受其擾,php應用也不例外。echo name writes echo comment 這個流程對 comment及 name的值給予了充分的信任,想象一下它們中的乙個的內容中包含如下 這是乙個常見的錯誤,主要是由於不好的程式設計習慣...

跨站指令碼攻擊 XSS

跨站指令碼攻擊,cross site script,為了區別css,英文縮寫為xss xss攻擊,通常指hacker通過 html注入 篡改了網頁,插入惡意的指令碼,從而在使用者瀏覽網頁時,控制使用者瀏覽器的一種攻擊。xss根據效果的不同可以分為如下幾類 1.反射型xss 通過將使用者輸入的資料 反...