在CSS中暗藏程式?!

 Tue, 26 Jun 2007 21:54:38 +0800

今天在論壇看到,在style中使用特別的語法可以嵌入script....真是危險呢。想知道的話,上google找關鍵字「xss」還有「expression」就可以找到不少例子跟討論。(不過好像不影響Firefox)

自己試寫了一下,果然可以執行,這有可能造成安全的問題耶?!

語法像這樣:

style="font-size: 18px; xss:expression(程式碼)"
或是
div {font-size: 18px; xss:expression(程式碼)}

都有相同的效果。

不過在style裡面藏稍微複雜的程式,ie會提示有錯誤。看起來在程式裡面使用「;」(分號)會有問題,所以寫比較複雜的程式會比較困難。不過後來發現有人用一種方式實作,就是把要執行的程式碼當作字串,把字串轉成數字序列,然後用String.fromCharCode()把數字序列轉成字串,再用eval來執行。這種方式不會出現錯誤訊息,而且足以達到隱藏程式以及執行較複雜程式的功能。另外,在google找到的資料裡面看起來,還會影響BBCode等語法。如果網站程式有設計filter來過濾post/get傳進來的資料,最好再加上攔截xss:expression的關鍵字吧。

還好我用的是Firefox....

 


[修改] 2007-6-27

補充一下,我發現其實只要在style裡面用「屬性: expression(程式碼)」的方式就有效,例如

<div style="border: expression(程式碼)">
或是
div {border: expression(程式碼)}

 


[修改] 2007-6-27

嗯嗯,剛剛終於發現了,原來expression()是IE才支援的功能(IE5以上),讓css的屬性值可以用expression language計算(類似JSP、JSTL、JSF吧?)。之前沒發現.....汗

不過即使是這樣,問題還是沒解決.....應該要限制在expression中可以執行的script比較好。因為理論上expression只需要簡單計算的功能就可以了,但是在IE的實作中,它可是擁有完整的javascript功能。而且在expression中間使用alert()來測試,可以發現IE根本就會不定期執行內嵌在style中的script(我用的是IE7),可能在所有網頁事件觸發時都會作用(我發現只要滑鼠移過就...),這樣實在可以為惡意的程式開一道後門耶。