1 V% a. x( A! _& G* h5 H % l, k; V/ {+ J+ ~5 K! z& ]7 z3天前有朋友在论坛问过,说Discuz有个非论坛创始人获得WEBSHELL的漏洞,是superhei早前发出来的一大堆DISCUZ漏洞之一.见原帖:http://bbs.tian6.com/redirect.ph ... 54794&ptid=8706 ! b* Y$ c. L- Z E; n当时我说一会就弄出来给大家,但是实际上一接触,发现这个漏洞本身需要管理员后台权限,要广泛普遍的利用还是很复杂的,主要是以下几个问题,所以拖到今天才基本完工. & M5 ^% E9 d/ o) m$ V' |5 O% F
分析和写EXP的过程中,得到t0by57,Superhei的大力帮助.他们PHP和JS都不错的哦!希望大家看这篇文章时,更注意分析和明白的过程,毕竟XSS是目前WEB安全的最大头戏.各种形式:XSIO,Cross Iframe Trick,crsf等等..* q6 X2 s$ u4 \. _& s3 O1 @
本帖补充其中一个FLASH XSS应用方法:配合Discuz得shell-Flash XSS: K. j; }) _' r/ d. _$ w O. u
& A) x4 x' r0 U) a' R 3 M) G( L& c! a5 p. q----------------------------------------------------------前言分隔线-----------------------------------------------------------------------------; r% f9 j' T+ W+ h! q
4 i) Z8 Z1 |2 W/ j6 z) I* C; j( i
0 h' i i+ E9 ~9 m0 H5 D! N
problem1:漏洞页面runwizard.inc.php数据提交方式为post.需要模拟POST提交.8 F' K" `: N M, L0 G. }2 p; T
6 c' q: k' Y& [9 A% m/ z& eproblem2ISCUZ论坛在数据提交的时候还验证了referer,因此还要伪造一下.php socket和js都可以伪造referer. 5 u4 o" n# Z* ` V . Z; X/ j: a1 W3 W' p5 [/ rproblem3:formhash()函数采用了用户名+密码+XXX的算法得出,程序本身没办法模拟算出来,于是又耗费了我一段时间,最终想到个傻办法,从源代码里读出来.呵呵.这里是参考了superhei的一个旧EXP想出来的. ; f8 H9 L' N. K" V# e& T: [: I `* ]4 |+ I2 `
3 \5 c1 d# ?: @
下面,我为大家简单说说这个漏洞的成因和补的办法.这里是有漏洞的文件代码:bbs/admin/runwizard.inc.php,里面有个函数function saverunwizardhistory() { : f( [% W' T) e7 i- y/ { m3 O4 f# l- q. v, }
global $runwizardfile, $runwizardhistory; % {9 S0 _: j5 e6 r! }' J/ m 4 ]# A/ T: L E. J; `# i0 L4 R m! M $fp = fopen($runwizardfile, 'w');% u r8 d+ q9 t3 {, _
+ U; m/ Z: A% V0 i* E6 c7 }0 W
fwrite($fp, serialize($runwizardhistory));+ M. x: c* h+ }5 q/ V) q; e
& `4 p* t" T9 |3 [0 f0 M- E2 S' r$ h; w fclose($fp);4 W/ i) p1 ]7 w2 V5 F5 x& l l3 w- C
. n' l0 ?. B. U) ~; u) q* l
} ! G `$ A# A$ n8 V2 H0 h复制代码serialize($runwizardhistory)直接就写进$fp里.runwizardhistory是什么呢?是论坛一些基本的配置信息,譬如论坛名.反应在论坛后台,位置是:discuz.com/bbs/admincp.php?action=runwizard&step=2.论坛名称,地址等三项信息都没任何过滤.该三项内容任何一项都可以直接写入一句话,提交,然后保存在缓存:bbs/forumdata/logs/runwizardlog.php里. |2 Q( ]+ J" W+ D/ x, _5 I以下是修补的办法:function saverunwizardhistory() { & F0 T$ W: C( o& i/ k& }+ m: g, w' y& T
global $runwizardfile, $runwizardhistory;2 L: z( V( p) z8 N( N3 r7 K
( r |4 v l/ ] k6 `/ N
$fp = fopen($runwizardfile, 'w');6 Y& N( x" s6 |