2016-11-20 62 views
2

TLDR:將$ _POST數組序列化爲文件並將其讀回到另一個請求或不同腳本的$ _POST變量中是否安全?

我意識到這是不尋常的。這是有原因的,並且需要十幾頁文字來解釋爲什麼我正在考慮在特殊情況下做這件事,至少在此期間。

歸結過程:

file_put_contents('sample.post', serialize($_POST)); 

$_POST = unserialize(file_get_contents('sample.post')); 

我已經爲可變後的實際內容中所廣泛篩選。我的問題是序列化和反序列化整個$ _POST數組的過程是否給惡意用戶一種攻擊方法。如果你的代碼不能在unserialize()中傳遞,那麼反序列化可能會導致代碼被加載並執行,這是由於對象的實例化和自動加載,而惡意用戶可能會利用它。

我發現這些文章描述這種攻擊方法。但它們似乎取決於用戶能夠指定要直接反序列化的字符串,IE反序列化($ _ POST ['value'])。

https://www.notsosecure.com/remote-code-execution-via-php-unserialize/ https://heine.familiedeelstra.com/security/unserialize

我是正確,只要我序列化和反序列化,對象不能在反序列化過程中產生的,對不對?

我的印象是$ _POST數組只會包含字符串(雖然我無法找到在PHP文件,明確提到的)下。

據我所知,即使有人提供一個字符串匹配的序列化對象的格式,將「存儲」作爲序列化過程中的字符串,具有顯式長度(字節長度)。所以它只會在反序列化時被指定爲一個字符串。這似乎是因爲在序列化過程中字符串的長度與它們一起存儲,所以不能像使用SQL注入一樣從輸入中破壞序列化字符串的結構。我試圖用一些無效的多字節字符來欺騙它,但沒有運氣。但是,我無法做到這一點,經驗豐富的黑客能夠做到這一點是兩件不同的事情。

我無法找到任何關於其他攻擊方法。

請讓我知道如果我失去了一些東西!我剛剛讀了幾條評論,說'你永遠不應該這樣做',所以我很緊張,我誤解了一些東西。

+0

看起來像你有你的基地覆蓋 – 2016-11-20 04:36:59

回答

0

我認爲如果沒有進一步的攻擊發送一些POST變量來利用unserialize()稍後在場景中的調用是不可能的,但其他人可能有一個想法。這可能是一個問題,如果$ _POST有一些不可序列化的東西,但我認爲這可能不會發生。無論是在$ _ POST,它已經在內存中一次,所以假設serialize()unserialize()正常工作,它應該是安全的做這樣的事情

$serialized = serialize($userinput); 
unserialize($serialized); 

但是,你插圖中保存這些數據到磁盤。在利用不同的漏洞並訪問你的文件(或者像「IT設計人員」那樣「通過設計」訪問)之後,攻擊者可能會修改已保存的序列化數據,並可能在那裏注入攻擊。這樣它顯然是脆弱的。

所以這確實是一個風險,儘管可能不是很高。請注意,此解決方案的安全性很大程度上取決於您保存的序列化內容的安全性。

+0

有人可以請仁慈解釋downvote?如果你告訴我爲什麼這是錯誤的,我很樂意修改或刪除我的答案。 –