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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。8 _4 H7 h7 p: `2 T+ R
ThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件8 g9 D. M( e3 o3 ~0 Z! G( `* @
根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)
. U, H$ O: L5 Q7 \! Q7 Z, {. `使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:0 C: Q) [6 |# A) ]/ y& j1 }/ t
$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();
; R- C2 Q- K! m( i4 [* }0 e
" {# h: N( X; T6 {4 c6 Z. x 或者1 x2 ^+ c- Y4 g4 m6 O
$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();
7 ~  U: P5 I! X# ?" y  j5 Q" U
但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):1 F1 F7 i9 h, S8 z! K' G3 M: t2 J
$model->query('select * from user where id=%d and status=%s',$id,$status);
2 R# O. v- M( J  [7 J& C9 H) j- g+ N' d: w5 U8 z/ j! ?
或者
' `( [8 V% Y+ }( J7 x$model->query('select * from user where id=%d and status=%s',array($id,$status));
' A- F4 b! e( Q1 X
3 u. n1 S, c. u 原因:* H4 \0 _, e5 ~# y+ y
ThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.
) ~; ^, L# F. x  G1 S: B5 @( G原函数:
, }* j' F* b' x" n6 Q5 Y$ aprotected function parseSql($sql,$parse) {
7 J# w( w3 I7 ~& A0 {4 y1 e        // 分析表达式& }3 w% f" p+ g; k6 Z5 `6 l- J
        if(true === $parse) {
# W2 h5 C( r: J  U            $options =  $this->_parseOptions();
. M6 G$ o1 q$ B4 f' A            $sql  =   $this->db->parseSql($sql,$options);1 X- Q+ [/ p8 U5 p. V2 e
        }elseif(is_array($parse)){ // SQL预处理
- @( h( l: ~/ Z: X4 A- z; M8 @; i            $sql  = vsprintf($sql,$parse);* n  A6 e% w+ ]3 C( B7 {( y
        }else{+ h" v0 E* x( A% v* h2 P
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
% K5 y3 H) N" b- f' z3 S" q        }
2 ]  g6 C$ s4 `; l, g        $this->db->setModel($this->name);0 n  H" x- _1 [! `: R
        return $sql;& S0 J$ M" v' I+ C0 k' y
    }( H- c- h3 I' D9 q

$ C- ^  Z# U6 C' `验证漏洞(举例):
5 ?8 B5 t- L. Z7 \/ [8 k" Q请求地址:8 V8 \! P( y7 O2 A2 N
http://localhost/Main?id=boo” or 1=”10 U2 p0 ]9 k, }

3 v# v9 ?* n4 o, h; Y5 R1 @http://localhost/Main?id=boo%22%20or%201=%221
. S/ g" P5 B+ r  f* T8 ?* V! kaction代码:
6 ^$ I( d6 ]- ?/ e. B$model=M('Peipeidui');* f5 X! K9 x2 _' T
        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);4 E% a% |9 c- _; i; Z! P
        dump($m);exit;
7 v3 U  k; a: u' r( p8 Y或者$ T0 \+ z$ B0 V. E) q3 D) R
$model=M('Peipeidui');, `& K! l1 Z, E4 Q
        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));
$ q5 t' }2 g3 r! g        dump($m);exit;
9 ?0 j  P+ W% p结果:! ^; q- a- \) _% @: U
表peipeidui所有数据被列出,SQL注入语句起效.
; b/ c4 L5 d, w7 K解决办法:3 b$ v7 |8 B' t2 \$ ~
将parseSql函数修改为:) {! B+ q+ \! [2 t- R6 a
protected function parseSql($sql,$parse) {+ s2 D/ [( C! A2 D6 Z9 Z4 C" y2 F# {
        // 分析表达式- x6 j$ V: o  P! {' N
        if(true === $parse) {0 x& u" I/ f( v$ p- K# s3 a
            $options =  $this->_parseOptions();$ E# a6 r9 T. h- S' [5 k( Q
            $sql  =   $this->db->parseSql($sql,$options);$ f8 |; z& A5 U6 a9 \, m
        }elseif(is_array($parse)){ // SQL预处理& i8 k' t- N6 s. q* S
            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码6 j4 ^9 O1 p/ C( z5 _
            $sql  = vsprintf($sql,$parse);
9 }! T# o1 o( b' e8 G6 C        }else{: \2 _+ R! {: E" g
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
; M& |+ f; _0 b9 _- {  X1 P$ Q        }* w; A$ L2 f) Q6 a; w
        $this->db->setModel($this->name);* E0 a7 S8 g' H, ]5 A) b7 S
        return $sql;, p2 m/ d9 A% p/ v2 T. T# m0 t
    }
- R. X$ Q& u" q5 ~3 `* d$ D4 \) ^4 W3 q9 D" ?. D6 d
总结:7 M" a' x$ F1 Y$ v% `
不要过分依赖TP的底层SQL过滤,程序员要做好安全检查% Y' R, g7 f# d2 f2 _! Z6 W6 q
不建议直接用$_GET,$_POST- L, ^5 |; m0 b( a
[/td][/tr]
* L; C1 z4 Q5 R5 A: I[/table]+1& n5 c' k/ y" x. z! A( I# ~5 W' e
0 i, k  u9 ~7 P7 J- A3 ]

) m  m1 w0 W  G8 h
回复

使用道具 举报

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

本版积分规则

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