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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。
7 L7 \- }( u+ O! O- @5 fThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件
9 I8 V5 h  c0 B+ E# |8 H根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)
' U. B+ c' k: |7 v3 C4 v: h. x使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:+ Z0 ~2 a/ p! Z) O
$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();
) z& c( |" o7 s
- b/ ?7 l7 s- z0 J6 \$ q& p 或者8 G) i# {3 }9 G
$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();7 `9 B# Q! d2 w1 }$ n* `1 w0 U- Y
$ L# p" x. d5 w) F7 H6 h2 c( Z
但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):; p2 ~8 Y0 m8 D) Y
$model->query('select * from user where id=%d and status=%s',$id,$status);
* o. N- ?0 x2 r% o9 C- j: N' b& H$ k' s. G8 _, r6 T5 s9 S
或者$ R( f, m5 q4 }3 Q0 K
$model->query('select * from user where id=%d and status=%s',array($id,$status));
2 Q3 A( D1 T! j( f# i% _+ ?+ w$ C# W" \' |6 S) k9 }
原因:; ~) D  N$ f. r1 U
ThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.- X& P4 b! P1 h2 ~) R
原函数:
& v3 I5 P* A; d# x  I' @protected function parseSql($sql,$parse) {3 P$ }, ^7 m) t0 a
        // 分析表达式" L4 `6 J/ H, r7 y  b! _4 n& @7 G
        if(true === $parse) {
5 F) M5 ~3 N& W% V& A            $options =  $this->_parseOptions();, H% f, G9 y, d
            $sql  =   $this->db->parseSql($sql,$options);6 @! t/ v* ?' t+ c1 b
        }elseif(is_array($parse)){ // SQL预处理
" L+ B7 D7 i7 z( l+ [7 }8 h            $sql  = vsprintf($sql,$parse);
- a) {0 h9 `8 u3 r! N* x        }else{
0 d/ Z+ S4 s- E4 `            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
4 C% z9 i0 U- ?9 C4 O        }
2 N  L0 x. }% v7 G        $this->db->setModel($this->name);
( Y' b; w9 A. R; Y  F* a        return $sql;2 L$ V/ E( J6 e4 U
    }% q, b, f# h( X( F- U; m* G+ }

+ z0 a# g( a8 I9 w验证漏洞(举例):
( ^/ u$ n1 P3 k* ?9 O请求地址:
# B8 s) u3 q; `6 z7 Hhttp://localhost/Main?id=boo” or 1=”1+ S1 U* n) |1 K. @- G7 N

# |3 o9 P* K. x% y5 [& i2 Xhttp://localhost/Main?id=boo%22%20or%201=%221: ~. ?% e1 z4 E8 f( U
action代码:
% k" B* ^" S4 B$model=M('Peipeidui');2 `! r& i  c; L% o' o- N
        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);
1 h! M2 ^% f* m7 W) P# O: C        dump($m);exit;& l5 @* e' |& |# f' y0 P
或者8 F2 L3 U  Q& O0 F  d8 }5 m. Y
$model=M('Peipeidui');; I3 J- P/ s! |7 K" ]/ F9 ]* C
        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));
4 B3 R! b+ d8 @! I* E- J* `6 q        dump($m);exit;3 O/ z% t8 i, q  c. _. A
结果:
1 C9 M; B! W( @1 h  Y& ~. Y表peipeidui所有数据被列出,SQL注入语句起效.5 K% r5 |. q$ T( c/ c' c7 O
解决办法:
( {3 `% G: s$ H- b; s" C2 A8 s8 ?将parseSql函数修改为:
+ r/ ]5 _" P, F/ n2 gprotected function parseSql($sql,$parse) {( ]1 a: [& Z4 e; J4 b5 a6 M  Q# X
        // 分析表达式6 _  F" l- B0 C* B+ H+ ^  Q  w
        if(true === $parse) {% y' N; I6 ?8 l; D( j; R1 S$ [
            $options =  $this->_parseOptions();8 k. g( A/ Q1 O" \
            $sql  =   $this->db->parseSql($sql,$options);5 B& F: ^6 o' q* w
        }elseif(is_array($parse)){ // SQL预处理7 F. z' Y; j! \$ n0 F
            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码
8 D9 p  l) g9 r            $sql  = vsprintf($sql,$parse);( m5 o+ C2 q0 \7 o
        }else{
- T) b, {4 Z1 I! _/ C            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));; E1 E- D- n) n- l: N  }3 `& C
        }
% [  R: ^: D7 ?1 A4 o, _; J6 q6 U        $this->db->setModel($this->name);
7 R* j- g3 ]  k, q: H- \  Z% n0 J. ?' x        return $sql;: x# r7 K) k8 O/ b
    }  ~% r& @' S2 _7 W1 q
$ m+ z5 `( ?: W" Y9 [' r4 P
总结:- w) E' O' L* E2 G+ t
不要过分依赖TP的底层SQL过滤,程序员要做好安全检查/ b( Z. O2 J6 t( O0 h
不建议直接用$_GET,$_POST% t9 e. p) Y  y$ H8 h- P2 a' ~- S
[/td][/tr]6 Y+ U' T% q( D
[/table]+1+ q! Y/ d, U3 R8 R' ~2 ]6 l
% _7 ]  \  f5 b' @% g
3 v* K9 I; @& S
回复

使用道具 举报

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

本版积分规则

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