2014-01-18 75 views
9

我參與到其中有下面的代碼相當於一個javascript框架:下面的JavaScript是否可以安全地避免強制執行代碼?

eval("'" + user_input.replace(/'/g, "'") + "'"); 

我知道這是可怕的 - 不用勸我。我想知道的是,我可以在這裏注入任意代碼嗎?

乍一看,user_input.replace("'", "'")似乎可以防止我脫離弦線。不過,我可以通過換行符,例如\nalert(123)\n,但是結果總是一個語法錯誤,例如,

' 
alert(123) 
' 

實際上是否有一個用於代碼注入的向量,除了引起語法錯誤?

+1

我幾乎可以保證有一些你可以在這裏做的注射...... – Markasoftware

+0

每次你使用'eval()',你可能會認爲它是不安全的,如果評估用戶輸入,你可能犯了很多其他的錯誤,這是黑客夢寐以求的。 – adeneo

+0

你不需要說服我。我只是想爲實際攻擊的開發者提供一個很好的例子。 – bluepnume

回答

8

雖然這無疑是一個令人擔憂的模式,但如果完全按照所述的方式使用它是安全的。唯一能夠在Javascript中終止單引號字符串的字符是單引號字符。只要該字符不出現在插入單引號的字符串中,它就不可能被解釋爲字符串以外的任何其他字符。

關於我能想到的最糟糕的事情,你可以做的是結束一個帶反斜槓的字符串,這會導致一個未終止的字符串,例如,如果user_input是:

example\ 

則評價代碼將是

'example\' 

,這將導致一個語法錯誤,因爲包含在eval字符串從不終止。但是,如果真的eval實際上更復雜,這是可利用的。例如,如果代碼是:

; alert(1); // \ 

,這將導致:

var escaped_input = user_input.replace(/'/g, "&39;"); 
eval("'" + escaped_input + "' some more stuff '" + escaped_input + "'"); 

那麼它可以用等的輸入利用

'; alert(1); // \' some more stuff '; alert(1); // \' 
             ^^^^^^^^^ 

,其中帶下劃線的內容將被評估,因爲應該退出該字符串的報價被轉移,將下一個單引號轉換爲收盤價報價!爲了安全起見,如果可能的話,我建議轉義或更換反斜槓(除非您明確嘗試使用eval()來處理它們,在這種情況下,您可能只是發現異常)。

+0

是的,在node.js repl我可以用'user_input =「console.log(42)\\」'來暫停等待字符串的結尾。 –

+0

這聽起來不太正確。格式錯誤的輸入中的'eval()'應該拋出一個SyntaxError,而不是暫停解釋器。 – duskwuff

+0

是的,在程序中,但在repl中,它只是等待你輸入更多。 –

相關問題