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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。
* n" Y1 B' P/ `3 pThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件5 g8 y  t; X0 _' s& c8 M6 k
根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)4 r' C! n# |5 z9 h
使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:' D* T$ G% v+ g4 K
$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();
# U- m. @7 X% X7 i7 ]* T% I
. q+ K% K2 l7 P2 e 或者8 D5 A% ~: g6 i
$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();
* F4 j. i0 @, Z% f) D( D) K- E5 @9 [: z8 t0 k5 x' B( m
但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):) K" j7 m" j; Q/ _3 s+ J1 G. q$ |
$model->query('select * from user where id=%d and status=%s',$id,$status);
1 v6 F  l6 B4 [2 v: |) p0 w' p# |
或者
1 Z' n& G" p9 E, A! |$model->query('select * from user where id=%d and status=%s',array($id,$status));
( L/ T; r# `) M6 S( s
8 ]1 r  S  B9 I/ ~$ b: n. @ 原因:
7 r/ Z- y$ b; f# {9 gThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.2 @- A2 ?. f$ B4 E1 v
原函数:
. b# V- z5 t4 p3 }0 \; Kprotected function parseSql($sql,$parse) {
. c2 H3 f+ v$ h  M: N+ u, U% x        // 分析表达式4 Y" |) m; j1 M$ a# H" P/ S
        if(true === $parse) {
' A2 b0 V. H. Q5 X            $options =  $this->_parseOptions();
3 _8 T0 c3 C3 b5 l$ W3 ?$ W2 D! b            $sql  =   $this->db->parseSql($sql,$options);1 g* U- j8 @- ^% I9 O) n% h0 K
        }elseif(is_array($parse)){ // SQL预处理
: \: b6 A7 H; E2 `$ u8 m            $sql  = vsprintf($sql,$parse);
& V( D/ x( w3 j8 h) V9 h$ Z5 ?        }else{6 W- `6 o+ A. G' e/ X; P0 `
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
7 O8 w2 o, h1 O2 m1 b        }
7 ]* i- n7 Y) w( Z  U0 r% V        $this->db->setModel($this->name);
, J% X) r+ P4 ~- N4 `        return $sql;
% e) A2 c; Q# P! k    }  [+ w1 g  d4 k) g! v$ |

: N" V0 {7 A& k6 |  \! f' X验证漏洞(举例):' p5 ]& e+ F8 l4 G6 C0 }( k7 \8 c
请求地址:
; u) _8 h- ]  l! r3 w* H5 L: xhttp://localhost/Main?id=boo” or 1=”1' p% C: J9 K* [( X. D
. ^; Q2 G- H3 u# q5 c
http://localhost/Main?id=boo%22%20or%201=%221
; D+ b: B4 S, r7 s7 c7 F" i$ l1 naction代码:
' Z' b4 h6 K; d+ ]. v0 w$model=M('Peipeidui');
$ J, f5 T7 v5 C. y. D* o/ [6 |, I        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);* ?9 g( T. `' _2 S8 c( m
        dump($m);exit;' O1 m. E$ q# f, w/ t& f! j0 ^4 \! P
或者- A2 M3 _4 T9 d, d
$model=M('Peipeidui');& x! t3 Q2 D; z& J( W& ?
        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));
# T3 `& J$ X6 F* B        dump($m);exit;
- S$ B7 T' g* E" Y3 t结果:
) r2 Y  i- ?3 m表peipeidui所有数据被列出,SQL注入语句起效.: E6 |4 y3 @, Q, w3 [5 f$ ], Z
解决办法:. Q) E0 c" Z% ^" ]
将parseSql函数修改为:
7 a8 z6 F$ h) t7 p/ aprotected function parseSql($sql,$parse) {0 e; A1 o* z8 }! b+ J- l  ?
        // 分析表达式: j4 D' N- e, {  @/ e& _
        if(true === $parse) {1 [9 C; o% |; B* [1 O
            $options =  $this->_parseOptions();
) J+ L) r+ D* V1 R: f0 W8 m            $sql  =   $this->db->parseSql($sql,$options);" b7 E, f& c1 x7 h" _, `. F4 a
        }elseif(is_array($parse)){ // SQL预处理
# h# B5 u! m. r. l- s" Y$ q            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码  a- h& D5 y$ @! {4 C
            $sql  = vsprintf($sql,$parse);
# z- ?; f$ x5 k( V        }else{$ F. E, N+ o7 K( M  i
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));: Y$ }+ N$ r  J) h' P( o
        }3 B) n% x4 ?/ R. ?& s. ~  A* C
        $this->db->setModel($this->name);3 `9 r4 `3 R  E$ r2 E
        return $sql;
" [# N9 F& G: S& w( T; _    }
5 W) b- l# Y5 Y9 v+ M% v3 x1 N2 H8 L8 ]9 I3 }; F
总结:  ^% ~# d! Y' a$ ~
不要过分依赖TP的底层SQL过滤,程序员要做好安全检查
2 a5 c; z  E# u8 Y不建议直接用$_GET,$_POST
; f' p' I: t8 M[/td][/tr]  D# p# \  s2 A, Z( J
[/table]+1
4 _* |# v# Y" u0 j
' @- r( v9 I1 f. {, k$ ~6 R; S$ O" m! R8 C
回复

使用道具 举报

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

本版积分规则

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