云服务器促销,免费安装宝塔面板!
开启左侧

[DZ教程] Discuz!X ≤3.4 任意文件删除漏洞分析

[复制链接]
风雨兼程 发表于 2017-10-4 14:39:09 | 显示全部楼层 |阅读模式

本站会员必须 邮箱验证成功后 才能发帖。马上注册查阅更多教程,下载海量资源,让你轻松玩做站

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
0x01 简述& b# C3 Q& R' j; x
7 U/ x* U# z" g" P. Y* C
Discuz!X社区软件,是一个采用 PHP 和 MySQL 等其他多种数据库构建的性能优异、功能全面、安全稳定的社区论坛平台。' u/ t7 e9 I0 h9 i0 H

9 e' _" }" }$ F5 M2 x- w/ F% ^9 G2017年9月29日,Discuz!修复了一个安全问题用于加强安全性,这个漏洞会导致前台用户可以导致任意删除文件漏洞。# ~4 g' }% n* c" D

- n- f0 T/ b6 Y" V& Q' \2017年9月29日,知道创宇404 实验室开始应急,经过知道创宇404实验室分析确认,该漏洞于2014年6月被提交到 Wooyun漏洞平台,Seebug漏洞平台收录了该漏洞,漏洞编号 ssvid-93588。该漏洞通过配置属性值,导致任意文件删除。
5 z9 O! {% w4 u- u0 m  y* t: C+ U3 [; ~
经过分析确认,原有的利用方式已经被修复,添加了对属性的 formtype 判断,但修复方式不完全导致可以绕过,通过模拟文件上传可以进入其他 unlink 条件,实现任意文件删除漏洞。
. {7 E9 `4 @1 S
2 t" U9 _" ?2 F) r( \0x02 复现( @& @1 `% U$ V( ?# _3 f
7 v9 I% B6 Z* G$ L- ~
登陆DZ前台账户并在当前目录下新建 test.txt 用于测试
6 g0 w: ^3 x# l$ q
1 o5 P# C5 \6 N2 d7 a7 y9 \0 S. g, e3 D! L

Discuz!X3.4漏洞

Discuz!X3.4漏洞
  ?+ s0 b/ V7 J; g. [
+ N3 }9 T1 }" x2 _. ~" e

Discuz!X3.4漏洞

Discuz!X3.4漏洞
, J+ C( [2 t, J5 T% [, l, e: }5 U
- g6 x' M! d# ?+ q: {2 ~
请求
+ r4 Y1 ]$ u: d/ c  j6 B6 u( X9 y( C$ F8 P
  1. home.php?mod=spacecp&ac=profile&op=base
    / s* C6 l1 v! k. L7 U: e
  2. POST birthprovince=../../../test.txt&profilesubmit=1&formhash=b644603b
复制代码
! W( p& @, X2 p: z- ]- `
其中formhash为用户hash6 x. C) Y2 c; T$ _* t1 h0 C
修改成功之后出生地就会变为../../../test.txt
8 i8 q3 X/ K( t+ t; s1 ?) z* d7 q7 j+ w

Discuz!X3.4漏洞

Discuz!X3.4漏洞
" F2 b3 y: `. B3 b( g

6 t2 B% `7 ?1 p3 l/ I构造请求向home.php?mod=spacecp&ac=profile&op=base上传文件(普通图片即可)
( n; Q& \  @6 K  P6 T
7 c, _. c' E+ h

Discuz!X3.4漏洞

Discuz!X3.4漏洞

; w) T& N9 f2 g( ?% J" H; j8 S0 n- e4 B3 G+ r/ b/ J- L
请求后文件被删除 * W; f: }. i5 c2 c) r: B+ c

- y4 L5 m( h# w/ x  T0x03 漏洞分析
; T& ?! K" E9 v/ Q; o
6 R8 h, C% Z* H% m+ \- o3 j$ yDiscuz!X 的码云已经更新修复了该漏洞
7 ~8 `/ ?: k) ^" q+ I8 i( g" c4 m3 V: T( x& l. J8 M
https://gitee.com/ComsenzDiscuz/DiscuzX/commit/7d603a197c2717ef1d7e9ba654cf72aa42d3e5747 V8 _9 `( X* Q0 s! R. D1 r5 Y, ?8 @0 B

- L7 F" \. h" a3 w7 T) A! [1 G5 m/ a% Y* M  k" r7 B. u, w9 e8 n

3 v; I+ s4 D" u" w) W6 a核心问题在upload/source/include/spacecp/spacecp_profile.php  b7 s4 l! M$ x; ^6 u5 J0 x6 z
5 h5 Z- v$ b0 J& l7 E0 q2 x

Discuz!X3.4漏洞

Discuz!X3.4漏洞
; m+ L- J9 p, M9 I9 w

) s+ c7 Q5 g" e跟入代码70行
/ g$ O1 R+ k  |

  1. & b. S9 r6 H1 j8 M
  2. if(submitcheck('profilesubmit')) {
复制代码

  h, K' n" M$ |
: z0 M6 D8 F. x! `当提交 profilesubmit 时进入判断,跟入177行
# U( e* d( e  F2 q' h* A
2 s, g; ]* y& u% q

Discuz!X3.4漏洞

Discuz!X3.4漏洞
; h- l- Q. [4 f
8 L; j9 r* `1 X
我们发现如果满足配置文件中某个 formtype 的类型为 file,我们就可以进入判断逻辑,这里我们尝试把配置输出出来看看* a3 X. |$ Z: k' s: h, h
0 \( t$ J; ?% d5 N8 u/ c3 r
( r, ^3 o; U, E  Y9 ~# F4 _0 ~6 ~
2 z. D  y/ Z" w+ G, v  E
我们发现formtype字段和条件不符,这里代码的逻辑已经走不进去了
, M! ~2 |2 E9 |* b% V: {/ {4 }1 ~7 W9 E4 J) C' g
我们接着看这次修复的改动,可以发现228行再次引入语句 unlink
+ g8 q. m2 x! a" w! k1 ?  c5 @0 m: y
  1. @unlink(getglobal('setting/attachdir').'./profile/'.$space[$key]);
复制代码
7 C3 q$ `1 H+ ^- D
回溯进入条件 " Y  E" G) x9 r8 @, k
$ S9 H' p: Z. \2 v! C
, J; y1 [" q, A# r: d0 E8 h

Discuz!X3.4漏洞

Discuz!X3.4漏洞

9 ~8 x0 z; V* `7 Q$ B* O: d" L当上传文件并上传成功,即可进入 unlink 语句
6 N  w6 S1 y: ?8 v  ?+ W* h
0 W% g: s+ E& U

Discuz!X3.4漏洞

Discuz!X3.4漏洞

8 g0 y6 X; ]' l2 p
" |! E" d6 h+ e5 i; s$ _: K* L然后回溯变量$space[$key],不难发现这就是用户的个人设置。
+ d9 z3 {, ~" |: N$ v$ s7 f* k0 v! l$ |, h- C
只要找到一个可以控制的变量即可,这里选择了 birthprovince。: {  \, B. A$ _  D; |

/ ~* M% T' R& y+ O' P4 I在设置页面直接提交就可以绕过字段内容的限制了。  z3 f5 g0 @, I2 y2 V$ M, n4 i7 |

, E; @1 o, Q! ~  f2 v; u. r, p! K* b

Discuz!X3.4漏洞

Discuz!X3.4漏洞
* X/ b8 W8 J% @- }
$ C) ^  [" e+ ~% h
成功实现了任意文件删除. H6 V. U3 Q. U) F" f
5 {; p' }3 l$ q3 i7 c% C
0x04 说在最后
, ~1 B7 n6 k9 ^+ S# O9 v+ h6 k3 [5 G! Y4 G; R0 g
在更新了代码改动之后,通过跟踪漏洞点逻辑,我们逐渐发现,该漏洞点在 2014 年被白帽子提交到 Wooyun平台上,漏洞编号wooyun-2014-065513。
. Y$ Y! n) k/ B* _; ?/ t9 {4 |6 a; h# x5 _2 J8 z
由于DZ的旧版代码更新流程不完整,已经没办法找到对应的补丁了,回溯到 2013 年的 DZ3 版本中,我们发现了旧的漏洞代码" m4 _2 v8 ^/ p

- f% n* j9 L7 ?3 ~

Discuz!X3.4漏洞

Discuz!X3.4漏洞

. h2 m" i! O7 D1 C$ @" y* t; a6 A+ ]3 Z7 l; u
在白帽子提出漏洞,可以通过设置个人设置来控制本来不可控制的变量,并提出了其中一种利用方式。6 P7 v3 o0 w  g
- t/ j( z  z3 X; M1 V) }- c
厂商仅对于白帽子的攻击 poc 进行了相应的修复,导致几年后漏洞再次爆出,dz 才彻底删除了这部分代码...
! ?2 ^* M: V8 z% T* \5 e
8 [1 L" o+ Q& x; l8 t期间厂商对于安全问题的解决态度值得反思...
. }- `. J! q( u. |# V
' a8 C# w% q: V2 C3 P# q5 [0x05 Reference
/ ~. ]" E4 D8 O' @
% ^7 w( E$ N) z5 \[1] Discuz!官网
+ T& z3 l) ~- E3 O6 h; T( s$ J& Ohttp://www.discuz.net: F. j# M. ?3 X% S" n, M/ W
[2] Discuz!更新补丁
; w% _0 ~, ~# ~$ C( bhttps://gitee.com/ComsenzDiscuz/DiscuzX/commit/7d603a197c2717ef1d7e9ba654cf72aa42d3e574
% i5 X- k1 a; `) Z3 m. C# }+ n[3] Seebug漏洞平台收录地址
* B4 ]7 h6 ^# l( Q% ^https://www.seebug.org/vuldb/ssvid-93588
当流科技-专业Discuz建站、仿站业务,专注处理discuz!论坛挂马,专注提供论坛托管维护服务! 提供Discuz论坛空间、VPS、云服务器!咨询QQ 569160956 778521512
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

精彩课程推荐

Discuz!论坛网盘附件免跳转下载(手机版网

主讲:当流科技 Discuz插件

宝塔面板绑定域名无法访问后台怎么解决?

主讲:风雨兼程 服务器学院

抱歉,当前存在网络问题或服务器繁忙,详细错

主讲:我心枫叶 Discuz!教程

discuz论坛搬家教程,如何搬迁到新服务器?

主讲:风雨兼程 Discuz!教程

宝塔面板phpmyadmin 数据库502 Bad Gateway

主讲:当流科技 服务器学院

Discuz!X3.3全新安装和升级后快速回复框丢

主讲:风雨兼程 Discuz!教程

宝塔面板mysql怎么用navicat 连接数据库呢

主讲:当流科技 服务器学院

宝塔面板如何添加和管理Mysql数据库?

主讲:xotexa372 服务器学院

商务合作

0551-66191059
service#dangliu.net
点击这里给我发消息
dz论坛/Discuz!论坛新手

关注微信公众号

QQ扫码 加 DZ技术群