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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。3 s- e+ |/ p" [! z0 a4 S7 ~% C8 Y
ThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件
4 ]' i# Y! {) f6 c根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)
) V6 J" ~0 t* _! ~使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:
' E- E9 i4 X4 G2 |' [! [! k- U$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();
2 Q  \  }* k6 n5 {7 p7 s
! r  N7 T8 o9 \8 ^. B4 H1 l) [ 或者- V* E8 J9 B4 y3 l) P2 x- V
$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();
' i4 L$ |, z5 q& l9 E6 D( L! f9 q1 e0 ~/ J/ b2 w; T
但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):  a% a- y. G! j; x( M% g
$model->query('select * from user where id=%d and status=%s',$id,$status);
/ S- w6 i% U3 Y3 ?6 q4 o
% q- b5 k) A" R$ t  R  B, ]或者
" f& r# Y6 g8 ~$model->query('select * from user where id=%d and status=%s',array($id,$status));4 O- v, L; I7 H5 @; Z

, ~$ X. B1 M; a1 H4 B 原因:
4 V' ^! n  \9 U6 E/ m, t9 \ThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.& [/ r- j( |6 a! ?/ y' g# o. _
原函数:
/ v% J/ p( {' ~, t4 I* g) |protected function parseSql($sql,$parse) {
3 Z. |$ t$ V/ Z* n) B& W* ?) G        // 分析表达式
' J1 O9 c$ ^& s; W$ g        if(true === $parse) {0 Z4 F, r# {$ w1 y" e% a* [
            $options =  $this->_parseOptions();
9 X/ O( E# {! @& h% S% ^  ~; t            $sql  =   $this->db->parseSql($sql,$options);% r! T$ B2 p6 V( S! N
        }elseif(is_array($parse)){ // SQL预处理3 B1 i( z! n. P1 w
            $sql  = vsprintf($sql,$parse);$ o2 @5 _' `1 H- ^' s
        }else{
7 g& s# k: k2 W9 T            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));# M* P4 J+ p' Y3 q' p0 o# T
        }
% i5 N: m! N, _8 i% o# v        $this->db->setModel($this->name);
8 b1 B) y7 Q2 l* ^- o5 z& ]        return $sql;
  o6 E& {, v1 h9 g2 i  i    }
& o3 x! j; P- Z8 F$ R; K
4 C  p2 K3 C! M: K验证漏洞(举例):
2 R) `6 Q/ h9 q4 x9 J' y请求地址:7 P- L+ @- T0 `( D5 H- A
http://localhost/Main?id=boo” or 1=”1
# f+ S, X* }  V
: }4 X* j7 f" T  H" Q7 C# p( c% ^& Nhttp://localhost/Main?id=boo%22%20or%201=%221
: e6 {) l/ A# f+ w3 Haction代码:' U4 V) f. s' z; }
$model=M('Peipeidui');2 N0 D! L5 g, }0 q
        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);6 s% m8 ]) A" X' Y& I$ ^( g
        dump($m);exit;
, r, F& z+ |5 [. _- e( h' J或者
' V0 }) o, o' z5 k7 A8 t$model=M('Peipeidui');
  P( O5 W* O, B+ ^' S3 a4 D        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));, q1 q6 ~- \& `6 Z1 b
        dump($m);exit;
4 k/ \. H' I: v& l' Y1 s结果:7 M/ r* j; A$ m+ _. B4 A2 Q6 Y& F- I- f
表peipeidui所有数据被列出,SQL注入语句起效.
* r/ Q6 i- w5 @6 |7 k; i, V解决办法:2 l) \2 |4 {' t1 z+ S
将parseSql函数修改为:, T8 x7 a  h/ ]+ Q' B$ J$ L
protected function parseSql($sql,$parse) {" E4 m; e3 E0 T) ~) \1 G% D
        // 分析表达式8 k" o( k6 ~8 a# k
        if(true === $parse) {% O( N' Y: G% V- p# V$ w
            $options =  $this->_parseOptions();  n6 {( V; k+ e( R5 T. G2 K% K
            $sql  =   $this->db->parseSql($sql,$options);; O" ~% ?2 Q& U- u# O, Q+ r
        }elseif(is_array($parse)){ // SQL预处理
5 j( E! X' y' j' B3 x8 Z7 ?            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码
: c3 V1 X$ I- S" ~( ?0 d# r. {            $sql  = vsprintf($sql,$parse);
2 k$ m$ m0 x; e+ i; E' N        }else{
7 [" |) G; M9 ?' Q0 y/ i            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));' p, N% l: o3 L1 W  ?
        }2 c. c5 B& p7 K1 {! s
        $this->db->setModel($this->name);
  r- u$ k8 y  m0 F7 Y. f  ]        return $sql;4 N6 D9 v7 T. e" F2 l
    }: a5 _5 V; W, }0 i

8 N8 f( V) V1 u( k总结:" k9 h$ _$ U8 S: s+ j3 y# |
不要过分依赖TP的底层SQL过滤,程序员要做好安全检查8 n! f) _( G# [5 C1 w
不建议直接用$_GET,$_POST
4 L- i+ q5 s. z[/td][/tr]
2 s6 c6 |1 I( ^) B: ^  Z[/table]+13 {" V) W1 g) [/ f! K" i

& P/ ~1 K, H3 b1 A+ \8 Y0 Y: y8 [
回复

使用道具 举报

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

本版积分规则

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