深刻 unserialize() 函數之RCE漏洞身份驗證繞過及注入

文章源自-投稿後端

做者-挽夢雪舞微信

掃描下方二維碼進入社區app

繼續咱們上次的討論,咱們聊到了PHP的反序列化如何致使漏洞,以及攻擊者如何利用POP鏈來實現RCE攻擊。
編輯器

 

今天咱們接着討論攻擊者利用unserialize() 漏洞的其餘騷操做。那麼即便沒法進行RCE攻擊,攻擊者仍可使用該漏洞來實現身份驗證繞過和SQL注入。函數

1、先來談談身份驗證繞過:flex

除了RCE攻擊,unserialize() 一般還被用於繞過應用程序的身份驗證控制。目前我瞭解到的
this

有兩種方法能夠作到這一點:spa

 

1.經過控制用做訪問控制的對象屬性。.net

2.利用類型混淆問題來欺騙應用程序。3d

 

可是要注意這兩種方法都取決於最終用戶能夠控制傳遞給unserialize()的對象的狀況。

2、經過控制對象屬性來繞過身份驗證

其中,攻擊者利用反序列化漏洞中最簡單最多見的方法之一是控制對象屬性來繞過身份驗證,示例代碼以下:

咱們假設應用程序在註冊過程當中調用了一個名爲User的類來傳遞用戶數據,用戶來填寫一個表格,數據將經過序列化後的User對象傳遞給後端。

 

最終用戶控制User對象,而後能夠像下面這樣簡單地操做對象,並註冊爲admin。

3、使用類型變戲法(type juggling)繞過身份驗證

這裏繼續介紹攻擊者利用反序列化漏洞實現身份驗證繞過的另外一種方法:利用PHP的類型處理功能。

 

因爲攻擊者能夠徹底控制傳遞到應用程序中的對象,所以他還能夠控制對象屬性的變量類型。而後控制屬性的變量類型來控制PHP輸入變量,從而繞過訪問控制。

 

例如這是應用程序用於登陸admin的代碼:

那麼對於上面的代碼,攻擊者能夠提交以下的POST,以admin身份登陸:

此時,當 (0 == 「Admin_Password」) 在PHP中計算爲True時,開始執行。而當PHP用於比較不一樣類型的變量時,它將嘗試將它們轉換爲通用變量類型。在這種狀況下, 「Admin_Password」 將轉換爲整數0,此時 (0 == 「Admin_Password」)與 (0 == 0) 等價。

4、SQL注入

若是條件容許,unserialize() 漏洞也可能致使SQL注入。下面是一個如何利用它的示例。

> 相關詳細文獻參考文末連接

 

這裏具體談下使用POP鏈實現SQL注入,假設某個應用程序在代碼中的某處執行了此操做:

 

它定義了Example3類,而且從POST參數數據中反序列化了未經處理的用戶輸入

__toString() 是一個 magic 函數,對於它的用法,當將一個類視爲字符串時會被調用。在這種狀況下,將Example3實例視爲字符串時,它會返回obj屬性getValue() 的結果。

 

不只如此,繼續假設咱們在應用程序中某處還定義了類SQL_Row_Value。它具備一個名爲getValue() 的方法,並執行一個SQL查詢。具體講,SQL查詢從SQL_Row_Value實例的 _table屬性獲取輸入。

進行到這裏已經到尾聲了,攻擊者能夠經過控制實現SQL注入 obj到Example3:

下面提供的示例代碼將會建立一個Example3與obj集到SQL_Row_Value,同時用_table設置爲字符串「SQL Injection」

這樣,只要將攻擊者的Example3實例視爲字符串,就會執行$ obj的get_Value()。攻擊者如今能夠限制SQL的注入,由於他能夠控制傳遞到SQL查詢 「SELECT * FROM {$this->_table} WHERE id = 「 . (int)$id;

References:

圖源自互聯網

https://owasp.org/www-community/vulnerabilities/PHP_Object_Injection

https://owasp.org/www-community/attacks/SQL_Injection

https://medium.com/@vickieli/diving-into-unserialize-pop-chains-35bc1141b69a

通知!

公衆號招募文章投稿小夥伴啦!只要你有技術有想法要分享給更多的朋友,就能夠參與到咱們的投稿計劃當中哦~感興趣的朋友公衆號首頁菜單欄點擊【商務合做-我要投稿】便可。期待你們的參與~

記得掃碼

關注咱們

本文分享自微信公衆號 - 字節脈搏實驗室(zijiemaiboshiyanshi)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。