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

ThinkPHP框架通杀所有版本的一个SQL注入漏洞

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。
0 v8 s4 a% O  w: l. CThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件
9 }& Q, `3 z4 a5 {4 |根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)
9 W" ^) Z9 W2 z$ R使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:
! I* R, }! _/ ]" Y$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();
4 q$ b9 `5 z7 E5 F- x& F/ T+ u1 N; B1 R3 s5 Y
或者8 S6 ]7 _' ?9 U" @( w8 ^* c
$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();
1 P& F$ U" ^/ w; `% l9 G( e
( o, C* Y4 H( O% J7 [ 但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):( }  D( X5 V+ \& @
$model->query('select * from user where id=%d and status=%s',$id,$status);
! p! z- Y: r( u
2 c' W# N4 x- X6 z9 G9 S或者  x" I% L% U( I: F
$model->query('select * from user where id=%d and status=%s',array($id,$status));$ w$ J% u0 [+ e/ j9 N! i9 V3 n
! N  A7 U$ U8 D- y
原因:3 ]3 s2 _9 N/ p! z7 j- @
ThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.
, {' {5 g$ }) Z原函数:
, O# {& L% y# Z' m# c' ]! bprotected function parseSql($sql,$parse) {* c' J4 N! x$ [
        // 分析表达式
8 Y8 K0 l" m# l, ?7 c/ T/ t( K        if(true === $parse) {
% X' o, m' e& _# U            $options =  $this->_parseOptions();" O0 n5 P: ^$ T) S$ ]
            $sql  =   $this->db->parseSql($sql,$options);) T5 W" c  B0 Y, ^0 d
        }elseif(is_array($parse)){ // SQL预处理
3 v! m7 o4 e5 v+ o& M9 L            $sql  = vsprintf($sql,$parse);
6 ^0 E7 ]' t& m" B( t, p! Q        }else{2 n. J: K* e% X: l" R( U1 H3 u
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
, }( J8 d$ S' y  N' H2 M- o, J        }
* ^+ u$ A. ^- P, I' M* \6 k/ Z        $this->db->setModel($this->name);
. V2 u5 l3 H' G! O3 _9 ^4 V: R        return $sql;
+ S  D" L& Q  F* R, t: ?+ m4 r5 J    }0 R4 ~3 g8 X1 u4 s1 K0 r  N: {

1 E2 {. E3 d) m  q5 p  g/ e! v. D验证漏洞(举例):
( s6 @9 p2 S7 O) _! u+ Q! `* H请求地址:
* w% O3 W" `- F+ s6 chttp://localhost/Main?id=boo” or 1=”1
3 x; u. q9 v% w2 x: [% G或. ^) J8 U* O7 H! m* V
http://localhost/Main?id=boo%22%20or%201=%221- P# j( D5 j  X2 E$ j
action代码:0 q6 Y% l  m1 J$ Y! n9 |8 J7 }
$model=M('Peipeidui');1 R; x. z/ u; R' N- O
        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);
( }% Y0 e* u6 m! A$ y  S9 _        dump($m);exit;& \5 ]6 j" {$ Y$ J; M4 w, t- c
或者# S/ {& E6 q6 R9 x, J! s
$model=M('Peipeidui');
' p" T1 G/ O5 w8 E! ]" N        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));+ I. b* l8 b3 C( z# O3 m' O
        dump($m);exit;' M% [8 N  V3 Q, M2 v7 I# g
结果:
# a7 A3 C2 `- o, [0 |+ P" Q: A表peipeidui所有数据被列出,SQL注入语句起效.5 @5 _! e. ^7 p- g
解决办法:
. d9 q; o! z- }6 Q3 ~$ t$ e4 o将parseSql函数修改为:
8 F2 d; R3 o  D3 Xprotected function parseSql($sql,$parse) {
* v( m* ~, L# c        // 分析表达式+ D& `+ [& w! v- B
        if(true === $parse) {, e$ C/ g# T, L* F% X
            $options =  $this->_parseOptions();
0 g9 M# h0 U2 C, ?6 {            $sql  =   $this->db->parseSql($sql,$options);
9 X7 d, p: v; A' |5 m' D1 k3 k4 n4 R' \        }elseif(is_array($parse)){ // SQL预处理+ t8 u; _6 t1 f' A5 v) c, E
            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码% M( z* \8 Q. y. k
            $sql  = vsprintf($sql,$parse);
& O1 F5 `+ q% @0 W' l        }else{8 N5 }1 X" S$ v. [# ^2 u
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));) L2 T5 K( M7 Q" t) U/ u
        }; u, e) L! d& P/ V" _: h
        $this->db->setModel($this->name);
. R! I7 b3 F9 U5 p5 P7 U        return $sql;
' v, ~# T- f' |. F' D    }
8 Y1 P* r( V9 Q; d' S: h3 S$ h! X; _2 o+ r- U
总结:
' Z2 r9 Q! y" i* _不要过分依赖TP的底层SQL过滤,程序员要做好安全检查$ ^: L- ~; r  v2 z2 k9 `4 E! S' S
不建议直接用$_GET,$_POST* o5 h: C9 d9 j  |1 w3 |
[/td][/tr]
( t2 S$ Q& n2 V& m$ z+ K" O4 P- V! X[/table]+16 U! ^, P: ~; j4 P1 d& t
" i; u$ x( j$ G1 l- I7 G. P7 T3 v7 u

$ W, M4 ?5 Z2 O9 j
回复

使用道具 举报

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

本版积分规则

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