關於[技術挑戰-2]轉載自黑哥
關於[技術挑戰-2] 一 背景 此挑戰的題目是在學習Stefan 在這之前我也在hi群也進行過類似的exp-me的小問題,如在<關於[PCH-002]> 二 設計與挑戰 對於那些沒有看過Stefan Esser文章的朋友,這個exp-me.php裡`設計`了幾個看似非似的`漏洞`: 對與看過了Stefan Esser文章的朋友,其實也有一定的難度,因為在他的公告和文章裡都是沒有直接給出exp的分析也不是很詳細,對於這些朋友這個挑戰其實就提供了很好的demo,然後結合他的文章,也可以加強對這類漏洞型別的理解…. 三 具體分析 首先我們要理解unserialize()/serialize()存在的意義,很多像我一樣的`指令碼小子`都是自學的半路出家的人,沒有參加過什 php手冊裡: serialize — 產生一個可儲存的值的表示 serialize() 返回字串,此字串包含了表示 value 的位元組流,可以儲存於任何地方。 這有利於儲存或傳遞 PHP 的值,同時不丟失其型別和結構。 想要將已序列化的字串變回 PHP 的值,可使用 unserialize()。serialize() 可處理除了 resource 當序列化物件時,PHP 將試圖在序列動作之前呼叫該物件的成員函式 __sleep()。這樣就允許物件在被序列化之前做任何清除操作。類似的,當使用 unserialize() 恢復物件時, 將呼叫 __wakeup() 成員函式。 注: 在 PHP 3 中,物件屬性將被序列化,但是方法則會丟失。PHP 4 打破了此限制,可以同時儲存屬性和方法。請參見類與物件中的序列化物件部分獲取更多資訊。
unserialize unserialize — 從已儲存的表示中建立 PHP 的值 unserialize() 對單一的已序列化的變數進行操作,將其轉換回 PHP 的值。返回的是轉換之後的值,可為 integer、float、string、array 或 object。如果傳遞的字串不可解序列化,則返回 FALSE。 [—————引用結束—————-] 也就是說serialize()可處理除了 resource 之外的任何型別為一個字串,在通過unserialize()轉換回來,我們再看看對object型別處理時說明: [—————引用開始—————-] 也就是說當unserialize()恢復物件時,將自動執行__wakeup() 成員函式.這個就是unserialize()執行類的關鍵.下面我們看看ryat幫我寫的一個簡單的demo: <?php class ryat { $ryat = new ryat(); $ryat = serialize($ryat); $ryat = unserialize($ryat); //$ryat = unserialize(`O:4:”ryat”:1:{s:3:”wzt”;s:2:”hi”;}`); ?> 但是在Stefan Esser的公告裡提到的是__destruct(),我們繼續看手冊: [—————引用開始—————-] 建構函式和解構函式
PHP 5 允行開發者在一個類中定義一個方法作為建構函式。具有建構函式的類會在每次建立物件時先呼叫此方法,所以非常適合在使用物件之前做一些初始化工作。 為了實現向後相容性,如果 PHP 5 在類中找不到 __construct() 函式,它就會嘗試尋找舊式的建構函式,也就是和類同名的函式。因此唯一會產生相容性問題的情況是:類中已有一個名為 __construct() 的方法,但它卻又不是建構函式。 解構函式
PHP 5 引入了解構函式的概念,這類似於其它物件導向的語言,如 C++。解構函式會在到某個物件的所有引用都被刪除或者當物件被顯式銷燬時執行。 [—————引用結束—————-] 這個是php5才引進的一個函式,在某個物件的所有引用銷燬或者刪除是自動執行. 我們回到挑戰裡的程式碼exp-me.php: include `mysql.php`; $session = unserialize(stripslashes($_COOKIE[`_data`])); //測試方便可以修改為$_GET isset($session)?$sessiondata:$session;
unserialize()裡的引數可以任意提交,呼叫在mysql.php裡是class function __destruct() { 很常見的處理,呼叫close(): function close() { 繼續跟halt(): function halt($msg =“, $sql=“){ 最後到file_put_contents($this->logfile, $sqlcontent);來寫檔案,那麼我們怎麼構造$_COOKIE[`_data`]這個提交給unserialize()的序列的字串呢?我們可以學習上面那個demo的方法: <?php 得到O:8:”DB_MySQL”:3: 這裡我們重新看看__destruct()/__wakeup()這類函式,是不是還有其他的類似的函式可以自動執行呢? 同樣在php手冊裡找答案: [—————引用開始—————-] 有興趣的朋友可以繼續分析下其他Magic Methods有沒有辦法利用? ? 上面的過程就是這個型別漏洞的產生的流程了…. 下面要解決的就是突破<?PHP exit(`Access Denied`); ?>問題,在Stefan Esser的漏洞公告裡提到了這個問題,那就是通過轉換過濾器來重寫這個php檔案: <?php 三 小結 通過上面的分析我們可以總結2個型別的問題: 這2條在本次挑戰的問題裡有著很好的體會.有心的朋友可以搜尋一下,你可以找到很多關於unserialize()執行類的問題如:http://be-evil.org/post-62.html 四 題外話 我開始以為只要有*60的地方就有口水,現在我發現錯了,只要有網路的地方就有口水.在本次挑戰出來之前,某人就和我說這樣會不會引起別人的bs 看官你知道不? 順便說下`老外牛x`的這個問題,我也承認`老外牛x`,我想全世界的人也應該承認,因為你在老外的眼裡也是老外.我是Stefan 五 參考 http://www.sektioneins.de/en/advisories/advisory-032009-piwik-cookie-unserialize-vulnerability/ updata:忙著編輯文章去了,忘記了一個重要的環節,那就是感謝大家的支援,尤其感謝ryat的討論和指教. thx! |
相關文章
- 視訊通訊系統的關鍵技術與挑戰
- INTERFACE空降上海, Momenta解讀自動駕駛技術與挑戰自動駕駛
- 關於IT,關於技術
- 專案實戰(連載):基於Angular2+Mongodb+Node技術實AngularMongoDB
- 關於自然語言對話的技術挑戰和應用前景,來自這六大廠的一線技術負責人聊了聊
- 直播CDN排程技術關鍵挑戰與架構設計架構
- 機器學習的技術原理、應用與挑戰機器學習
- 哈工大張偉男:人機對話關鍵技術及挑戰
- 病毒的編制關鍵技術(2) (轉)
- 關於技術方案
- 關於技術文件
- 聊聊全站HTTPS帶來的技術挑戰HTTP
- 大資料融合技術:問題與挑戰大資料
- 日本RPA技術普及所面臨的挑戰
- 書生安全雲發起安全技術挑戰賽
- 百度,關於技術理想與對未來的期待丨首屆搜尋技術創新挑戰賽 x 冠軍團隊專訪
- 人工智慧晶片之爭報告:技術戰中的中國挑戰人工智慧晶片
- 「人機自然互動技術」的趨勢與挑戰
- 出口電商+跨境物流技術挑戰:MongoDB應用例項MongoDB
- 工程師在創業團隊的技術挑戰工程師創業團隊
- 關於技術的選型
- 關於技術分享的思考
- 技術預測法(轉載)
- 人工智慧核心6技術,機遇與挑戰並存人工智慧
- 圓滿落幕!回顧 eBPF 技術的發展與挑戰eBPF
- GaussDB(for MySQL)雲原生資料庫技術演進和挑戰MySql資料庫
- 轉載關於JOIN總結
- 2019TechWorld技術嘉年華·資訊保安挑戰賽初燃戰火
- “人工智慧技術驅動下的機遇與挑戰”技術分享會圓滿成功!人工智慧
- 關於Oracle的技術問答Oracle
- (轉載)Autodesk面試技術題解答面試
- rman技術速查手冊(轉載)
- Red Flag 技術文件下載(轉)
- 基礎統計技術(轉載)
- 團隊溝通技術(轉載)
- Flutter核心技術與實戰 04 | Flutter區別於其他方案的關鍵技術是什麼?Flutter
- 關於UI自動化技術及測試的一些看法UI
- UniX技術 AIX實戰經驗(轉)AI