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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。
! E! u; g" b4 {ThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件, ?2 ?6 Y. s- n, G% e  N
根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)
2 E6 J6 M6 K# B3 D: q5 G使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:; R* k0 _  K, I( |0 j
$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();
6 d8 {3 [8 h8 J- [- y! E, Q0 ^. G% Z  a; g! D5 ]! O
或者
: b$ C! C5 R$ `6 Z6 p* C% A( F1 d, E$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();
9 S6 N8 a( G$ d$ X4 C' u+ D: A0 y" f: L
但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):/ ]: g6 c, g+ X" U3 r3 ~  R
$model->query('select * from user where id=%d and status=%s',$id,$status);* t- S5 }  c7 H- e! T8 S

4 s% z7 T# w" T0 S或者
& l3 x8 ~! D' ]) A$model->query('select * from user where id=%d and status=%s',array($id,$status));; f' P; e* B' T. j
5 U( C% F& V5 b; A; |/ }3 O& W
原因:& F) d, ~2 N, W
ThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.
! D: a* R6 l3 x0 I8 K! Z0 d原函数:2 H& L5 Y. O6 f' Q9 x  Q$ E6 H& V
protected function parseSql($sql,$parse) {: h& M# |& G& _. r
        // 分析表达式2 V+ c4 D, ]2 \) n2 }4 i
        if(true === $parse) {6 L3 F+ W# {* |8 f, p& S
            $options =  $this->_parseOptions();" Z) ?' O7 T) I7 y" X( S% q
            $sql  =   $this->db->parseSql($sql,$options);
/ k, a+ J- ?: U  |$ W0 r        }elseif(is_array($parse)){ // SQL预处理. F- U$ T! x, t; M
            $sql  = vsprintf($sql,$parse);" N1 P; [9 t" w! S1 G1 W' m
        }else{8 i2 t( k/ d4 C. {0 ^6 C, o4 u
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));6 ^. o. U* Z7 b0 D' k& T
        }
7 B* }0 h4 L- z0 m+ V! w9 c# N        $this->db->setModel($this->name);2 ]6 ]( n  z* f, C7 n7 h
        return $sql;2 t% X' X( c! N: K! a
    }& I: I9 |9 T5 }0 w

% c# `6 ?* P% X1 `验证漏洞(举例):
  h6 ]) {5 g# g" v! p请求地址:
2 Z  C" Q' l! N' P, Ihttp://localhost/Main?id=boo” or 1=”1
6 m/ |% P' i+ I. K( b- ?9 C
$ h: }5 n- q4 N( L2 s! m) `http://localhost/Main?id=boo%22%20or%201=%2218 R/ _' g* Z  \- V# i3 [3 m5 m0 a8 I
action代码:  Y! k1 W3 t( Z* k( A% i
$model=M('Peipeidui');
: n. x* [3 V. K+ M' P# c2 b        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);
0 ~& W1 y8 L, a7 \2 r9 h        dump($m);exit;9 T. B$ a: o6 D3 U1 d
或者
- p3 n' F: `+ F  g# g, z$model=M('Peipeidui');
% ?' K) c: {4 R# _6 M        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));
  h. A' ]# Z. d" a; t" s        dump($m);exit;
+ f0 H+ g( C* k/ ^5 L结果:
# T- W: z3 \5 P6 O8 _# O1 G& a表peipeidui所有数据被列出,SQL注入语句起效.& z1 ]; t3 q3 k8 J% H
解决办法:
- b1 ^3 \! m+ x' e6 [$ `' @4 k将parseSql函数修改为:
5 N, S2 d  q9 f( Z4 H" M% x6 D4 Vprotected function parseSql($sql,$parse) {+ g: R7 Y6 U' x* s
        // 分析表达式
: }0 k& @7 z9 Y) W$ F7 ?        if(true === $parse) {" ?$ @% [- P0 i) c" U
            $options =  $this->_parseOptions();% V3 l  n2 a$ p) z: v
            $sql  =   $this->db->parseSql($sql,$options);
* }9 y7 G! A0 h3 }        }elseif(is_array($parse)){ // SQL预处理  u4 S# J7 v6 E3 V& h- G& g
            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码
0 q+ `( F$ \2 n$ t% g( B            $sql  = vsprintf($sql,$parse);" {3 s  W& w! l" g0 l) i
        }else{7 W9 U' I) r& P! z8 l5 ~
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));4 U. N- i$ B8 I+ z6 s2 V
        }3 g, r2 s' x8 o0 m* I( `2 m4 E" ^
        $this->db->setModel($this->name);
; T5 L  U2 @( H1 N- t1 ^1 H& c        return $sql;
1 ]: w9 x% ?6 K4 R8 ~; ^    }
. M7 }# `8 x& k/ N& d. t( |
0 y& e$ W6 a7 o9 G- r8 J, e总结:
6 A6 [" o) \0 i9 ]不要过分依赖TP的底层SQL过滤,程序员要做好安全检查
9 p- L1 x6 y' K* s5 g' I不建议直接用$_GET,$_POST% p3 B3 O! `* H0 p
[/td][/tr]
! f+ q/ D3 m) k- \[/table]+1
. M/ K: [8 I* R% s0 t6 J- o( b1 C2 W0 a3 O6 M& ]. `4 P, v" q  i1 f/ W4 [

8 u/ c' O  c' s2 S0 b
回复

使用道具 举报

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

本版积分规则

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