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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。
+ n; N* [: h& D# h. m1 |ThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件
, P$ J: A+ u/ y+ J" g! O根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)) a: B3 l0 d7 M/ A, X+ h
使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:
+ D: e6 a& m% L1 ^: u& b; S% ^$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();
  L0 E% e: k- p6 o. d. g- ]* d: M4 K+ h3 y/ _# o
或者  Q" ?6 w1 A8 Q+ T
$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();) w! K+ t/ X. P7 M

- Z  j  K1 E$ @ 但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):
+ N2 I+ z* z( ~+ p' ^, V8 O* ~$model->query('select * from user where id=%d and status=%s',$id,$status);5 `; ^5 L" q$ I6 o* a0 \- T

  B/ W8 q% H* c或者* a9 X" b% t8 m& d/ H# K; ?; y. x1 ?
$model->query('select * from user where id=%d and status=%s',array($id,$status));) J  \; e2 {8 m
# f! p2 }, l6 O1 R9 L+ I
原因:/ o3 Q& T0 E4 X8 @" ?  |
ThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.
" D& s# {# e( q" c8 |原函数:* }0 {: K* y2 d" d) d% U! e
protected function parseSql($sql,$parse) {+ `- C. ^1 K( O- j7 e1 I) A
        // 分析表达式' T% u( Y+ a+ w/ |0 X0 F% ?
        if(true === $parse) {* s8 u" M9 _9 f. U" q; N0 x0 Z
            $options =  $this->_parseOptions();# J+ Y- e6 y8 d9 {7 p% L! n
            $sql  =   $this->db->parseSql($sql,$options);$ |* Q# Y  V" Q) ?* Q' }6 C
        }elseif(is_array($parse)){ // SQL预处理
$ z* k) U! N+ h6 z5 @            $sql  = vsprintf($sql,$parse);
- C1 o) ~" I  s: X& M; R0 d5 G8 s        }else{. t- w2 f: `) K) e! }* t' K  H
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
7 I) d2 ~% e  C& m        }
. B0 P  _- k6 [; N4 H; Y        $this->db->setModel($this->name);
( K1 y% d$ x, n6 j9 R7 {; ]        return $sql;
" d+ A: |. {) o& m    }/ U. w6 |- u9 n) r
) S# H4 L- ]/ L0 v, b7 l
验证漏洞(举例):
7 \, D; \6 K0 b5 H$ X. `0 f! ?请求地址:
! W/ h7 [' q; M% D6 I9 Ihttp://localhost/Main?id=boo” or 1=”1( J% O( W; f; z! f
" a% n7 a5 J- l4 C. E+ S' E6 i
http://localhost/Main?id=boo%22%20or%201=%221* V/ R6 c" d& d& B0 J- M( U
action代码:
, U$ L# B) S: o7 x% m$model=M('Peipeidui');- X' C" e# s- ]& e$ ]
        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);
/ X/ d6 J/ u( Z. q( N& _        dump($m);exit;0 i  k; C2 f. m+ M' d1 C! {; l
或者' R& K, ~7 z  e
$model=M('Peipeidui');. I* n, b1 X7 }" l+ R2 Y
        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));
! J( U7 U6 O: `9 k! o6 E, U: ?$ \+ b        dump($m);exit;
5 D& y- x- |# S3 ]结果:/ }" d2 Z5 F+ D5 _4 w- U" v* q/ m
表peipeidui所有数据被列出,SQL注入语句起效.
7 \0 G" E3 |; m/ A, v: h1 a) m解决办法:
, V: B. y# I, e+ @& j将parseSql函数修改为:
! M9 {% U7 Z3 E% n0 Hprotected function parseSql($sql,$parse) {9 k" I- u# v* w
        // 分析表达式
  N* ^; r% F) s        if(true === $parse) {7 f8 W$ g; W5 w# ?
            $options =  $this->_parseOptions();+ ^/ i1 g) V& r3 v* M* [
            $sql  =   $this->db->parseSql($sql,$options);. H) p" O$ }0 B: A" V4 ?
        }elseif(is_array($parse)){ // SQL预处理2 H9 G7 f0 s- x
            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码2 i4 M/ r& e: I4 C: {
            $sql  = vsprintf($sql,$parse);
& i% W+ }; d* B" o/ E0 I! t/ U        }else{  d8 n( ~' K% L9 B. i( l9 W
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
$ V' g7 A+ t( g' p' ?) {7 W" x3 Y        }
0 `0 r- H2 H) K        $this->db->setModel($this->name);6 A  H6 Q! Q) i9 K; G/ N
        return $sql;
( Q) x" a8 _/ |! U: K; c+ h. A' V    }
2 l1 k# K  S2 H5 B4 Z
! W/ g; \5 ?4 a9 ^6 B% ^总结:
% ?; X& C- F% ?$ ?不要过分依赖TP的底层SQL过滤,程序员要做好安全检查
8 H  v% ~( b( u  [* x) n3 y4 |不建议直接用$_GET,$_POST
( T7 f0 }0 a: `7 B[/td][/tr]$ K. q# T* |" e$ Y
[/table]+1
3 q5 A7 q' {, s# ^0 j% u
0 l. D; r( h# P0 T
) T+ @4 B. e% \5 `% o) V7 U
回复

使用道具 举报

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

本版积分规则

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