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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。
; F. h8 i% U! O% O2 `* [% a' VThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件2 y, t/ x, i! l5 C% R- v0 E
根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)
3 O2 f# n) _! q7 R使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:  B$ H, b0 n. l; y& d
$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();1 F, N+ e$ d: L! k4 @# D% D
* J* j! M3 M* T0 e
或者
, z8 H4 |- X8 i$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();; L  N+ A; ?* q4 v

) i% G# z- I! b3 t5 ^; @ 但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):
, L+ v5 l8 N5 ]9 x1 h$model->query('select * from user where id=%d and status=%s',$id,$status);
# _9 D' Y. H: E
0 S* ^3 v" k) H6 p$ T6 t9 s. l: X或者
) C* l( x: k% G$ N. b* G9 n8 |& c- J$ k$model->query('select * from user where id=%d and status=%s',array($id,$status));( p  r$ A& R8 y8 x6 x
- b; O6 K! z$ I+ m6 Q! Y+ m
原因:2 L! A1 @/ B# M. [9 k5 \
ThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.
6 G! n+ K! B$ d7 i7 J  Q) l原函数:  J' n! L4 v$ u# f7 z. ^; R; {
protected function parseSql($sql,$parse) {
: p" I, o) G0 R& N4 b, n        // 分析表达式
$ P; ^4 j9 R7 m# y' L0 b        if(true === $parse) {4 k' a& K/ l, j: \. D3 l
            $options =  $this->_parseOptions();6 X4 t2 }0 c  w$ Y8 o
            $sql  =   $this->db->parseSql($sql,$options);
9 e0 o. m) |, q7 |0 F        }elseif(is_array($parse)){ // SQL预处理- g( J! j+ ^, R  v
            $sql  = vsprintf($sql,$parse);
- F1 H1 G* d  v& r$ }* x        }else{: G; s* ]4 x2 y, F) a; s
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));; I) T1 B1 B- Z( c8 G* L
        }
& k: W$ Z4 g2 c# S- z4 \        $this->db->setModel($this->name);
. J- v. e  v+ W3 x        return $sql;( i* ]8 S3 A% a+ Q! s
    }
0 D3 O2 Q. }  V7 }2 e( a. Z$ x. D# s$ s8 m( j& n  l0 p" E' x
验证漏洞(举例):3 j3 Z" c/ [* N6 U% F
请求地址:
: c' I* i+ z7 z8 L% G; h$ Thttp://localhost/Main?id=boo” or 1=”1
- c$ b- \! B$ h# z( P5 H  O# ?* h! D+ ?. X0 e( p$ L  Y
http://localhost/Main?id=boo%22%20or%201=%221
- V; M& t7 e% N7 Laction代码:3 }, r" r& T: v1 W
$model=M('Peipeidui');  m) k9 f8 L$ F, n6 Q( I* r# F6 r
        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);
) F! o4 W7 C; [* G. e: u/ d4 x        dump($m);exit;
9 @' b- [$ Y( A或者
9 F9 \3 `% b+ |/ S: B$model=M('Peipeidui');
- E5 n/ c& e$ w% \, ^        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));
  G0 e8 |. e* v: K0 k& J        dump($m);exit;: m6 Q! C. k; K0 [. T. Y
结果:
! S, C; z; k8 U( z) j! L1 ]表peipeidui所有数据被列出,SQL注入语句起效.. X( W" y6 B& X
解决办法:2 C7 j3 B: `2 T% d
将parseSql函数修改为:
7 i1 @' Q0 V+ y0 X7 `% Cprotected function parseSql($sql,$parse) {
! F  q  w3 ]& H0 C1 t        // 分析表达式& @3 @9 t+ {% h" n5 a! y7 F
        if(true === $parse) {0 ~# V6 ?  t" B
            $options =  $this->_parseOptions();
$ _2 I; I& N2 s            $sql  =   $this->db->parseSql($sql,$options);: X+ [7 }$ P& ]- X1 i7 l  B4 }
        }elseif(is_array($parse)){ // SQL预处理4 w+ u" C/ f9 A- ?
            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码
, n1 ]- }, }1 m+ X            $sql  = vsprintf($sql,$parse);
( {$ d2 a! j( R1 ^6 B: g: w# C! ]        }else{( _3 y0 L* z" h0 p  Y6 G
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));" c: k! ~4 V! p: b- @% z
        }3 J& [( Z! G3 @& Q9 b
        $this->db->setModel($this->name);
3 e2 T9 d* `0 U9 O* d/ ?/ [2 f        return $sql;
( p5 e) n5 K2 n' E; x  f    }2 ^$ O8 J' e- o. x
0 u1 u. R" @6 Z7 P% ~! ]
总结:# D) n& ?9 X- g/ n' b, ]
不要过分依赖TP的底层SQL过滤,程序员要做好安全检查" a' T- _2 s0 v8 o
不建议直接用$_GET,$_POST# P5 K; _5 q9 L, u7 a* T
[/td][/tr]( o+ E1 u4 H( q" C/ `7 C
[/table]+1
, K- ?0 J* @; j: ?
$ z8 b$ i3 s0 k4 Y$ ]  G8 @) Q9 O; a" u. k2 N
回复

使用道具 举报

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

本版积分规则

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