Discuz DCACHE陣列變數覆蓋漏洞

2021-09-05 06:21:31 字數 2436 閱讀 6859

discuz! $_dcache陣列變數覆蓋漏洞

author: ryat_at_[url]www.wolvez.org[/url]

team:[url]

由於discuz! 的wap\index.php呼叫chinese類裡convert方法在處理post資料時不當忽視對陣列的處理,可使陣列被覆蓋為null.當覆蓋$_dcache時導致導致xss sql注射 **執行等眾多嚴重的安全問題.

一 分析

/wap/index.php

//43行

$chs = '';

if($_post && $charset != 'utf-8')

unset($chs); }

...if(in_array($action, array('home', 'login', 'register', 'search', 'stats', 'my', 'myphone', 'goto', 'forum', 'thread', 'post'))) }

可以看到這個地方寫入的是$globals[_dcache],我們可以在註冊時用上面提到的方法把$_dcache覆蓋為乙個空字串,然後經過上面**的重新賦值及更新快取,最後寫入forumdata/cache/cache_settings.php的將僅僅只有$_dcache['settings']['totalmembers']和$_dcache['settings']['lastmember']:)

include/common.inc.php

//95行:

$cachelost = (@include discuz_root.'./forumdata/cache/cache_settings.php') ? '' : 'settings';

@extract($_dcache['settings']);

...$styleid = intval(!empty($_get['styleid']) ? $_get['styleid'] :

(!empty($_post['styleid']) ? $_post['styleid'] :

(!empty($_dsession['styleid']) ? $_dsession['styleid'] :

$_dcache['settings']['styleid'])));

$styleid = intval(isset($stylejump[$styleid]) ? $styleid : $_dcache['settings']['styleid']);

if(@!include discuz_root.'./forumdata/cache/style_'.intval(!empty($forum['styleid']) ? $forum['styleid'] : $styleid).'.php')

這裡用extract處理了$_dcache['settings'],但由於此時包含的forumdata/cache/cache_settings.php檔案中僅僅存在$_dcache['settings']['totalmembers']和$_dcache['settings']['lastmember'],將導致大量的變數沒有初始化,而此部分變數在整個程式中起到了重要作用,但現在我們可以隨意提交這些變數,這將導致xss,sql注射,命令執行等眾多嚴重的安全問題:)

另外要注意$styleid可能會導致重新更新快取檔案,可以提交stylejump[1]=1&styleid=1&inajax=1,這樣就不會再次更新快取,forumdata/cache/cache_settings.php裡依然是我們wap註冊時寫入的資料:)

ps:wap使用者註冊預設並不開啟

二 利用

陣列變樹練習

對於乙個沒有重複元素的整數陣列,請用其中元素構造一棵maxtree,maxtree定義為一棵二叉樹,其中的節點與陣列元素一一對應,同時對於maxtree的每棵子樹,它的根的元素值為子樹的最大值。現有一建樹方法,對於陣列中的每個元素,其在樹中的父親為陣列中它左邊比它大的第乙個數和右邊比它大的第乙個數中...

多維陣列變一維陣列

判斷是否是陣列 let isarr arr arr instanceof array 判斷是否一維陣列 let istdim arr arr.reduce o1,o2 o1 isarr o2 true 多維陣列變一維陣列function name return a console.log name ...

陣列中的協變原則

根據lsp原則,我們可以知道子型別方法引數是逆變的,而子型別的返回值是協變的。下面我想測試的是在陣列中所存在的協變原則 如下 public class test 執行結果如下 可以知道在陣列中可以存放子型別元素,由於integer和double均為number的子型別,故可以正確放入並且取出,滿足協...